[exim-cvs] Debug: expansion conditions, hints deletes, retry…

Αρχική Σελίδα
Delete this message
Reply to this message
Συντάκτης: Exim Git Commits Mailing List
Ημερομηνία:  
Προς: exim-cvs
Αντικείμενο: [exim-cvs] Debug: expansion conditions, hints deletes, retry deletes
Gitweb: https://git.exim.org/exim.git/commitdiff/0e4b2a6e28fec7514397d4341c6c4e4190523e2c
Commit:     0e4b2a6e28fec7514397d4341c6c4e4190523e2c
Parent:     7482553d06b156505e38b4cb1b72324bcfb62b37
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Fri Jul 26 13:03:27 2024 +0100
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Fri Jul 26 19:07:52 2024 +0100

    Debug: expansion conditions, hints deletes, retry deletes
---
 src/src/dbfn.c   |   7 +-
 src/src/expand.c | 106 +++++++++--------
 src/src/retry.c  |   4 +-
 test/stderr/0002 | 227 +++++++++++++++++++------------------
 test/stderr/0092 |  21 ++--
 test/stderr/0169 |   2 +-
 test/stderr/0357 |  12 +-
 test/stderr/0358 |  12 +-
 test/stderr/0402 |  10 ++
 test/stderr/0499 |  32 +++---
 test/stderr/0544 | 115 ++++++++++---------
 test/stderr/0554 |  10 +-
 test/stderr/0632 | 210 +++++++++++++++++++---------------
 test/stderr/3400 |   6 +-
 test/stderr/5410 | 340 +++++++++++++++++++++++++++++++------------------------
 test/stderr/5420 | 340 +++++++++++++++++++++++++++++++------------------------
 16 files changed, 800 insertions(+), 654 deletions(-)

diff --git a/src/src/dbfn.c b/src/src/dbfn.c
index 1044611cc..b9eef503f 100644
--- a/src/src/dbfn.c
+++ b/src/src/dbfn.c
@@ -538,7 +538,7 @@ Returns: the yield of the underlying dbm or db "delete" function.
 int
 dbfn_delete(open_db *dbblock, const uschar *key)
 {
-int klen = Ustrlen(key) + 1;
+int klen = Ustrlen(key) + 1, rc;
 uschar * key_copy = store_get(klen, key);
 EXIM_DATUM key_datum;
 
@@ -548,7 +548,10 @@ memcpy(key_copy, key, klen);
 exim_datum_init(&key_datum);         /* Some DBM libraries require clearing */
 exim_datum_data_set(&key_datum, key_copy);
 exim_datum_size_set(&key_datum, klen);
-return exim_dbdel(dbblock->dbptr, &key_datum);
+rc = exim_dbdel(dbblock->dbptr, &key_datum);
+DEBUG(D_hints_lookup) if (rc != EXIM_DBPUTB_OK)
+  debug_printf_indent(" exim_dbdel: fail\n");
+return rc;
 }
 
 
diff --git a/src/src/expand.c b/src/src/expand.c
index ca9c7c3ac..cc8b12224 100644
--- a/src/src/expand.c
+++ b/src/src/expand.c
@@ -2487,6 +2487,7 @@ if (!name[0])
     "but found \"%.16s\"", s);
   return -1;
   }
+DEBUG(D_expand) debug_printf_indent("cond: %s\n", name);
 if (opname)
   *opname = string_copy(name);
 
@@ -2639,19 +2640,18 @@ Returns:   a pointer to the first character after the condition, or
 static const uschar *
 eval_condition(const uschar * s, BOOL * resetok, BOOL * yield)
 {
-BOOL testfor = TRUE;
-BOOL tempcond, combined_cond;
+BOOL testfor = TRUE, tempcond, combined_cond;
 BOOL * subcondptr;
-BOOL sub2_honour_dollar = TRUE;
-BOOL is_forany, is_json, is_jsons;
+BOOL sub2_honour_dollar = TRUE, is_forany, is_json, is_jsons;
 int rc, cond_type;
 int_eximarith_t num[2];
 struct stat statbuf;
 uschar * opname;
 uschar name[256];
-const uschar * sub[10];
+const uschar * sub[10], * next;
 unsigned sub_textonly = 0;
 
+expand_level++;
 for (;;)
   if (Uskip_whitespace(&s) == '!') { testfor = !testfor; s++; } else break;
 
@@ -2667,7 +2667,7 @@ switch(cond_type = identify_operator(&s, &opname))
     if (*s != ':')
       {
       expand_string_message = US"\":\" expected after \"def\"";
-      return NULL;
+      goto failout;
       }
 
     s = read_name(name, sizeof(name), s+1, US"_");
@@ -2701,12 +2701,12 @@ switch(cond_type = identify_operator(&s, &opname))
       ? string_sprintf("unknown variable \"%s\" after \"def:\"", name)
       : US"variable name omitted after \"def:\"";
     check_variable_error_message(name);
-    return NULL;
+    goto failout;
     }
       if (yield) *yield = (t[0] != 0) == testfor;
       }
 
-    return s;
+    next = s; goto out;
     }
 
 
@@ -2714,14 +2714,14 @@ switch(cond_type = identify_operator(&s, &opname))
 
   case ECOND_FIRST_DELIVERY:
   if (yield) *yield = f.deliver_firsttime == testfor;
-  return s;
+  next = s; goto out;
 
 
   /* queue_running tests for any process started by a queue runner */
 
   case ECOND_QUEUE_RUNNING:
   if (yield) *yield = (queue_run_pid != (pid_t)0) == testfor;
-  return s;
+  next = s; goto out;
 
 
   /* exists:  tests for file existence
@@ -2750,13 +2750,13 @@ switch(cond_type = identify_operator(&s, &opname))
     sub[0] = expand_string_internal(s+1,
       ESI_BRACE_ENDS | ESI_HONOR_DOLLAR | (yield ? ESI_NOFLAGS : ESI_SKIPPING),
       &s, resetok, &textonly);
-    if (!sub[0]) return NULL;
+    if (!sub[0]) goto failout;
     if (textonly) sub_textonly |= BIT(0);
    }
   /* {-for-text-editors */
   if (*s++ != '}') goto COND_FAILED_CURLY_END;
 
-  if (!yield) return s;   /* No need to run the test if skipping */
+  if (!yield) { next = s; goto out; }  /* No need to run the test if skipping */
 
   switch(cond_type)
     {
@@ -2764,7 +2764,7 @@ switch(cond_type = identify_operator(&s, &opname))
     if ((expand_forbid & RDO_EXISTS) != 0)
       {
       expand_string_message = US"File existence tests are not permitted";
-      return NULL;
+      goto failout;
       }
     *yield = (Ustat(sub[0], &statbuf) == 0) == testfor;
     break;
@@ -2830,11 +2830,11 @@ switch(cond_type = identify_operator(&s, &opname))
     #if defined(SUPPORT_PAM) || defined(RADIUS_CONFIG_FILE) || \
         defined(LOOKUP_LDAP) || defined(CYRUS_PWCHECK_SOCKET)
     END_AUTH:
-    if (rc == ERROR || rc == DEFER) return NULL;
+    if (rc == ERROR || rc == DEFER) goto failout;
     *yield = (rc == OK) == testfor;
     #endif
     }
-  return s;
+  next = s; goto out;
 
 
   /* call ACL (in a conditional context).  Accept true, deny false.
@@ -2863,7 +2863,7 @@ switch(cond_type = identify_operator(&s, &opname))
       case 1: expand_string_message = US"too few arguments or bracketing "
         "error for acl";
       case 2:
-      case 3: return NULL;
+      case 3: goto failout;
       }
 
     if (yield)
@@ -2887,10 +2887,10 @@ switch(cond_type = identify_operator(&s, &opname))
     default:
           expand_string_message = string_sprintf("%s from acl \"%s\"",
         rc_names[rc], sub[0]);
-      return NULL;
+      goto failout;
     }
       }
-    return s;
+    next = s; goto out;
     }
 
 
@@ -2915,17 +2915,17 @@ switch(cond_type = identify_operator(&s, &opname))
       case 1: expand_string_message = US"too few arguments or bracketing "
     "error for saslauthd";
       case 2:
-      case 3: return NULL;
+      case 3: goto failout;
       }
     if (!sub[2]) sub[3] = NULL;  /* realm if no service */
     if (yield)
       {
       int rc = auth_call_saslauthd(sub[0], sub[1], sub[2], sub[3],
     &expand_string_message);
-      if (rc == ERROR || rc == DEFER) return NULL;
+      if (rc == ERROR || rc == DEFER) goto failout;
       *yield = (rc == OK) == testfor;
       }
-    return s;
+    next = s; goto out;
     }
 #endif /* CYRUS_SASLAUTHD_SOCKET */
 
@@ -2994,10 +2994,10 @@ switch(cond_type = identify_operator(&s, &opname))
       if (i == 0) goto COND_FAILED_CURLY_START;
       expand_string_message = string_sprintf("missing 2nd string in {} "
         "after \"%s\"", opname);
-      return NULL;
+      goto failout;
       }
     if (!(sub[i] = expand_string_internal(s+1, flags, &s, resetok, &textonly)))
-      return NULL;
+      goto failout;
     if (textonly) sub_textonly |= BIT(i);
     DEBUG(D_expand) if (i == 1 && !sub2_honour_dollar && Ustrchr(sub[1], '$'))
       debug_printf_indent("WARNING: the second arg is NOT expanded,"
@@ -3018,13 +3018,13 @@ switch(cond_type = identify_operator(&s, &opname))
       else
         {
         num[i] = expanded_string_integer(sub[i], FALSE);
-        if (expand_string_message) return NULL;
+        if (expand_string_message) goto failout;
         }
     }
 
   /* Result not required */
 
-  if (!yield) return s;
+  if (!yield) { next = s; goto out; }
 
   /* Do an appropriate comparison */
 
@@ -3082,7 +3082,7 @@ switch(cond_type = identify_operator(&s, &opname))
           sub_textonly & BIT(1) ? MCS_CACHEABLE : MCS_NOFLAGS,
           &expand_string_message, pcre_gen_cmp_ctx);
       if (!re)
-    return NULL;
+    goto failout;
 
       tempcond = regex_match_and_setup(re, sub[0], 0, -1);
       break;
@@ -3103,7 +3103,7 @@ switch(cond_type = identify_operator(&s, &opname))
     {
     expand_string_message = string_sprintf("\"%s\" is not an IP address",
       sub[0]);
-    return NULL;
+    goto failout;
     }
       else
     {
@@ -3147,7 +3147,7 @@ switch(cond_type = identify_operator(&s, &opname))
     case DEFER:
       expand_string_message = string_sprintf("unable to complete match "
         "against \"%s\": %s", sub[1], search_error_message);
-      return NULL;
+      goto failout;
     }
 
       break;
@@ -3256,7 +3256,7 @@ switch(cond_type = identify_operator(&s, &opname))
       {
       expand_string_message = string_sprintf("unknown encryption mechanism "
         "in \"%s\"", sub[1]);
-      return NULL;
+      goto failout;
       }
 
     switch(which)
@@ -3287,7 +3287,7 @@ switch(cond_type = identify_operator(&s, &opname))
       {
       expand_string_message = string_sprintf("crypt error: %s\n",
         US strerror(errno));
-      return NULL;
+      goto failout;
       }
     }
       break;
@@ -3323,7 +3323,7 @@ switch(cond_type = identify_operator(&s, &opname))
     }   /* Switch for comparison conditions */
 
   *yield = tempcond == testfor;
-  return s;    /* End of comparison conditions */
+  next = s; goto out;    /* End of comparison conditions */
 
 
   /* and/or: computes logical and/or of several conditions */
@@ -3344,14 +3344,14 @@ switch(cond_type = identify_operator(&s, &opname))
       {
       expand_string_message = string_sprintf("each subcondition "
         "inside an \"%s{...}\" condition must be in its own {}", opname);
-      return NULL;
+      goto failout;
       }
 
     if (!(s = eval_condition(s+1, resetok, subcondptr)))
       {
       expand_string_message = string_sprintf("%s inside \"%s{...}\" condition",
         expand_string_message, opname);
-      return NULL;
+      goto failout;
       }
     Uskip_whitespace(&s);
 
@@ -3361,7 +3361,7 @@ switch(cond_type = identify_operator(&s, &opname))
       /* {-for-text-editors */
       expand_string_message = string_sprintf("missing } at end of condition "
         "inside \"%s\" group", opname);
-      return NULL;
+      goto failout;
       }
 
     if (yield)
@@ -3378,7 +3378,7 @@ switch(cond_type = identify_operator(&s, &opname))
     }
 
   if (yield) *yield = (combined_cond == testfor);
-  return ++s;
+  next = ++s; goto out;
 
 
   /* forall/forany: iterates a condition with different values */
@@ -3403,7 +3403,7 @@ switch(cond_type = identify_operator(&s, &opname))
     if (!(sub[0] = expand_string_internal(s,
       ESI_BRACE_ENDS | ESI_HONOR_DOLLAR | (yield ? ESI_NOFLAGS : ESI_SKIPPING),
       &s, resetok, NULL)))
-      return NULL;
+      goto failout;
     /* {-for-text-editors */
     if (*s++ != '}') goto COND_FAILED_CURLY_END;
 
@@ -3420,7 +3420,7 @@ switch(cond_type = identify_operator(&s, &opname))
       {
       expand_string_message = string_sprintf("%s inside \"%s\" condition",
         expand_string_message, opname);
-      return NULL;
+      goto failout;
       }
     Uskip_whitespace(&s);
 
@@ -3430,7 +3430,7 @@ switch(cond_type = identify_operator(&s, &opname))
       /* {-for-text-editors */
       expand_string_message = string_sprintf("missing } at end of condition "
         "inside \"%s\"", opname);
-      return NULL;
+      goto failout;
       }
 
     if (yield) *yield = !testfor;
@@ -3446,7 +3446,7 @@ switch(cond_type = identify_operator(&s, &opname))
         string_sprintf("%s wrapping string result for extract jsons",
           expand_string_message);
       iterate_item = save_iterate_item;
-      return NULL;
+      goto failout;
       }
 
       DEBUG(D_expand) debug_printf_indent("%s: $item = \"%s\"\n", opname, iterate_item);
@@ -3455,7 +3455,7 @@ switch(cond_type = identify_operator(&s, &opname))
         expand_string_message = string_sprintf("%s inside \"%s\" condition",
           expand_string_message, opname);
         iterate_item = save_iterate_item;
-        return NULL;
+        goto failout;
         }
       DEBUG(D_expand) debug_printf_indent("%s: condition evaluated to %s\n", opname,
         tempcond? "true":"false");
@@ -3465,7 +3465,7 @@ switch(cond_type = identify_operator(&s, &opname))
       }
 
     iterate_item = save_iterate_item;
-    return s;
+    next = s; goto out;
     }
 
 
@@ -3498,7 +3498,7 @@ switch(cond_type = identify_operator(&s, &opname))
                   ourname);
       /*FALLTHROUGH*/
       case 2:
-      case 3: return NULL;
+      case 3: goto failout;
       }
     t = sub_arg[0];
     Uskip_whitespace(&t);
@@ -3539,12 +3539,12 @@ switch(cond_type = identify_operator(&s, &opname))
       {
       expand_string_message = string_sprintf("unrecognised boolean "
        "value \"%s\"", t);
-      return NULL;
+      goto failout;
       }
     DEBUG(D_expand) debug_printf_indent("%s: condition evaluated to %s\n", ourname,
         boolvalue? "true":"false");
     if (yield) *yield = (boolvalue == testfor);
-    return s;
+    next = s; goto out;
     }
 
 #ifdef SUPPORT_SRS
@@ -3565,7 +3565,7 @@ switch(cond_type = identify_operator(&s, &opname))
       case 1: expand_string_message = US"too few arguments or bracketing "
     "error for inbound_srs";
       case 2:
-      case 3: return NULL;
+      case 3: goto failout;
       }
 
     /* Match the given local_part against the SRS-encoded pattern */
@@ -3650,7 +3650,7 @@ switch(cond_type = identify_operator(&s, &opname))
 srs_result:
     /* pcre2_match_data_free(md);    gen ctx needs no free */
     if (yield) *yield = (boolvalue == testfor);
-    return s;
+    next = s; goto out;
     }
 #endif /*SUPPORT_SRS*/
 
@@ -3659,19 +3659,19 @@ srs_result:
   default:
     if (!expand_string_message || !*expand_string_message)
       expand_string_message = string_sprintf("unknown condition \"%s\"", opname);
-    return NULL;
+    goto failout;
   }   /* End switch on condition type */
 
 /* Missing braces at start and end of data */
 
 COND_FAILED_CURLY_START:
 expand_string_message = string_sprintf("missing { after \"%s\"", opname);
-return NULL;
+goto failout;
 
 COND_FAILED_CURLY_END:
 expand_string_message = string_sprintf("missing } at end of \"%s\" condition",
   opname);
-return NULL;
+goto failout;
 
 /* A condition requires code that is not compiled */
 
@@ -3681,8 +3681,14 @@ return NULL;
 COND_FAILED_NOT_COMPILED:
 expand_string_message = string_sprintf("support for \"%s\" not compiled",
   opname);
-return NULL;
+goto failout;
 #endif
+
+failout:
+  next = NULL;
+out:
+  expand_level--;
+  return next;
 }
 
 
diff --git a/src/src/retry.c b/src/src/retry.c
index c32bd85b7..6e4a3459d 100644
--- a/src/src/retry.c
+++ b/src/src/retry.c
@@ -351,7 +351,9 @@ rti->flags = flags;
 DEBUG(D_transport|D_retry)
   {
   int letter = rti->more_errno & 255;
-  debug_printf("added retry item for %s: errno=%d more_errno=", rti->key,
+  debug_printf("added retry %sitem for %s: errno=%d more_errno=",
+    flags & rf_delete ? "delete-" : "",
+    rti->key,
     rti->basic_errno);
   if (letter == 'A' || letter == 'M')
     debug_printf("%d,%c", (rti->more_errno >> 8) & 255, letter);
diff --git a/test/stderr/0002 b/test/stderr/0002
index 2b8eed427..0632de146 100644
--- a/test/stderr/0002
+++ b/test/stderr/0002
@@ -25,19 +25,20 @@ try option unknown_login
  ╭considering: match:░░${if░match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
  ├───────text: match:░░
  ├considering: ${if░match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  ╭considering: abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  ├───────text: abcd
-  ├considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  ├───expanded: abcd
-  ╰─────result: abcd
-  ╭considering: \N^([ab]+)(\w+)$\N}{$2$1}fail}
-  ├──protected: ^([ab]+)(\w+)$
-  ├considering: }{$2$1}fail}
-  ├───expanded: \N^([ab]+)(\w+)$\N
-  ╰─────result: ^([ab]+)(\w+)$
- compiled RE '^([ab]+)(\w+)$' not found in local cache
- compiling RE '^([ab]+)(\w+)$'
- compiled RE '^([ab]+)(\w+)$' saved in local cache
+  cond: match
+   ╭considering: abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
+   ├───────text: abcd
+   ├considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail}
+   ├───expanded: abcd
+   ╰─────result: abcd
+   ╭considering: \N^([ab]+)(\w+)$\N}{$2$1}fail}
+   ├──protected: ^([ab]+)(\w+)$
+   ├considering: }{$2$1}fail}
+   ├───expanded: \N^([ab]+)(\w+)$\N
+   ╰─────result: ^([ab]+)(\w+)$
+  compiled RE '^([ab]+)(\w+)$' not found in local cache
+  compiling RE '^([ab]+)(\w+)$'
+  compiled RE '^([ab]+)(\w+)$' saved in local cache
  ├──condition: match{abcd}{\N^([ab]+)(\w+)$\N}
  ├─────result: true
   ╭considering: $2$1}fail}
@@ -53,17 +54,18 @@ try option unknown_login
  ╭considering: match:░░${if░match{wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
  ├───────text: match:░░
  ├considering: ${if░match{wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  ╭considering: wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  ├───────text: wxyz
-  ├considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  ├───expanded: wxyz
-  ╰─────result: wxyz
-  ╭considering: \N^([ab]+)(\w+)$\N}{$2$1}fail}
-  ├──protected: ^([ab]+)(\w+)$
-  ├considering: }{$2$1}fail}
-  ├───expanded: \N^([ab]+)(\w+)$\N
-  ╰─────result: ^([ab]+)(\w+)$
- compiled RE '^([ab]+)(\w+)$' found in local cache
+  cond: match
+   ╭considering: wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
+   ├───────text: wxyz
+   ├considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail}
+   ├───expanded: wxyz
+   ╰─────result: wxyz
+   ╭considering: \N^([ab]+)(\w+)$\N}{$2$1}fail}
+   ├──protected: ^([ab]+)(\w+)$
+   ├considering: }{$2$1}fail}
+   ├───expanded: \N^([ab]+)(\w+)$\N
+   ╰─────result: ^([ab]+)(\w+)$
+  compiled RE '^([ab]+)(\w+)$' found in local cache
  ├──condition: match{wxyz}{\N^([ab]+)(\w+)$\N}
  ├─────result: false
   ╭───scanning: $2$1}fail}
@@ -76,16 +78,17 @@ try option unknown_login
  ├───error message: "if" failed and "fail" requested
  ╰failure was forced
  ╭considering: ${if░eq░{1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  ╭considering: 1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  ├───────text: 1
-  ├considering: }{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  ├───expanded: 1
-  ╰─────result: 1
-  ╭considering: 1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  ├───────text: 1
-  ├considering: }{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  ├───expanded: 1
-  ╰─────result: 1
+  cond: eq
+   ╭considering: 1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
+   ├───────text: 1
+   ├considering: }{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
+   ├───expanded: 1
+   ╰─────result: 1
+   ╭considering: 1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
+   ├───────text: 1
+   ├considering: }{yes}{${lookup{xx}lsearch{/non/exist}}}}
+   ├───expanded: 1
+   ╰─────result: 1
  ├──condition: eq░{1}{1}
  ├─────result: true
   ╭considering: yes}{${lookup{xx}lsearch{/non/exist}}}}
@@ -115,19 +118,20 @@ try option unknown_login
  ╭considering: match_address:░░░${if░match_address{a.b.c}{a.b.c}{yes}{no}}
  ├───────text: match_address:░░░
  ├considering: ${if░match_address{a.b.c}{a.b.c}{yes}{no}}
-  ╭considering: a.b.c}{a.b.c}{yes}{no}}
-  ├───────text: a.b.c
-  ├considering: }{a.b.c}{yes}{no}}
-  ├───expanded: a.b.c
-  ╰─────result: a.b.c
-  ╭considering: a.b.c}{yes}{no}}
-  ├───────text: a.b.c
-  ├considering: }{yes}{no}}
-  ├───expanded: a.b.c
-  ╰─────result: a.b.c
+  cond: match_address
+   ╭considering: a.b.c}{a.b.c}{yes}{no}}
+   ├───────text: a.b.c
+   ├considering: }{a.b.c}{yes}{no}}
+   ├───expanded: a.b.c
+   ╰─────result: a.b.c
+   ╭considering: a.b.c}{yes}{no}}
+   ├───────text: a.b.c
+   ├considering: }{yes}{no}}
+   ├───expanded: a.b.c
+   ╰─────result: a.b.c
 LOG: MAIN PANIC
   no @ found in the subject of an address list match: subject="a.b.c" pattern="a.b.c"
- a.b.c in "a.b.c"? no (end of list)
+  a.b.c in "a.b.c"? no (end of list)
  ├──condition: match_address{a.b.c}{a.b.c}
  ├─────result: false
   ╭───scanning: yes}{no}}
@@ -179,19 +183,20 @@ try option unknown_login
  /considering: match:  ${if match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
  |-------text: match:  
  |considering: ${if match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  /considering: abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  |-------text: abcd
-  |considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  |---expanded: abcd
-  \_____result: abcd
-  /considering: \N^([ab]+)(\w+)$\N}{$2$1}fail}
-  |--protected: ^([ab]+)(\w+)$
-  |considering: }{$2$1}fail}
-  |---expanded: \N^([ab]+)(\w+)$\N
-  \_____result: ^([ab]+)(\w+)$
- compiled RE '^([ab]+)(\w+)$' not found in local cache
- compiling RE '^([ab]+)(\w+)$'
- compiled RE '^([ab]+)(\w+)$' saved in local cache
+  cond: match
+   /considering: abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
+   |-------text: abcd
+   |considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail}
+   |---expanded: abcd
+   \_____result: abcd
+   /considering: \N^([ab]+)(\w+)$\N}{$2$1}fail}
+   |--protected: ^([ab]+)(\w+)$
+   |considering: }{$2$1}fail}
+   |---expanded: \N^([ab]+)(\w+)$\N
+   \_____result: ^([ab]+)(\w+)$
+  compiled RE '^([ab]+)(\w+)$' not found in local cache
+  compiling RE '^([ab]+)(\w+)$'
+  compiled RE '^([ab]+)(\w+)$' saved in local cache
  |--condition: match{abcd}{\N^([ab]+)(\w+)$\N}
  |-----result: true
   /considering: $2$1}fail}
@@ -207,17 +212,18 @@ try option unknown_login
  /considering: match:  ${if match{wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
  |-------text: match:  
  |considering: ${if match{wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  /considering: wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  |-------text: wxyz
-  |considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail}
-  |---expanded: wxyz
-  \_____result: wxyz
-  /considering: \N^([ab]+)(\w+)$\N}{$2$1}fail}
-  |--protected: ^([ab]+)(\w+)$
-  |considering: }{$2$1}fail}
-  |---expanded: \N^([ab]+)(\w+)$\N
-  \_____result: ^([ab]+)(\w+)$
- compiled RE '^([ab]+)(\w+)$' found in local cache
+  cond: match
+   /considering: wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail}
+   |-------text: wxyz
+   |considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail}
+   |---expanded: wxyz
+   \_____result: wxyz
+   /considering: \N^([ab]+)(\w+)$\N}{$2$1}fail}
+   |--protected: ^([ab]+)(\w+)$
+   |considering: }{$2$1}fail}
+   |---expanded: \N^([ab]+)(\w+)$\N
+   \_____result: ^([ab]+)(\w+)$
+  compiled RE '^([ab]+)(\w+)$' found in local cache
  |--condition: match{wxyz}{\N^([ab]+)(\w+)$\N}
  |-----result: false
   /---scanning: $2$1}fail}
@@ -230,16 +236,17 @@ try option unknown_login
  |---error message: "if" failed and "fail" requested
  \failure was forced
  /considering: ${if eq {1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  /considering: 1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  |-------text: 1
-  |considering: }{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  |---expanded: 1
-  \_____result: 1
-  /considering: 1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  |-------text: 1
-  |considering: }{yes}{${lookup{xx}lsearch{/non/exist}}}}
-  |---expanded: 1
-  \_____result: 1
+  cond: eq
+   /considering: 1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
+   |-------text: 1
+   |considering: }{1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
+   |---expanded: 1
+   \_____result: 1
+   /considering: 1}{yes}{${lookup{xx}lsearch{/non/exist}}}}
+   |-------text: 1
+   |considering: }{yes}{${lookup{xx}lsearch{/non/exist}}}}
+   |---expanded: 1
+   \_____result: 1
  |--condition: eq {1}{1}
  |-----result: true
   /considering: yes}{${lookup{xx}lsearch{/non/exist}}}}
@@ -269,19 +276,20 @@ try option unknown_login
  /considering: match_address:   ${if match_address{a.b.c}{a.b.c}{yes}{no}}
  |-------text: match_address:   
  |considering: ${if match_address{a.b.c}{a.b.c}{yes}{no}}
-  /considering: a.b.c}{a.b.c}{yes}{no}}
-  |-------text: a.b.c
-  |considering: }{a.b.c}{yes}{no}}
-  |---expanded: a.b.c
-  \_____result: a.b.c
-  /considering: a.b.c}{yes}{no}}
-  |-------text: a.b.c
-  |considering: }{yes}{no}}
-  |---expanded: a.b.c
-  \_____result: a.b.c
+  cond: match_address
+   /considering: a.b.c}{a.b.c}{yes}{no}}
+   |-------text: a.b.c
+   |considering: }{a.b.c}{yes}{no}}
+   |---expanded: a.b.c
+   \_____result: a.b.c
+   /considering: a.b.c}{yes}{no}}
+   |-------text: a.b.c
+   |considering: }{yes}{no}}
+   |---expanded: a.b.c
+   \_____result: a.b.c
 LOG: MAIN PANIC
   no @ found in the subject of an address list match: subject="a.b.c" pattern="a.b.c"
- a.b.c in "a.b.c"? no (end of list)
+  a.b.c in "a.b.c"? no (end of list)
  |--condition: match_address{a.b.c}{a.b.c}
  |-----result: false
   /---scanning: yes}{no}}
@@ -467,16 +475,17 @@ try option unknown_login
  ╭considering: ---->░No░lookup░yet:░${if░eq{black}{white}{$sender_host_name}{No}}
  ├───────text: ---->░No░lookup░yet:░
  ├considering: ${if░eq{black}{white}{$sender_host_name}{No}}
-  ╭considering: black}{white}{$sender_host_name}{No}}
-  ├───────text: black
-  ├considering: }{white}{$sender_host_name}{No}}
-  ├───expanded: black
-  ╰─────result: black
-  ╭considering: white}{$sender_host_name}{No}}
-  ├───────text: white
-  ├considering: }{$sender_host_name}{No}}
-  ├───expanded: white
-  ╰─────result: white
+  cond: eq
+   ╭considering: black}{white}{$sender_host_name}{No}}
+   ├───────text: black
+   ├considering: }{white}{$sender_host_name}{No}}
+   ├───expanded: black
+   ╰─────result: black
+   ╭considering: white}{$sender_host_name}{No}}
+   ├───────text: white
+   ├considering: }{$sender_host_name}{No}}
+   ├───expanded: white
+   ╰─────result: white
  ├──condition: eq{black}{white}
  ├─────result: false
   ╭───scanning: $sender_host_name}{No}}
@@ -797,14 +806,14 @@ admin user
 dropping to exim gid; retaining priv uid
 originator: uid=CALLER_UID gid=CALLER_GID login=CALLER name=CALLER_NAME
 sender address = CALLER@???
- 1.2.3.4 in "1.2.3"?
-  list element: 1.2.3
-  1.2.3.4 in "1.2.3"? no (malformed IPv4 address or address mask: 1.2.3)
-  1.2.3.4 in "1.2.3.4/abc"?
-   list element: 1.2.3.4/abc
-   1.2.3.4 in "1.2.3.4/abc"? no (malformed IPv4 address or address mask: 1.2.3.4)
-   ::1 in "<; aaaa:bbbb"?
-   ╎list element: aaaa:bbbb
-   ╎::1 in "<; aaaa:bbbb"? no (malformed IPv6 address or address mask: aaaa:bbbb)
+  1.2.3.4 in "1.2.3"?
+   list element: 1.2.3
+   1.2.3.4 in "1.2.3"? no (malformed IPv4 address or address mask: 1.2.3)
+   1.2.3.4 in "1.2.3.4/abc"?
+   ╎list element: 1.2.3.4/abc
+   ╎1.2.3.4 in "1.2.3.4/abc"? no (malformed IPv4 address or address mask: 1.2.3.4)
+   ╎::1 in "<; aaaa:bbbb"?
+   ╎ list element: aaaa:bbbb
+   ╎ ::1 in "<; aaaa:bbbb"? no (malformed IPv6 address or address mask: aaaa:bbbb)
    search_tidyup called

>>>>>>>>>>>>>>>> Exim pid=p1240 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>

diff --git a/test/stderr/0092 b/test/stderr/0092
index 04e219a0e..ef51388cd 100644
--- a/test/stderr/0092
+++ b/test/stderr/0092
@@ -73,16 +73,17 @@ try option message_size_limit
host in host_lookup? no (option unset)
set_process_info: pppp handling incoming connection from [V4NET.0.0.1]
╭considering: ${if░eq░{V4NET.0.0.1}░{$sender_host_address}░{2}░{30}}s
- ╭considering: V4NET.0.0.1}░{$sender_host_address}░{2}░{30}}s
- ├───────text: V4NET.0.0.1
- ├considering: }░{$sender_host_address}░{2}░{30}}s
- ├───expanded: V4NET.0.0.1
- ╰─────result: V4NET.0.0.1
- ╭considering: $sender_host_address}░{2}░{30}}s
- ├──────value: V4NET.0.0.1
- ├considering: }░{2}░{30}}s
- ├───expanded: $sender_host_address
- ╰─────result: V4NET.0.0.1
+ cond: eq
+ ╭considering: V4NET.0.0.1}░{$sender_host_address}░{2}░{30}}s
+ ├───────text: V4NET.0.0.1
+ ├considering: }░{$sender_host_address}░{2}░{30}}s
+ ├───expanded: V4NET.0.0.1
+ ╰─────result: V4NET.0.0.1
+ ╭considering: $sender_host_address}░{2}░{30}}s
+ ├──────value: V4NET.0.0.1
+ ├considering: }░{2}░{30}}s
+ ├───expanded: $sender_host_address
+ ╰─────result: V4NET.0.0.1
├──condition: eq░{V4NET.0.0.1}░{$sender_host_address}
├─────result: true
╭considering: 2}░{30}}s
diff --git a/test/stderr/0169 b/test/stderr/0169
index 5d4eb6dc1..714c37e49 100644
--- a/test/stderr/0169
+++ b/test/stderr/0169
@@ -35,7 +35,7 @@ quota = 52428800 threshold = 21495808 old size = sssss message size = sss
appendfile yields 0 with errno=dd more_errno=dd
>>>>>>>>>>>>>>>> Exim pid=p1236 (delivery-local) terminating with rc=0 >>>>>>>>>>>>>>>>

appendfile transport returned OK for userx@???
-added retry item for T:userx@???: errno=dd more_errno=dd flags=1
+added retry delete-item for T:userx@???: errno=dd more_errno=dd flags=1
LOG: MAIN
=> userx <userx@???> R=localuser T=appendfile
LOG: MAIN
diff --git a/test/stderr/0357 b/test/stderr/0357
index 4048d801f..6b347cef3 100644
--- a/test/stderr/0357
+++ b/test/stderr/0357
@@ -58,9 +58,9 @@ Considering: userx@???
checking router retry status
no domain retry record
have address retry record; next_try = now+0
-added retry item for R:userx@???:<CALLER@???>: errno=-1 more_errno=dd flags=1
-added retry item for R:userx@???: errno=-1 more_errno=dd flags=1
-added retry item for R:test.ex: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:userx@???:<CALLER@???>: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:userx@???: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:test.ex: errno=-1 more_errno=dd flags=1
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

After routing:
Local deliveries:
@@ -116,9 +116,9 @@ Considering: userx@???
checking router retry status
no domain retry record
have address retry record; next_try = now+0
-added retry item for R:userx@???:<CALLER@???>: errno=-1 more_errno=dd flags=1
-added retry item for R:userx@???: errno=-1 more_errno=dd flags=1
-added retry item for R:test.ex: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:userx@???:<CALLER@???>: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:userx@???: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:test.ex: errno=-1 more_errno=dd flags=1
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

After routing:
Local deliveries:
diff --git a/test/stderr/0358 b/test/stderr/0358
index d51bcf1a9..9dd2c514b 100644
--- a/test/stderr/0358
+++ b/test/stderr/0358
@@ -80,12 +80,12 @@ Considering: usery@???
checking router retry status
no domain retry record
have address retry record; next_try = now+0
-added retry item for R:usery@???:<CALLER@???>: errno=-1 more_errno=dd flags=1
-added retry item for R:usery@???: errno=-1 more_errno=dd flags=1
-added retry item for R:test.ex: errno=-1 more_errno=dd flags=1
-added retry item for R:userx@???:<CALLER@???>: errno=-1 more_errno=dd flags=1
-added retry item for R:userx@???: errno=-1 more_errno=dd flags=1
-added retry item for R:test.ex: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:usery@???:<CALLER@???>: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:usery@???: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:test.ex: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:userx@???:<CALLER@???>: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:userx@???: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:test.ex: errno=-1 more_errno=dd flags=1
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 After routing:
   Local deliveries:
diff --git a/test/stderr/0402 b/test/stderr/0402
index a9dab0cdc..8c4dda874 100644
--- a/test/stderr/0402
+++ b/test/stderr/0402
@@ -70,6 +70,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_rcvhost
  ├─────result: false
   ╭───scanning: from░$sender_rcvhost↩
@@ -113,6 +114,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_ident
   ├─────result: true
    ╭considering: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -166,6 +168,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_helo_name
   ├─────result: false
    ╭───scanning: (helo=$sender_helo_name)↩
@@ -232,6 +235,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_protocol
  ├─────result: true
   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -265,6 +269,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
@@ -277,6 +282,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:tls_in_cipher_std
  ├─────result: false
   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -326,6 +332,7 @@ try option received_header_text
  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_address
  ├─────result: true
   ╭considering: (envelope-from░<$sender_address>)↩
@@ -357,6 +364,7 @@ try option received_header_text
  ├──────value: 10HmaX-000000005vi-0000
  ├considering: ${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_for
  ├─────result: false
   ╭───scanning: ↩
@@ -789,6 +797,7 @@ try option message_prefix
  ├───────text: From░
  ├considering: ${if░def:return_path{$return_path}{MAILER-DAEMON}}░${tod_bsdinbox}↩
  
+  cond: def
  ├──condition: def:return_path
  ├─────result: true
   ╭considering: $return_path}{MAILER-DAEMON}}░${tod_bsdinbox}↩
@@ -877,6 +886,7 @@ try option message_prefix
  ├───────text: From░
  ├considering: ${if░def:return_path{$return_path}{MAILER-DAEMON}}░${tod_bsdinbox}↩
  
+  cond: def
  ├──condition: def:return_path
  ├─────result: true
   ╭considering: $return_path}{MAILER-DAEMON}}░${tod_bsdinbox}↩
diff --git a/test/stderr/0499 b/test/stderr/0499
index ebc043e8e..4d882260a 100644
--- a/test/stderr/0499
+++ b/test/stderr/0499
@@ -36,23 +36,23 @@ local host has lowest MX
  data from lookup saved for cache for +anymx: key 'mxt1.test.ex' value '@mx_any'
  mxt1.test.ex in domains? yes (matched "+anymx")
 checking "condition" "${if match_domain{$domain}{+anymx}{yes}}"...
- mxt1.test.ex in "+anymx"?
-  list element: +anymx
-   start sublist anymx
-   ╎mxt1.test.ex in "@mx_any"?
-   ╎ list element: @mx_any
-   ╎ check dnssec require list
-   ╎ check dnssec request list
-   ╎ DNS lookup of mxt1.test.ex (MX) using fakens
-   ╎ DNS lookup of mxt1.test.ex (MX) succeeded
-   ╎ DNS lookup of eximtesthost.test.ex (A) using fakens
-   ╎ DNS lookup of eximtesthost.test.ex (A) succeeded
+  mxt1.test.ex in "+anymx"?
+   list element: +anymx
+    start sublist anymx
+   ╎ mxt1.test.ex in "@mx_any"?
+   ╎  list element: @mx_any
+   ╎  check dnssec require list
+   ╎  check dnssec request list
+   ╎  DNS lookup of mxt1.test.ex (MX) using fakens
+   ╎  DNS lookup of mxt1.test.ex (MX) succeeded
+   ╎  DNS lookup of eximtesthost.test.ex (A) using fakens
+   ╎  DNS lookup of eximtesthost.test.ex (A) succeeded
 local host has lowest MX
-   ╎ host_find_bydns yield = HOST_FOUND_LOCAL (4); returned hosts:
-   ╎   eximtesthost.test.ex ip4.ip4.ip4.ip4 MX=5 
-   ╎ mxt1.test.ex in "@mx_any"? yes (matched "@mx_any")
-   end sublist anymx
-  mxt1.test.ex in "+anymx"? yes (matched "+anymx")
+   ╎  host_find_bydns yield = HOST_FOUND_LOCAL (4); returned hosts:
+   ╎    eximtesthost.test.ex ip4.ip4.ip4.ip4 MX=5 
+   ╎  mxt1.test.ex in "@mx_any"? yes (matched "@mx_any")
+    end sublist anymx
+   mxt1.test.ex in "+anymx"? yes (matched "+anymx")
 calling r1 router
 r1 router called for ph@???
   domain = mxt1.test.ex
diff --git a/test/stderr/0544 b/test/stderr/0544
index 091834313..de449b123 100644
--- a/test/stderr/0544
+++ b/test/stderr/0544
@@ -32,6 +32,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_rcvhost
  ├─────result: false
   ╭───scanning: from░$sender_rcvhost↩
@@ -75,6 +76,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_ident
   ├─────result: true
    ╭considering: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -128,6 +130,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_helo_name
   ├─────result: false
    ╭───scanning: (helo=$sender_helo_name)↩
@@ -194,6 +197,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_protocol
  ├─────result: true
   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -227,6 +231,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
@@ -239,6 +244,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:tls_in_cipher_std
  ├─────result: false
   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -288,6 +294,7 @@ try option received_header_text
  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_address
  ├─────result: true
   ╭considering: (envelope-from░<$sender_address>)↩
@@ -319,6 +326,7 @@ try option received_header_text
  ├──────value: 10HmaX-000000005vi-0000
  ├considering: ${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_for
  ├─────result: false
   ╭───scanning: ↩
@@ -385,39 +393,43 @@ LOG: MAIN
   == userx@??? R=smarthost T=smtp defer (-1): first-pass only routing due to -odqs, queue_smtp_domains or control=queue
 try option delay_warning_condition
  ╭considering: ${if░or░{{░!eq{$h_list-id:$h_list-post:$h_list-subscribe:}{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ╭considering: $h_list-id:$h_list-post:$h_list-subscribe:}{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├considering: $h_list-post:$h_list-subscribe:}{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├considering: $h_list-subscribe:}{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├considering: }{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├───expanded: $h_list-id:$h_list-post:$h_list-subscribe:
-  ╰─────result: 
-  ╭considering: }░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├───expanded: 
-  ╰─────result: 
-  ╭considering: $h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├considering: }{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├───expanded: $h_precedence:
-  ╰─────result: 
-  ╭considering: (?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├───────text: (?i)bulk|list|junk
-  ├considering: }░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├───expanded: (?i)bulk|list|junk
-  ╰─────result: (?i)bulk|list|junk
- compiled RE '(?i)bulk|list|junk' not found in local cache
- compiling RE '(?i)bulk|list|junk'
- compiled RE '(?i)bulk|list|junk' saved in local cache
-  ╭considering: $h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├considering: }{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├───expanded: $h_auto-submitted:
-  ╰─────result: 
-  ╭considering: (?i)auto-generated|auto-replied}░}}░{no}{yes}}
-  ├───────text: (?i)auto-generated|auto-replied
-  ├considering: }░}}░{no}{yes}}
-  ├───expanded: (?i)auto-generated|auto-replied
-  ╰─────result: (?i)auto-generated|auto-replied
- compiled RE '(?i)auto-generated|auto-replied' not found in local cache
- compiling RE '(?i)auto-generated|auto-replied'
- compiled RE '(?i)auto-generated|auto-replied' saved in local cache
+  cond: or
+   cond: eq
+   ╎╭considering: $h_list-id:$h_list-post:$h_list-subscribe:}{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├considering: $h_list-post:$h_list-subscribe:}{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├considering: $h_list-subscribe:}{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├considering: }{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├───expanded: $h_list-id:$h_list-post:$h_list-subscribe:
+   ╎╰─────result: 
+   ╎╭considering: }░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├───expanded: 
+   ╎╰─────result: 
+   cond: match
+   ╎╭considering: $h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├considering: }{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├───expanded: $h_precedence:
+   ╎╰─────result: 
+   ╎╭considering: (?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├───────text: (?i)bulk|list|junk
+   ╎├considering: }░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├───expanded: (?i)bulk|list|junk
+   ╎╰─────result: (?i)bulk|list|junk
+   compiled RE '(?i)bulk|list|junk' not found in local cache
+   compiling RE '(?i)bulk|list|junk'
+   compiled RE '(?i)bulk|list|junk' saved in local cache
+   cond: match
+   ╎╭considering: $h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├considering: }{(?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├───expanded: $h_auto-submitted:
+   ╎╰─────result: 
+   ╎╭considering: (?i)auto-generated|auto-replied}░}}░{no}{yes}}
+   ╎├───────text: (?i)auto-generated|auto-replied
+   ╎├considering: }░}}░{no}{yes}}
+   ╎├───expanded: (?i)auto-generated|auto-replied
+   ╎╰─────result: (?i)auto-generated|auto-replied
+   compiled RE '(?i)auto-generated|auto-replied' not found in local cache
+   compiling RE '(?i)auto-generated|auto-replied'
+   compiled RE '(?i)auto-generated|auto-replied' saved in local cache
  ├──condition: or░{{░!eq{$h_list-id:$h_list-post:$h_list-subscribe:}{}░}{░match{$h_precedence:}{(?i)bulk|list|junk}░}{░match{$h_auto-submitted:}{(?i)auto-generated|auto-replied}░}}
  ├─────result: false
   ╭───scanning: no}{yes}}
@@ -465,24 +477,25 @@ try option smtp_banner
  ╰─────result: the.local.host.name░ESMTP░Exim░x.yz░Tue,░2░Mar░1999░09:44:33░+0000
 try option acl_smtp_helo
  ╭considering: ${if░match_domain░{$sender_helo_name}{+dlist}}
-  ╭considering: $sender_helo_name}{+dlist}}
-  ├──────value: ehlo.domain
-             ╰──(tainted)
-  ├considering: }{+dlist}}
-  ├───expanded: $sender_helo_name
-  ╰─────result: ehlo.domain
-             ╰──(tainted)
-  ╭considering: +dlist}}
-  ├───────text: +dlist
-  ├considering: }}
-  ├───expanded: +dlist
-  ╰─────result: +dlist
-  ╭considering: $domain
-  ├──────value: ehlo.domain
-             ╰──(tainted)
-  ├───expanded: $domain
-  ╰─────result: ehlo.domain
-             ╰──(tainted)
+  cond: match_domain
+   ╭considering: $sender_helo_name}{+dlist}}
+   ├──────value: ehlo.domain
+              ╰──(tainted)
+   ├considering: }{+dlist}}
+   ├───expanded: $sender_helo_name
+   ╰─────result: ehlo.domain
+              ╰──(tainted)
+   ╭considering: +dlist}}
+   ├───────text: +dlist
+   ├considering: }}
+   ├───expanded: +dlist
+   ╰─────result: +dlist
+   ╭considering: $domain
+   ├──────value: ehlo.domain
+              ╰──(tainted)
+   ├───expanded: $domain
+   ╰─────result: ehlo.domain
+              ╰──(tainted)
  ├──condition: match_domain░{$sender_helo_name}{+dlist}
  ├─────result: true
  ├───expanded: ${if░match_domain░{$sender_helo_name}{+dlist}}
diff --git a/test/stderr/0554 b/test/stderr/0554
index d8ee0171a..8e320f709 100644
--- a/test/stderr/0554
+++ b/test/stderr/0554
@@ -47,9 +47,9 @@ Considering: x@y
 checking router retry status
  no   domain  retry record
  have address retry record; next_try = now+0
-added retry item for R:x@y:<CALLER@???>: errno=-1 more_errno=dd flags=1
-added retry item for R:x@y: errno=-1 more_errno=dd flags=1
-added retry item for R:y: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:x@y:<CALLER@???>: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:x@y: errno=-1 more_errno=dd flags=1
+added retry delete-item for R:y: errno=-1 more_errno=dd flags=1

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

After routing:
Local deliveries:
@@ -60,8 +60,8 @@ After routing:
checking retry status of 127.0.0.1
no host retry record
no message retry record
-added retry item for R:x@y:<CALLER@???>: errno=dd more_errno=dd,A flags=1
-added retry item for R:x@y: errno=dd more_errno=dd,A flags=1
+added retry delete-item for R:x@y:<CALLER@???>: errno=dd more_errno=dd,A flags=1
+added retry delete-item for R:x@y: errno=dd more_errno=dd,A flags=1
cmdlog: '220:EHLO:250:MAIL:250:RCPT:250:DATA:354:.:250:QUIT+:250'
>>>>>>>>>>>>>>>> Exim pid=p1237 (transport) terminating with rc=0 >>>>>>>>>>>>>>>>

 reading retry information for R:x@y from subprocess
diff --git a/test/stderr/0632 b/test/stderr/0632
index d7fac294a..8855f4e38 100644
--- a/test/stderr/0632
+++ b/test/stderr/0632
@@ -66,74 +66,77 @@ p1235  ├───expanded: $spool_directory/exim_daemon_notify
 p1235  ╰─────result: TESTSUITE/spool/exim_daemon_notify
 p1235 test.ex in "^nomatch_list"? no (end of list)
 p1235  ╭considering: ${if░match░{a_random_string}░{static_RE}}
-p1235   ╭considering: a_random_string}░{static_RE}}
-p1235   ├───────text: a_random_string
-p1235   ├considering: }░{static_RE}}
-p1235   ├───expanded: a_random_string
-p1235   ╰─────result: a_random_string
-p1235   ╭considering: static_RE}}
-p1235   ├───────text: static_RE
-p1235   ├considering: }}
-p1235   ├───expanded: static_RE
-p1235   ╰─────result: static_RE
-p1235  compiled RE 'static_RE' not found in local cache
-p1235  compiling RE 'static_RE'
-p1235  compiled RE 'static_RE' saved in local cache
-p1235  sending RE 'static_RE' to daemon
+p1235   cond: match
+p1235    ╭considering: a_random_string}░{static_RE}}
+p1235    ├───────text: a_random_string
+p1235    ├considering: }░{static_RE}}
+p1235    ├───expanded: a_random_string
+p1235    ╰─────result: a_random_string
+p1235    ╭considering: static_RE}}
+p1235    ├───────text: static_RE
+p1235    ├considering: }}
+p1235    ├───expanded: static_RE
+p1235    ╰─────result: static_RE
+p1235   compiled RE 'static_RE' not found in local cache
+p1235   compiling RE 'static_RE'
+p1235   compiled RE 'static_RE' saved in local cache
+p1235   sending RE 'static_RE' to daemon
 p1235 try option notifier_socket
-p1235   ╭considering: $spool_directory/exim_daemon_notify
-p1235   ├──────value: TESTSUITE/spool
-p1235   ├considering: /exim_daemon_notify
-p1235   ├───────text: /exim_daemon_notify
-p1235   ├───expanded: $spool_directory/exim_daemon_notify
-p1235   ╰─────result: TESTSUITE/spool/exim_daemon_notify
+p1235    ╭considering: $spool_directory/exim_daemon_notify
+p1235    ├──────value: TESTSUITE/spool
+p1235    ├considering: /exim_daemon_notify
+p1235    ├───────text: /exim_daemon_notify
+p1235    ├───expanded: $spool_directory/exim_daemon_notify
+p1235    ╰─────result: TESTSUITE/spool/exim_daemon_notify
 p1235  ├──condition: match░{a_random_string}░{static_RE}
 p1235  ├─────result: false
 p1235  ├───expanded: ${if░match░{a_random_string}░{static_RE}}
 p1235  ╰─────result: 
 p1235  ╭considering: ${if░match░{a_random_string}░{tricky_static_RE\$}}
-p1235   ╭considering: a_random_string}░{tricky_static_RE\$}}
-p1235   ├───────text: a_random_string
-p1235   ├considering: }░{tricky_static_RE\$}}
-p1235   ├───expanded: a_random_string
-p1235   ╰─────result: a_random_string
-p1235   ╭considering: tricky_static_RE\$}}
-p1235   ├───────text: tricky_static_RE
-p1235   ├considering: \$}}
-p1235   ├backslashed: '\$'
-p1235   ├considering: }}
-p1235   ├───expanded: tricky_static_RE\$
-p1235   ╰─────result: tricky_static_RE$
-p1235  compiled RE 'tricky_static_RE$' not found in local cache
-p1235  compiling RE 'tricky_static_RE$'
-p1235  compiled RE 'tricky_static_RE$' saved in local cache
-p1235  sending RE 'tricky_static_RE$' to daemon
+p1235   cond: match
+p1235    ╭considering: a_random_string}░{tricky_static_RE\$}}
+p1235    ├───────text: a_random_string
+p1235    ├considering: }░{tricky_static_RE\$}}
+p1235    ├───expanded: a_random_string
+p1235    ╰─────result: a_random_string
+p1235    ╭considering: tricky_static_RE\$}}
+p1235    ├───────text: tricky_static_RE
+p1235    ├considering: \$}}
+p1235    ├backslashed: '\$'
+p1235    ├considering: }}
+p1235    ├───expanded: tricky_static_RE\$
+p1235    ╰─────result: tricky_static_RE$
+p1235   compiled RE 'tricky_static_RE$' not found in local cache
+p1235   compiling RE 'tricky_static_RE$'
+p1235   compiled RE 'tricky_static_RE$' saved in local cache
+p1235   sending RE 'tricky_static_RE$' to daemon
 p1235 try option notifier_socket
-p1235   ╭considering: $spool_directory/exim_daemon_notify
-p1235   ├──────value: TESTSUITE/spool
-p1235   ├considering: /exim_daemon_notify
-p1235   ├───────text: /exim_daemon_notify
-p1235   ├───expanded: $spool_directory/exim_daemon_notify
-p1235   ╰─────result: TESTSUITE/spool/exim_daemon_notify
+p1235    ╭considering: $spool_directory/exim_daemon_notify
+p1235    ├──────value: TESTSUITE/spool
+p1235    ├considering: /exim_daemon_notify
+p1235    ├───────text: /exim_daemon_notify
+p1235    ├───expanded: $spool_directory/exim_daemon_notify
+p1235    ╰─────result: TESTSUITE/spool/exim_daemon_notify
 p1235  ├──condition: match░{a_random_string}░{tricky_static_RE\$}
 p1235  ├─────result: false
 p1235  ├───expanded: ${if░match░{a_random_string}░{tricky_static_RE\$}}
 p1235  ╰─────result: 
 p1235  ╭considering: ${if░match░{a_random_string}░{pid=${pid}░uncacheable_RE}}
-p1235   ╭considering: a_random_string}░{pid=${pid}░uncacheable_RE}}
-p1235   ├───────text: a_random_string
-p1235   ├considering: }░{pid=${pid}░uncacheable_RE}}
-p1235   ├───expanded: a_random_string
-p1235   ╰─────result: a_random_string
-p1235   ╭considering: pid=${pid}░uncacheable_RE}}
-p1235   ├───────text: pid=
-p1235   ├considering: ${pid}░uncacheable_RE}}
-p1235   ├considering: ░uncacheable_RE}}
-p1235   ├───────text: ░uncacheable_RE
-p1235   ├considering: }}
-p1235   ├───expanded: pid=${pid}░uncacheable_RE
-p1235   ╰─────result: pid=p1235░uncacheable_RE
-p1235  compiling RE 'pid=p1235 uncacheable_RE'
+p1235   cond: match
+p1235    ╭considering: a_random_string}░{pid=${pid}░uncacheable_RE}}
+p1235    ├───────text: a_random_string
+p1235    ├considering: }░{pid=${pid}░uncacheable_RE}}
+p1235    ├───expanded: a_random_string
+p1235    ╰─────result: a_random_string
+p1235    ╭considering: pid=${pid}░uncacheable_RE}}
+p1235    ├───────text: pid=
+p1235    ├considering: ${pid}░uncacheable_RE}}
+p1235    ├considering: ░uncacheable_RE}}
+p1235    ├───────text: ░uncacheable_RE
+p1235    ├considering: }}
+p1235    ├───expanded: pid=${pid}░uncacheable_RE
+p1235    ╰─────result: pid=p1235░uncacheable_RE
+p1235   compiling RE 'pid=p1235 uncacheable_RE'
 p1235  ├──condition: match░{a_random_string}░{pid=${pid}░uncacheable_RE}
 p1235  ├─────result: false
 p1235  ├───expanded: ${if░match░{a_random_string}░{pid=${pid}░uncacheable_RE}}
@@ -160,6 +163,7 @@ p1235  ␉}}(Exim░$version_number)↩
 p1235  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1235  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1235  ␉for░$received_for}}
+p1235   cond: def
 p1235  ├──condition: def:sender_rcvhost
 p1235  ├─────result: true
 p1235   ╭considering: from░$sender_rcvhost↩
@@ -205,6 +209,7 @@ p1235   ␉}}(Exim░$version_number)↩
 p1235   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1235   ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1235   ␉for░$received_for}}
+p1235    cond: def
 p1235   ├──condition: def:sender_ident
 p1235   ├─────result: false
 p1235    ╭───scanning: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -259,6 +264,7 @@ p1235   ␉}}(Exim░$version_number)↩
 p1235   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1235   ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1235   ␉for░$received_for}}
+p1235    cond: def
 p1235   ├──condition: def:sender_helo_name
 p1235   ├─────result: false
 p1235    ╭───scanning: (helo=$sender_helo_name)↩
@@ -328,6 +334,7 @@ p1235  ␉}}(Exim░$version_number)↩
 p1235  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1235  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1235  ␉for░$received_for}}
+p1235   cond: def
 p1235  ├──condition: def:received_protocol
 p1235  ├─────result: true
 p1235   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -362,6 +369,7 @@ p1235  ␉}}(Exim░$version_number)↩
 p1235  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1235  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1235  ␉for░$received_for}}
+p1235   cond: def
 p1235   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1235   ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1235   ␉for░$received_for}}
@@ -375,6 +383,7 @@ p1235  ␉}}(Exim░$version_number)↩
 p1235  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1235  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1235  ␉for░$received_for}}
+p1235   cond: def
 p1235  ├──condition: def:tls_in_cipher_std
 p1235  ├─────result: false
 p1235   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -425,6 +434,7 @@ p1235  ␉
 p1235  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1235  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1235  ␉for░$received_for}}
+p1235   cond: def
 p1235  ├──condition: def:sender_address
 p1235  ├─────result: true
 p1235   ╭considering: (envelope-from░<$sender_address>)↩
@@ -459,6 +469,7 @@ p1235  ␉for░$received_for}}
 p1235  ├──────value: 10HmaX-000000005vi-0000
 p1235  ├considering: ${if░def:received_for░{↩
 p1235  ␉for░$received_for}}
+p1235   cond: def
 p1235  ├──condition: def:received_for
 p1235  ├─────result: true
 p1235   ╭considering: ↩
@@ -552,54 +563,57 @@ p1236 try option acl_smtp_rcpt
 p1236 compiled caseless RE '^nomatch_list' found in local cache
 p1236 test.ex in "^nomatch_list"? no (end of list)
 p1236  ╭considering: ${if░match░{a_random_string}░{static_RE}}
-p1236   ╭considering: a_random_string}░{static_RE}}
-p1236   ├───────text: a_random_string
-p1236   ├considering: }░{static_RE}}
-p1236   ├───expanded: a_random_string
-p1236   ╰─────result: a_random_string
-p1236   ╭considering: static_RE}}
-p1236   ├───────text: static_RE
-p1236   ├considering: }}
-p1236   ├───expanded: static_RE
-p1236   ╰─────result: static_RE
-p1236  compiled RE 'static_RE' found in local cache
+p1236   cond: match
+p1236    ╭considering: a_random_string}░{static_RE}}
+p1236    ├───────text: a_random_string
+p1236    ├considering: }░{static_RE}}
+p1236    ├───expanded: a_random_string
+p1236    ╰─────result: a_random_string
+p1236    ╭considering: static_RE}}
+p1236    ├───────text: static_RE
+p1236    ├considering: }}
+p1236    ├───expanded: static_RE
+p1236    ╰─────result: static_RE
+p1236   compiled RE 'static_RE' found in local cache
 p1236  ├──condition: match░{a_random_string}░{static_RE}
 p1236  ├─────result: false
 p1236  ├───expanded: ${if░match░{a_random_string}░{static_RE}}
 p1236  ╰─────result: 
 p1236  ╭considering: ${if░match░{a_random_string}░{tricky_static_RE\$}}
-p1236   ╭considering: a_random_string}░{tricky_static_RE\$}}
-p1236   ├───────text: a_random_string
-p1236   ├considering: }░{tricky_static_RE\$}}
-p1236   ├───expanded: a_random_string
-p1236   ╰─────result: a_random_string
-p1236   ╭considering: tricky_static_RE\$}}
-p1236   ├───────text: tricky_static_RE
-p1236   ├considering: \$}}
-p1236   ├backslashed: '\$'
-p1236   ├considering: }}
-p1236   ├───expanded: tricky_static_RE\$
-p1236   ╰─────result: tricky_static_RE$
-p1236  compiled RE 'tricky_static_RE$' found in local cache
+p1236   cond: match
+p1236    ╭considering: a_random_string}░{tricky_static_RE\$}}
+p1236    ├───────text: a_random_string
+p1236    ├considering: }░{tricky_static_RE\$}}
+p1236    ├───expanded: a_random_string
+p1236    ╰─────result: a_random_string
+p1236    ╭considering: tricky_static_RE\$}}
+p1236    ├───────text: tricky_static_RE
+p1236    ├considering: \$}}
+p1236    ├backslashed: '\$'
+p1236    ├considering: }}
+p1236    ├───expanded: tricky_static_RE\$
+p1236    ╰─────result: tricky_static_RE$
+p1236   compiled RE 'tricky_static_RE$' found in local cache
 p1236  ├──condition: match░{a_random_string}░{tricky_static_RE\$}
 p1236  ├─────result: false
 p1236  ├───expanded: ${if░match░{a_random_string}░{tricky_static_RE\$}}
 p1236  ╰─────result: 
 p1236  ╭considering: ${if░match░{a_random_string}░{pid=${pid}░uncacheable_RE}}
-p1236   ╭considering: a_random_string}░{pid=${pid}░uncacheable_RE}}
-p1236   ├───────text: a_random_string
-p1236   ├considering: }░{pid=${pid}░uncacheable_RE}}
-p1236   ├───expanded: a_random_string
-p1236   ╰─────result: a_random_string
-p1236   ╭considering: pid=${pid}░uncacheable_RE}}
-p1236   ├───────text: pid=
-p1236   ├considering: ${pid}░uncacheable_RE}}
-p1236   ├considering: ░uncacheable_RE}}
-p1236   ├───────text: ░uncacheable_RE
-p1236   ├considering: }}
-p1236   ├───expanded: pid=${pid}░uncacheable_RE
-p1236   ╰─────result: pid=p1236░uncacheable_RE
-p1236  compiling RE 'pid=p1236 uncacheable_RE'
+p1236   cond: match
+p1236    ╭considering: a_random_string}░{pid=${pid}░uncacheable_RE}}
+p1236    ├───────text: a_random_string
+p1236    ├considering: }░{pid=${pid}░uncacheable_RE}}
+p1236    ├───expanded: a_random_string
+p1236    ╰─────result: a_random_string
+p1236    ╭considering: pid=${pid}░uncacheable_RE}}
+p1236    ├───────text: pid=
+p1236    ├considering: ${pid}░uncacheable_RE}}
+p1236    ├considering: ░uncacheable_RE}}
+p1236    ├───────text: ░uncacheable_RE
+p1236    ├considering: }}
+p1236    ├───expanded: pid=${pid}░uncacheable_RE
+p1236    ╰─────result: pid=p1236░uncacheable_RE
+p1236   compiling RE 'pid=p1236 uncacheable_RE'
 p1236  ├──condition: match░{a_random_string}░{pid=${pid}░uncacheable_RE}
 p1236  ├─────result: false
 p1236  ├───expanded: ${if░match░{a_random_string}░{pid=${pid}░uncacheable_RE}}
@@ -626,6 +640,7 @@ p1236  ␉}}(Exim░$version_number)↩
 p1236  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1236  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1236  ␉for░$received_for}}
+p1236   cond: def
 p1236  ├──condition: def:sender_rcvhost
 p1236  ├─────result: true
 p1236   ╭considering: from░$sender_rcvhost↩
@@ -671,6 +686,7 @@ p1236   ␉}}(Exim░$version_number)↩
 p1236   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1236   ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1236   ␉for░$received_for}}
+p1236    cond: def
 p1236   ├──condition: def:sender_ident
 p1236   ├─────result: false
 p1236    ╭───scanning: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -725,6 +741,7 @@ p1236   ␉}}(Exim░$version_number)↩
 p1236   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1236   ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1236   ␉for░$received_for}}
+p1236    cond: def
 p1236   ├──condition: def:sender_helo_name
 p1236   ├─────result: false
 p1236    ╭───scanning: (helo=$sender_helo_name)↩
@@ -794,6 +811,7 @@ p1236  ␉}}(Exim░$version_number)↩
 p1236  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1236  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1236  ␉for░$received_for}}
+p1236   cond: def
 p1236  ├──condition: def:received_protocol
 p1236  ├─────result: true
 p1236   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -828,6 +846,7 @@ p1236  ␉}}(Exim░$version_number)↩
 p1236  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1236  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1236  ␉for░$received_for}}
+p1236   cond: def
 p1236   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1236   ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1236   ␉for░$received_for}}
@@ -841,6 +860,7 @@ p1236  ␉}}(Exim░$version_number)↩
 p1236  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1236  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1236  ␉for░$received_for}}
+p1236   cond: def
 p1236  ├──condition: def:tls_in_cipher_std
 p1236  ├─────result: false
 p1236   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -891,6 +911,7 @@ p1236  ␉
 p1236  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
 p1236  ␉}}id░$message_exim_id${if░def:received_for░{↩
 p1236  ␉for░$received_for}}
+p1236   cond: def
 p1236  ├──condition: def:sender_address
 p1236  ├─────result: true
 p1236   ╭considering: (envelope-from░<$sender_address>)↩
@@ -925,6 +946,7 @@ p1236  ␉for░$received_for}}
 p1236  ├──────value: 10HmaY-000000005vi-0000
 p1236  ├considering: ${if░def:received_for░{↩
 p1236  ␉for░$received_for}}
+p1236   cond: def
 p1236  ├──condition: def:received_for
 p1236  ├─────result: true
 p1236   ╭considering: ↩
diff --git a/test/stderr/3400 b/test/stderr/3400
index 915c6e8f1..e9b3221c8 100644
--- a/test/stderr/3400
+++ b/test/stderr/3400
@@ -782,9 +782,9 @@ mylogin authenticator server_condition:
   $auth1 = userx secret
   $1 = userx secret
 +++MYLOGIN $1="userx secret" $2="" $3=""
- compiled RE '^(\S+)\s+(\S+)$' not found in local cache
- compiling RE '^(\S+)\s+(\S+)$'
- compiled RE '^(\S+)\s+(\S+)$' saved in local cache
+  compiled RE '^(\S+)\s+(\S+)$' not found in local cache
+  compiling RE '^(\S+)\s+(\S+)$'
+  compiled RE '^(\S+)\s+(\S+)$' saved in local cache
 expanded string: yes

SMTP>> 235 Authentication succeeded

 SMTP<< quit
diff --git a/test/stderr/5410 b/test/stderr/5410
index 9b4f0ff8a..4ee810ac3 100644
--- a/test/stderr/5410
+++ b/test/stderr/5410
@@ -44,16 +44,17 @@ try option acl_smtp_expn
 try option acl_smtp_mail
 try option acl_smtp_rcpt
  ╭considering: ${if░eq░{SERVER}{server}{queue}{cutthrough}}
-  ╭considering: SERVER}{server}{queue}{cutthrough}}
-  ├───────text: SERVER
-  ├considering: }{server}{queue}{cutthrough}}
-  ├───expanded: SERVER
-  ╰─────result: SERVER
-  ╭considering: server}{queue}{cutthrough}}
-  ├───────text: server
-  ├considering: }{queue}{cutthrough}}
-  ├───expanded: server
-  ╰─────result: server
+  cond: eq
+   ╭considering: SERVER}{server}{queue}{cutthrough}}
+   ├───────text: SERVER
+   ├considering: }{server}{queue}{cutthrough}}
+   ├───expanded: SERVER
+   ╰─────result: SERVER
+   ╭considering: server}{queue}{cutthrough}}
+   ├───────text: server
+   ├considering: }{queue}{cutthrough}}
+   ├───expanded: server
+   ╰─────result: server
  ├──condition: eq░{SERVER}{server}
  ├─────result: false
   ╭───scanning: queue}{cutthrough}}
@@ -147,30 +148,33 @@ cmd buf flush ddd bytes
          250 HELP
 try option host_name_extract
  ╭considering: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 127.0.0.1
-  ├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $host
-  ╰─────result: 127.0.0.1
-  ╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───────text: .outlook.com
-  ├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├backslashed: '\$'
-  ├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: .outlook.com\$
-  ╰─────result: .outlook.com$
-  ╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 
-  ├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $item
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
-  ╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──protected: ^250-([\w.]+)\s
-  ├───scanning: }}}░{$1}}
-  ├───expanded: \N^250-([\w.]+)\s\N
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
+  cond: and
+   cond: match
+   ╎╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 127.0.0.1
+   ╎├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $host
+   ╎╰─────result: 127.0.0.1
+   ╎╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───────text: .outlook.com
+   ╎├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├backslashed: '\$'
+   ╎├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: .outlook.com\$
+   ╎╰─────result: .outlook.com$
+   cond: match
+   ╎╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 
+   ╎├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $item
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
+   ╎╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──protected: ^250-([\w.]+)\s
+   ╎├───scanning: }}}░{$1}}
+   ╎├───expanded: \N^250-([\w.]+)\s\N
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
  ├──condition: and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}
  ├─────result: false
   ╭───scanning: $1}}
@@ -181,18 +185,19 @@ try option host_name_extract
  ├───expanded: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
  ╰─────result: 
  ╭considering: ${if░eq░{$address_data}{usery}{*}{:}}
-  ╭considering: $address_data}{usery}{*}{:}}
-  ├──────value: userx
-             ╰──(tainted)
-  ├considering: }{usery}{*}{:}}
-  ├───expanded: $address_data
-  ╰─────result: userx
-             ╰──(tainted)
-  ╭considering: usery}{*}{:}}
-  ├───────text: usery
-  ├considering: }{*}{:}}
-  ├───expanded: usery
-  ╰─────result: usery
+  cond: eq
+   ╭considering: $address_data}{usery}{*}{:}}
+   ├──────value: userx
+              ╰──(tainted)
+   ├considering: }{usery}{*}{:}}
+   ├───expanded: $address_data
+   ╰─────result: userx
+              ╰──(tainted)
+   ╭considering: usery}{*}{:}}
+   ├───────text: usery
+   ├considering: }{*}{:}}
+   ├───expanded: usery
+   ╰─────result: usery
  ├──condition: eq░{$address_data}{usery}
  ├─────result: false
   ╭───scanning: *}{:}}
@@ -212,18 +217,19 @@ try option host_name_extract
  list element: 
 127.0.0.1 in hosts_avoid_tls? no (end of list)
  ╭considering: ${if░eq░{$address_data}{userz}{*}{:}}
-  ╭considering: $address_data}{userz}{*}{:}}
-  ├──────value: userx
-             ╰──(tainted)
-  ├considering: }{userz}{*}{:}}
-  ├───expanded: $address_data
-  ╰─────result: userx
-             ╰──(tainted)
-  ╭considering: userz}{*}{:}}
-  ├───────text: userz
-  ├considering: }{*}{:}}
-  ├───expanded: userz
-  ╰─────result: userz
+  cond: eq
+   ╭considering: $address_data}{userz}{*}{:}}
+   ├──────value: userx
+              ╰──(tainted)
+   ├considering: }{userz}{*}{:}}
+   ├───expanded: $address_data
+   ╰─────result: userx
+              ╰──(tainted)
+   ╭considering: userz}{*}{:}}
+   ├───────text: userz
+   ├considering: }{*}{:}}
+   ├───expanded: userz
+   ╰─────result: userz
  ├──condition: eq░{$address_data}{userz}
  ├─────result: false
   ╭───scanning: *}{:}}
@@ -302,6 +308,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_rcvhost
  ├─────result: false
   ╭───scanning: from░$sender_rcvhost↩
@@ -345,6 +352,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_ident
   ├─────result: true
    ╭considering: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -398,6 +406,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_helo_name
   ├─────result: true
    ╭considering: (helo=$sender_helo_name)↩
@@ -472,6 +481,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_protocol
  ├─────result: true
   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -506,6 +516,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
@@ -519,6 +530,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:tls_in_cipher_std
  ├─────result: false
   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -569,6 +581,7 @@ try option received_header_text
  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_address
  ├─────result: true
   ╭considering: (envelope-from░<$sender_address>)↩
@@ -601,6 +614,7 @@ try option received_header_text
  ├──────value: 10HmaX-000000005vi-0000
  ├considering: ${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_for
  ├─────result: true
   ╭considering: ↩
@@ -701,16 +715,17 @@ try option acl_smtp_expn
 try option acl_smtp_mail
 try option acl_smtp_rcpt
  ╭considering: ${if░eq░{SERVER}{server}{queue}{cutthrough}}
-  ╭considering: SERVER}{server}{queue}{cutthrough}}
-  ├───────text: SERVER
-  ├considering: }{server}{queue}{cutthrough}}
-  ├───expanded: SERVER
-  ╰─────result: SERVER
-  ╭considering: server}{queue}{cutthrough}}
-  ├───────text: server
-  ├considering: }{queue}{cutthrough}}
-  ├───expanded: server
-  ╰─────result: server
+  cond: eq
+   ╭considering: SERVER}{server}{queue}{cutthrough}}
+   ├───────text: SERVER
+   ├considering: }{server}{queue}{cutthrough}}
+   ├───expanded: SERVER
+   ╰─────result: SERVER
+   ╭considering: server}{queue}{cutthrough}}
+   ├───────text: server
+   ├considering: }{queue}{cutthrough}}
+   ├───expanded: server
+   ╰─────result: server
  ├──condition: eq░{SERVER}{server}
  ├─────result: false
   ╭───scanning: queue}{cutthrough}}
@@ -804,30 +819,33 @@ cmd buf flush ddd bytes
          250 HELP
 try option host_name_extract
  ╭considering: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 127.0.0.1
-  ├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $host
-  ╰─────result: 127.0.0.1
-  ╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───────text: .outlook.com
-  ├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├backslashed: '\$'
-  ├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: .outlook.com\$
-  ╰─────result: .outlook.com$
-  ╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 
-  ├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $item
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
-  ╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──protected: ^250-([\w.]+)\s
-  ├───scanning: }}}░{$1}}
-  ├───expanded: \N^250-([\w.]+)\s\N
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
+  cond: and
+   cond: match
+   ╎╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 127.0.0.1
+   ╎├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $host
+   ╎╰─────result: 127.0.0.1
+   ╎╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───────text: .outlook.com
+   ╎├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├backslashed: '\$'
+   ╎├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: .outlook.com\$
+   ╎╰─────result: .outlook.com$
+   cond: match
+   ╎╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 
+   ╎├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $item
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
+   ╎╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──protected: ^250-([\w.]+)\s
+   ╎├───scanning: }}}░{$1}}
+   ╎├───expanded: \N^250-([\w.]+)\s\N
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
  ├──condition: and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}
  ├─────result: false
   ╭───scanning: $1}}
@@ -838,18 +856,19 @@ try option host_name_extract
  ├───expanded: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
  ╰─────result: 
  ╭considering: ${if░eq░{$address_data}{usery}{*}{:}}
-  ╭considering: $address_data}{usery}{*}{:}}
-  ├──────value: usery
-             ╰──(tainted)
-  ├considering: }{usery}{*}{:}}
-  ├───expanded: $address_data
-  ╰─────result: usery
-             ╰──(tainted)
-  ╭considering: usery}{*}{:}}
-  ├───────text: usery
-  ├considering: }{*}{:}}
-  ├───expanded: usery
-  ╰─────result: usery
+  cond: eq
+   ╭considering: $address_data}{usery}{*}{:}}
+   ├──────value: usery
+              ╰──(tainted)
+   ├considering: }{usery}{*}{:}}
+   ├───expanded: $address_data
+   ╰─────result: usery
+              ╰──(tainted)
+   ╭considering: usery}{*}{:}}
+   ├───────text: usery
+   ├considering: }{*}{:}}
+   ├───expanded: usery
+   ╰─────result: usery
  ├──condition: eq░{$address_data}{usery}
  ├─────result: true
   ╭considering: *}{:}}
@@ -909,6 +928,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_rcvhost
  ├─────result: false
   ╭───scanning: from░$sender_rcvhost↩
@@ -952,6 +972,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_ident
   ├─────result: true
    ╭considering: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -1005,6 +1026,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_helo_name
   ├─────result: true
    ╭considering: (helo=$sender_helo_name)↩
@@ -1079,6 +1101,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_protocol
  ├─────result: true
   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -1113,6 +1136,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
@@ -1126,6 +1150,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:tls_in_cipher_std
  ├─────result: false
   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -1176,6 +1201,7 @@ try option received_header_text
  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_address
  ├─────result: true
   ╭considering: (envelope-from░<$sender_address>)↩
@@ -1208,6 +1234,7 @@ try option received_header_text
  ├──────value: 10HmaZ-000000005vi-0000
  ├considering: ${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_for
  ├─────result: true
   ╭considering: ↩
@@ -1308,16 +1335,17 @@ try option acl_smtp_expn
 try option acl_smtp_mail
 try option acl_smtp_rcpt
  ╭considering: ${if░eq░{SERVER}{server}{queue}{cutthrough}}
-  ╭considering: SERVER}{server}{queue}{cutthrough}}
-  ├───────text: SERVER
-  ├considering: }{server}{queue}{cutthrough}}
-  ├───expanded: SERVER
-  ╰─────result: SERVER
-  ╭considering: server}{queue}{cutthrough}}
-  ├───────text: server
-  ├considering: }{queue}{cutthrough}}
-  ├───expanded: server
-  ╰─────result: server
+  cond: eq
+   ╭considering: SERVER}{server}{queue}{cutthrough}}
+   ├───────text: SERVER
+   ├considering: }{server}{queue}{cutthrough}}
+   ├───expanded: SERVER
+   ╰─────result: SERVER
+   ╭considering: server}{queue}{cutthrough}}
+   ├───────text: server
+   ├considering: }{queue}{cutthrough}}
+   ├───expanded: server
+   ╰─────result: server
  ├──condition: eq░{SERVER}{server}
  ├─────result: false
   ╭───scanning: queue}{cutthrough}}
@@ -1411,30 +1439,33 @@ cmd buf flush ddd bytes
          250 HELP
 try option host_name_extract
  ╭considering: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 127.0.0.1
-  ├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $host
-  ╰─────result: 127.0.0.1
-  ╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───────text: .outlook.com
-  ├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├backslashed: '\$'
-  ├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: .outlook.com\$
-  ╰─────result: .outlook.com$
-  ╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 
-  ├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $item
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
-  ╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──protected: ^250-([\w.]+)\s
-  ├───scanning: }}}░{$1}}
-  ├───expanded: \N^250-([\w.]+)\s\N
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
+  cond: and
+   cond: match
+   ╎╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 127.0.0.1
+   ╎├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $host
+   ╎╰─────result: 127.0.0.1
+   ╎╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───────text: .outlook.com
+   ╎├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├backslashed: '\$'
+   ╎├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: .outlook.com\$
+   ╎╰─────result: .outlook.com$
+   cond: match
+   ╎╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 
+   ╎├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $item
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
+   ╎╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──protected: ^250-([\w.]+)\s
+   ╎├───scanning: }}}░{$1}}
+   ╎├───expanded: \N^250-([\w.]+)\s\N
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
  ├──condition: and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}
  ├─────result: false
   ╭───scanning: $1}}
@@ -1445,18 +1476,19 @@ try option host_name_extract
  ├───expanded: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
  ╰─────result: 
  ╭considering: ${if░eq░{$address_data}{usery}{*}{:}}
-  ╭considering: $address_data}{usery}{*}{:}}
-  ├──────value: usery
-             ╰──(tainted)
-  ├considering: }{usery}{*}{:}}
-  ├───expanded: $address_data
-  ╰─────result: usery
-             ╰──(tainted)
-  ╭considering: usery}{*}{:}}
-  ├───────text: usery
-  ├considering: }{*}{:}}
-  ├───expanded: usery
-  ╰─────result: usery
+  cond: eq
+   ╭considering: $address_data}{usery}{*}{:}}
+   ├──────value: usery
+              ╰──(tainted)
+   ├considering: }{usery}{*}{:}}
+   ├───expanded: $address_data
+   ╰─────result: usery
+              ╰──(tainted)
+   ╭considering: usery}{*}{:}}
+   ├───────text: usery
+   ├considering: }{*}{:}}
+   ├───expanded: usery
+   ╰─────result: usery
  ├──condition: eq░{$address_data}{usery}
  ├─────result: true
   ╭considering: *}{:}}
@@ -1516,6 +1548,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_rcvhost
  ├─────result: false
   ╭───scanning: from░$sender_rcvhost↩
@@ -1559,6 +1592,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_ident
   ├─────result: true
    ╭considering: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -1612,6 +1646,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_helo_name
   ├─────result: true
    ╭considering: (helo=$sender_helo_name)↩
@@ -1686,6 +1721,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_protocol
  ├─────result: true
   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -1720,6 +1756,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
@@ -1733,6 +1770,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:tls_in_cipher_std
  ├─────result: false
   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -1783,6 +1821,7 @@ try option received_header_text
  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_address
  ├─────result: true
   ╭considering: (envelope-from░<$sender_address>)↩
@@ -1815,6 +1854,7 @@ try option received_header_text
  ├──────value: 10HmbB-000000005vi-0000
  ├considering: ${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_for
  ├─────result: true
   ╭considering: ↩
diff --git a/test/stderr/5420 b/test/stderr/5420
index caa9e0de0..a157bf5f5 100644
--- a/test/stderr/5420
+++ b/test/stderr/5420
@@ -44,16 +44,17 @@ try option acl_smtp_expn
 try option acl_smtp_mail
 try option acl_smtp_rcpt
  ╭considering: ${if░eq░{SERVER}{server}{queue}{cutthrough}}
-  ╭considering: SERVER}{server}{queue}{cutthrough}}
-  ├───────text: SERVER
-  ├considering: }{server}{queue}{cutthrough}}
-  ├───expanded: SERVER
-  ╰─────result: SERVER
-  ╭considering: server}{queue}{cutthrough}}
-  ├───────text: server
-  ├considering: }{queue}{cutthrough}}
-  ├───expanded: server
-  ╰─────result: server
+  cond: eq
+   ╭considering: SERVER}{server}{queue}{cutthrough}}
+   ├───────text: SERVER
+   ├considering: }{server}{queue}{cutthrough}}
+   ├───expanded: SERVER
+   ╰─────result: SERVER
+   ╭considering: server}{queue}{cutthrough}}
+   ├───────text: server
+   ├considering: }{queue}{cutthrough}}
+   ├───expanded: server
+   ╰─────result: server
  ├──condition: eq░{SERVER}{server}
  ├─────result: false
   ╭───scanning: queue}{cutthrough}}
@@ -147,30 +148,33 @@ cmd buf flush ddd bytes
          250 HELP
 try option host_name_extract
  ╭considering: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 127.0.0.1
-  ├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $host
-  ╰─────result: 127.0.0.1
-  ╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───────text: .outlook.com
-  ├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├backslashed: '\$'
-  ├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: .outlook.com\$
-  ╰─────result: .outlook.com$
-  ╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 
-  ├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $item
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
-  ╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──protected: ^250-([\w.]+)\s
-  ├───scanning: }}}░{$1}}
-  ├───expanded: \N^250-([\w.]+)\s\N
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
+  cond: and
+   cond: match
+   ╎╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 127.0.0.1
+   ╎├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $host
+   ╎╰─────result: 127.0.0.1
+   ╎╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───────text: .outlook.com
+   ╎├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├backslashed: '\$'
+   ╎├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: .outlook.com\$
+   ╎╰─────result: .outlook.com$
+   cond: match
+   ╎╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 
+   ╎├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $item
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
+   ╎╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──protected: ^250-([\w.]+)\s
+   ╎├───scanning: }}}░{$1}}
+   ╎├───expanded: \N^250-([\w.]+)\s\N
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
  ├──condition: and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}
  ├─────result: false
   ╭───scanning: $1}}
@@ -181,18 +185,19 @@ try option host_name_extract
  ├───expanded: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
  ╰─────result: 
  ╭considering: ${if░eq░{$address_data}{usery}{*}{:}}
-  ╭considering: $address_data}{usery}{*}{:}}
-  ├──────value: userx
-             ╰──(tainted)
-  ├considering: }{usery}{*}{:}}
-  ├───expanded: $address_data
-  ╰─────result: userx
-             ╰──(tainted)
-  ╭considering: usery}{*}{:}}
-  ├───────text: usery
-  ├considering: }{*}{:}}
-  ├───expanded: usery
-  ╰─────result: usery
+  cond: eq
+   ╭considering: $address_data}{usery}{*}{:}}
+   ├──────value: userx
+              ╰──(tainted)
+   ├considering: }{usery}{*}{:}}
+   ├───expanded: $address_data
+   ╰─────result: userx
+              ╰──(tainted)
+   ╭considering: usery}{*}{:}}
+   ├───────text: usery
+   ├considering: }{*}{:}}
+   ├───expanded: usery
+   ╰─────result: usery
  ├──condition: eq░{$address_data}{usery}
  ├─────result: false
   ╭───scanning: *}{:}}
@@ -212,18 +217,19 @@ try option host_name_extract
  list element: 
 127.0.0.1 in hosts_avoid_tls? no (end of list)
  ╭considering: ${if░eq░{$address_data}{userz}{*}{:}}
-  ╭considering: $address_data}{userz}{*}{:}}
-  ├──────value: userx
-             ╰──(tainted)
-  ├considering: }{userz}{*}{:}}
-  ├───expanded: $address_data
-  ╰─────result: userx
-             ╰──(tainted)
-  ╭considering: userz}{*}{:}}
-  ├───────text: userz
-  ├considering: }{*}{:}}
-  ├───expanded: userz
-  ╰─────result: userz
+  cond: eq
+   ╭considering: $address_data}{userz}{*}{:}}
+   ├──────value: userx
+              ╰──(tainted)
+   ├considering: }{userz}{*}{:}}
+   ├───expanded: $address_data
+   ╰─────result: userx
+              ╰──(tainted)
+   ╭considering: userz}{*}{:}}
+   ├───────text: userz
+   ├considering: }{*}{:}}
+   ├───expanded: userz
+   ╰─────result: userz
  ├──condition: eq░{$address_data}{userz}
  ├─────result: false
   ╭───scanning: *}{:}}
@@ -302,6 +308,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_rcvhost
  ├─────result: false
   ╭───scanning: from░$sender_rcvhost↩
@@ -345,6 +352,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_ident
   ├─────result: true
    ╭considering: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -398,6 +406,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_helo_name
   ├─────result: true
    ╭considering: (helo=$sender_helo_name)↩
@@ -472,6 +481,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_protocol
  ├─────result: true
   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -506,6 +516,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
@@ -519,6 +530,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:tls_in_cipher_std
  ├─────result: false
   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -569,6 +581,7 @@ try option received_header_text
  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_address
  ├─────result: true
   ╭considering: (envelope-from░<$sender_address>)↩
@@ -601,6 +614,7 @@ try option received_header_text
  ├──────value: 10HmaX-000000005vi-0000
  ├considering: ${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_for
  ├─────result: true
   ╭considering: ↩
@@ -701,16 +715,17 @@ try option acl_smtp_expn
 try option acl_smtp_mail
 try option acl_smtp_rcpt
  ╭considering: ${if░eq░{SERVER}{server}{queue}{cutthrough}}
-  ╭considering: SERVER}{server}{queue}{cutthrough}}
-  ├───────text: SERVER
-  ├considering: }{server}{queue}{cutthrough}}
-  ├───expanded: SERVER
-  ╰─────result: SERVER
-  ╭considering: server}{queue}{cutthrough}}
-  ├───────text: server
-  ├considering: }{queue}{cutthrough}}
-  ├───expanded: server
-  ╰─────result: server
+  cond: eq
+   ╭considering: SERVER}{server}{queue}{cutthrough}}
+   ├───────text: SERVER
+   ├considering: }{server}{queue}{cutthrough}}
+   ├───expanded: SERVER
+   ╰─────result: SERVER
+   ╭considering: server}{queue}{cutthrough}}
+   ├───────text: server
+   ├considering: }{queue}{cutthrough}}
+   ├───expanded: server
+   ╰─────result: server
  ├──condition: eq░{SERVER}{server}
  ├─────result: false
   ╭───scanning: queue}{cutthrough}}
@@ -804,30 +819,33 @@ cmd buf flush ddd bytes
          250 HELP
 try option host_name_extract
  ╭considering: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 127.0.0.1
-  ├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $host
-  ╰─────result: 127.0.0.1
-  ╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───────text: .outlook.com
-  ├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├backslashed: '\$'
-  ├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: .outlook.com\$
-  ╰─────result: .outlook.com$
-  ╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 
-  ├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $item
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
-  ╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──protected: ^250-([\w.]+)\s
-  ├───scanning: }}}░{$1}}
-  ├───expanded: \N^250-([\w.]+)\s\N
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
+  cond: and
+   cond: match
+   ╎╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 127.0.0.1
+   ╎├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $host
+   ╎╰─────result: 127.0.0.1
+   ╎╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───────text: .outlook.com
+   ╎├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├backslashed: '\$'
+   ╎├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: .outlook.com\$
+   ╎╰─────result: .outlook.com$
+   cond: match
+   ╎╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 
+   ╎├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $item
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
+   ╎╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──protected: ^250-([\w.]+)\s
+   ╎├───scanning: }}}░{$1}}
+   ╎├───expanded: \N^250-([\w.]+)\s\N
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
  ├──condition: and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}
  ├─────result: false
   ╭───scanning: $1}}
@@ -838,18 +856,19 @@ try option host_name_extract
  ├───expanded: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
  ╰─────result: 
  ╭considering: ${if░eq░{$address_data}{usery}{*}{:}}
-  ╭considering: $address_data}{usery}{*}{:}}
-  ├──────value: usery
-             ╰──(tainted)
-  ├considering: }{usery}{*}{:}}
-  ├───expanded: $address_data
-  ╰─────result: usery
-             ╰──(tainted)
-  ╭considering: usery}{*}{:}}
-  ├───────text: usery
-  ├considering: }{*}{:}}
-  ├───expanded: usery
-  ╰─────result: usery
+  cond: eq
+   ╭considering: $address_data}{usery}{*}{:}}
+   ├──────value: usery
+              ╰──(tainted)
+   ├considering: }{usery}{*}{:}}
+   ├───expanded: $address_data
+   ╰─────result: usery
+              ╰──(tainted)
+   ╭considering: usery}{*}{:}}
+   ├───────text: usery
+   ├considering: }{*}{:}}
+   ├───expanded: usery
+   ╰─────result: usery
  ├──condition: eq░{$address_data}{usery}
  ├─────result: true
   ╭considering: *}{:}}
@@ -909,6 +928,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_rcvhost
  ├─────result: false
   ╭───scanning: from░$sender_rcvhost↩
@@ -952,6 +972,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_ident
   ├─────result: true
    ╭considering: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -1005,6 +1026,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_helo_name
   ├─────result: true
    ╭considering: (helo=$sender_helo_name)↩
@@ -1079,6 +1101,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_protocol
  ├─────result: true
   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -1113,6 +1136,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
@@ -1126,6 +1150,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:tls_in_cipher_std
  ├─────result: false
   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -1176,6 +1201,7 @@ try option received_header_text
  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_address
  ├─────result: true
   ╭considering: (envelope-from░<$sender_address>)↩
@@ -1208,6 +1234,7 @@ try option received_header_text
  ├──────value: 10HmaZ-000000005vi-0000
  ├considering: ${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_for
  ├─────result: true
   ╭considering: ↩
@@ -1308,16 +1335,17 @@ try option acl_smtp_expn
 try option acl_smtp_mail
 try option acl_smtp_rcpt
  ╭considering: ${if░eq░{SERVER}{server}{queue}{cutthrough}}
-  ╭considering: SERVER}{server}{queue}{cutthrough}}
-  ├───────text: SERVER
-  ├considering: }{server}{queue}{cutthrough}}
-  ├───expanded: SERVER
-  ╰─────result: SERVER
-  ╭considering: server}{queue}{cutthrough}}
-  ├───────text: server
-  ├considering: }{queue}{cutthrough}}
-  ├───expanded: server
-  ╰─────result: server
+  cond: eq
+   ╭considering: SERVER}{server}{queue}{cutthrough}}
+   ├───────text: SERVER
+   ├considering: }{server}{queue}{cutthrough}}
+   ├───expanded: SERVER
+   ╰─────result: SERVER
+   ╭considering: server}{queue}{cutthrough}}
+   ├───────text: server
+   ├considering: }{queue}{cutthrough}}
+   ├───expanded: server
+   ╰─────result: server
  ├──condition: eq░{SERVER}{server}
  ├─────result: false
   ╭───scanning: queue}{cutthrough}}
@@ -1411,30 +1439,33 @@ cmd buf flush ddd bytes
          250 HELP
 try option host_name_extract
  ╭considering: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 127.0.0.1
-  ├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $host
-  ╰─────result: 127.0.0.1
-  ╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───────text: .outlook.com
-  ├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├backslashed: '\$'
-  ├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: .outlook.com\$
-  ╰─────result: .outlook.com$
-  ╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──────value: 
-  ├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
-  ├───expanded: $item
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
-  ╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
-  ├──protected: ^250-([\w.]+)\s
-  ├───scanning: }}}░{$1}}
-  ├───expanded: \N^250-([\w.]+)\s\N
-  ├─────result:  ◀skipped▶
-  ╰───skipping: result is not used
+  cond: and
+   cond: match
+   ╎╭considering: $host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 127.0.0.1
+   ╎├considering: }{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $host
+   ╎╰─────result: 127.0.0.1
+   ╎╭considering: .outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───────text: .outlook.com
+   ╎├considering: \$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├backslashed: '\$'
+   ╎├considering: }}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: .outlook.com\$
+   ╎╰─────result: .outlook.com$
+   cond: match
+   ╎╭───scanning: $item}{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──────value: 
+   ╎├───scanning: }{\N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├───expanded: $item
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
+   ╎╭───scanning: \N^250-([\w.]+)\s\N}}}░{$1}}
+   ╎├──protected: ^250-([\w.]+)\s
+   ╎├───scanning: }}}░{$1}}
+   ╎├───expanded: \N^250-([\w.]+)\s\N
+   ╎├─────result:  ◀skipped▶
+   ╎╰───skipping: result is not used
  ├──condition: and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}
  ├─────result: false
   ╭───scanning: $1}}
@@ -1445,18 +1476,19 @@ try option host_name_extract
  ├───expanded: ${if░and░{{match{$host}{.outlook.com\$}}░{match{$item}{\N^250-([\w.]+)\s\N}}}░{$1}}
  ╰─────result: 
  ╭considering: ${if░eq░{$address_data}{usery}{*}{:}}
-  ╭considering: $address_data}{usery}{*}{:}}
-  ├──────value: usery
-             ╰──(tainted)
-  ├considering: }{usery}{*}{:}}
-  ├───expanded: $address_data
-  ╰─────result: usery
-             ╰──(tainted)
-  ╭considering: usery}{*}{:}}
-  ├───────text: usery
-  ├considering: }{*}{:}}
-  ├───expanded: usery
-  ╰─────result: usery
+  cond: eq
+   ╭considering: $address_data}{usery}{*}{:}}
+   ├──────value: usery
+              ╰──(tainted)
+   ├considering: }{usery}{*}{:}}
+   ├───expanded: $address_data
+   ╰─────result: usery
+              ╰──(tainted)
+   ╭considering: usery}{*}{:}}
+   ├───────text: usery
+   ├considering: }{*}{:}}
+   ├───expanded: usery
+   ╰─────result: usery
  ├──condition: eq░{$address_data}{usery}
  ├─────result: true
   ╭considering: *}{:}}
@@ -1516,6 +1548,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_rcvhost
  ├─────result: false
   ╭───scanning: from░$sender_rcvhost↩
@@ -1559,6 +1592,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_ident
   ├─────result: true
    ╭considering: from░${quote_local_part:$sender_ident}░}}${if░def:sender_helo_name░{(helo=$sender_helo_name)↩
@@ -1612,6 +1646,7 @@ try option received_header_text
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
+   cond: def
   ├──condition: def:sender_helo_name
   ├─────result: true
    ╭considering: (helo=$sender_helo_name)↩
@@ -1686,6 +1721,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_protocol
  ├─────result: true
   ╭considering: with░$received_protocol░}}${if░def:tls_in_ver░░░░░░░░{░($tls_in_ver)}}${if░def:tls_in_cipher_std░{░tls░$tls_in_cipher_std↩
@@ -1720,6 +1756,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
   ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
   ␉}}id░$message_exim_id${if░def:received_for░{↩
   ␉for░$received_for}}
@@ -1733,6 +1770,7 @@ try option received_header_text
  ␉${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:tls_in_cipher_std
  ├─────result: false
   ╭───scanning: ░tls░$tls_in_cipher_std↩
@@ -1783,6 +1821,7 @@ try option received_header_text
  ├considering: ${if░def:sender_address░{(envelope-from░<$sender_address>)↩
  ␉}}id░$message_exim_id${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:sender_address
  ├─────result: true
   ╭considering: (envelope-from░<$sender_address>)↩
@@ -1815,6 +1854,7 @@ try option received_header_text
  ├──────value: 10HmbB-000000005vi-0000
  ├considering: ${if░def:received_for░{↩
  ␉for░$received_for}}
+  cond: def
  ├──condition: def:received_for
  ├─────result: true
   ╭considering: ↩


--
## subscription configuration (requires account):
## https://lists.exim.org/mailman3/postorius/lists/exim-cvs.lists.exim.org/
## unsubscribe (doesn't require an account):
## exim-cvs-unsubscribe@???
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/