diff --git a/stemlib/Latin/stemsrc/irreg.nom.src b/stemlib/Latin/stemsrc/irreg.nom.src
index 13f6e7d2..a3031f81 100755
--- a/stemlib/Latin/stemsrc/irreg.nom.src
+++ b/stemlib/Latin/stemsrc/irreg.nom.src
@@ -776,6 +776,10 @@ se_ pron3 masc fem abl pl
se_se_ pron3 masc fem abl pl
se_cum pron3 masc fem abl pl
+:le:sed#3
+:wd:se_d pron3 masc fem acc sg
+:wd:se_d pron3 masc fem abl sg
+
:le:lac
lac irreg_nom3 neut nom voc acc sg
lact@decl3 irreg_nom3 neut
diff --git a/stemlib/Latin/stemsrc/ls.nom b/stemlib/Latin/stemsrc/ls.nom
index dd8d0bc7..b81d5603 100755
--- a/stemlib/Latin/stemsrc/ls.nom
+++ b/stemlib/Latin/stemsrc/ls.nom
@@ -30181,9 +30181,8 @@ ca_ni^pa
:no:ca_ni^p a_ae fem
-ca^nis#1 ca^nes comm.
Ca^nis#2
-:le:Canis
+:le:Canis#2
:no:Ca^n is_is masc
@@ -32885,9 +32884,8 @@ ca_sus#1 cassus
-casu adverbially
Ca_sus#2
-:le:Casus
+:le:Casus#2
:no:Ca_s us_i masc
@@ -34256,10 +34254,8 @@ Ce^lende^ri_-tis
:no:Ce^lende^ri_-ti s_dis fem
-ce^ler#1 e^ris, e
-ce^leris ce^le^re^ ce^le^ri^ter
Ce^ler#2
-:le:Celer
+:le:Celer#2
:no:Ce^l er_eris masc
@@ -34273,9 +34269,8 @@ ce^le^ra_tim
:wd:ce^le^ra_tim adverb
-Ce^le^res um
-Ce^ler
-:le:Celer
+Ce^le^res
+:le:Celer#3
:no:Ce^l er_eris masc
@@ -34401,9 +34396,8 @@ celsi^tu_do
:no:celsi^tu_d o_inis fem
-celse_
Celsus#2
-:le:Celsus
+:le:Celsus#2
:no:Cels us_i masc
@@ -41212,6 +41206,10 @@ co^i^ti^o
:no:co^i^ti^ o_oLnis fem
+co^i^tus#1
+:le:coitus#1
+:aj:co^i^t us_a_um
+
co^i^tus#2 coetus
:le:coitus#2
:no:co^i^t us_us masc
@@ -61773,18 +61771,19 @@ di_versi^tas
di_-verse di_vorse
+
di_ves
:le:dives
:aj:di_v es_itis
-:aj:di_ s_tis_adj orth
-:aj:di_t ior_ius_comp
:aj:di_vi^t ior_ius_comp
-:aj:di_tissi^m us_a_um irreg_superl
:aj:di_vi^tissi^m us_a_um irreg_superl
-di_s di_te adj.
-di_ves
-di_s#II di_vi^-tior di_tior di_vi^tissi-mus di_tissimus di_ti^us
+di_s
+:le:dis#1
+:aj:di_ s_tis_adj no_comp
+:aj:di_t ior_ius_comp
+:aj:di_tissi^m us_a_um irreg_superl
+
di_vexus
:le:divexus
:aj:di_vex us_a_um
@@ -77814,13 +77813,8 @@ Fo^ru^li#2
:no:Fo^ru^l us_i masc pl
-fo^rum#1
-:le:forum#1
-:no:fo^r us_i neut
-
-
fo^rus
-:le:forus
+:le:forus#1
:no:fo^r us_i masc
n.
@@ -77830,7 +77824,7 @@ Forum A^lie_ni Forum Appii Forum Aure_lium Foru
Forum Gallo_rum Forum Ju_lii Forojulien-sis e adj.
Forojulien-ses Forum Vo^co_nii
fo^rus#1
-:le:forus#1
+:le:forus#2
:no:fo^r us_i masc
@@ -78142,8 +78136,10 @@ fraudu^lo_sus
:aj:fraudu^lo_s us_a_um
-fraus fraudis f.
-Fraus#III personified
+Fraus
+:le:Fraus#2
+:no:Frau s_dis fem
+
fraxa_re vigiliam circuire
fraxi^ne^us
:le:fraxineus
@@ -89257,11 +89253,6 @@ Hortensi^a
:no:Hortensi^ a_ae fem
-Hortensi^us
-:le:Hortensius
-:aj:Hortens ius_ia_ium
-
-
Hortensi^a_nus
:le:Hortensianus
:aj:Hortensi^a_n us_a_um
@@ -118501,7 +118492,7 @@ maxi^me_ maxu^me_ magi^s ma^ge^
Magnus#2
-:le:Magnus
+:le:Magnus#2
:no:Magn us_i masc
@@ -134288,14 +134279,17 @@ Ni^gellus#2
Ni^gella
-ni^ger#1 gra, grum
-ni^grum
-:le:nigrum
-:no:ni^gr us_i neut
-Ni^ger#2 gri m.
-Ni^ger#3 gris m.
+Ni^ger#2
+:le:Niger#2
+:no:Ni^g er_ri masc
+
+Ni^ger#3
+:le:Niger#3
+:no:Ni^g er_ris masc
+
+
Ni^gi^di^us
:le:Nigidius
:no:Ni^gi^d ius_i masc
@@ -140298,8 +140292,8 @@ olla
:no:o_ll a_ae fem
-aula
-:le:aula
+aula#2
+:le:aula#2
:no:aul a_ae fem
@@ -148443,12 +148437,12 @@ paulus#1 paull-
pau-lum
:le:paulum
-:no:pau-l us_i neut
+:wd:paulu^m adverb
paulo paulum
Paulus#2 Paull-
-:le:Paulus
+:le:Paulus#2
:no:Paul us_i masc
:no:Paull us_i masc orth
@@ -148694,8 +148688,11 @@ pa^vor
Pa^vor personified
-pax#1 pa_cis f.
-Pax#2 Pa_cis m.
+
+Pax#2
+:le:Pax#2
+:no:Pa_ x_cis masc
+
paxillus
:le:paxillus
:no:paxill us_i masc
@@ -148958,10 +148955,6 @@ pe^cu_ni^o_sus
:aj:pe^cu_ni^o_s us_a_um
-pe^cus#1 peco^ris n.
-pe^cus#1 pecus f.
-pe^cus#1 pecus n.
-pe^cus#2 u^dis f.
pe^cus#3
:le:pecus#3
:no:pe^c us_us masc
@@ -159878,7 +159871,7 @@ po^lus#1
Po^lus#2
-:le:Polus
+:le:Polus#2
:no:Po^l us_i masc pers_name
@@ -165186,14 +165179,12 @@ pri_mo_ pri_mum pri-mumdum
pri_me_ pri_mi^ter
-princeps#1 ci^pis adj.
-princeps ci^pis m.
-princi^pes
-:le:principes
-:no:pri_nci^p 0_is masc pl
-Princeps#2 ci^pis m.
+:le:Princeps#2
+:no:Pri_nc eps_ipis masc
+
+
princi^pa_lis
:le:principalis
:aj:pri_nci^pa_l is_e
@@ -172312,12 +172303,10 @@ qui^dem
:wd:qui^dem adverb
-qui^es#1
-:le:quies#1
-:no:qui^ es_eLtis fem
+:le:quies#2
+:aj:qui^e_ s_tis_adj
-qui^es#2 e_tis adj.
qui^escenti^a
:le:quiescentia
:no:qui^escenti^ a_ae fem
@@ -172777,14 +172766,6 @@ quintus#1 quinctus
num. adj.
quintum quinto_
-Quintus#2
-:le:Quintus
-:no:Qui_nt us_i masc pers_name
-
-
-Quinta
-:le:Quinta
-:no:Qui_nt a_ae fem
quintus-de^ci^mus
@@ -176883,6 +176864,8 @@ re^vulsi^o re^vols-
rex#1 re_gis m. adj.
Rex#2 re_gis m.
+
+
Rha indecl.
rhabdo^s
:le:rhabdos
@@ -184748,8 +184731,13 @@ se_-cu_rus
:aj:se_-cu_r us_a_um
+:le:secus#2
+:aj:se^qui^ or_us_comp irreg_comp
+:wd:se^cus adverb
+:wd:se^cus prep
+
+
se_-cu_re_ se_cu_ri^ter
-se^cus#2 Adj.
se^qui^or us, o_ris
se^qui^us but with negatives or quo, eo, nihilo
se_ti^us se_-ci^us secti^us
@@ -198668,6 +198656,9 @@ su^pellex
:no:suppellectil is_is fem orth
:no:suppellectil 0_is fem abl orth
+
+:le:super#1
+:wd:su^per irreg_adj1
su^per#2
:le:super#2
@@ -206620,7 +206611,7 @@ ti_^gri_nus
ti_^gris#1 is or i^dis
Ti_^gris#2
-:le:Tigris
+:le:Tigris#2
:no:Ti_^gr is_idis masc
diff --git a/stemlib/Latin/stemsrc/nom.01 b/stemlib/Latin/stemsrc/nom.01
index 22eb76ff..7345dd26 100755
--- a/stemlib/Latin/stemsrc/nom.01
+++ b/stemlib/Latin/stemsrc/nom.01
@@ -10,8 +10,8 @@
:le:pulcher#1
:no:pulch er_ra_rum
-:le:rex
-:no:re_ x_gis masc
+:le:rex#1
+:no:re_ x_gis masc
:le:corpus
:no:corp or_oris neut
diff --git a/stemlib/Latin/stemsrc/nom.latin.bas b/stemlib/Latin/stemsrc/nom.latin.bas
index b2f2b9be..01922b69 100755
--- a/stemlib/Latin/stemsrc/nom.latin.bas
+++ b/stemlib/Latin/stemsrc/nom.latin.bas
@@ -211,7 +211,7 @@
:le:compes1
:no:compe s_dis fem
-:le:conge^ri^es
+:le:congeries
:no:conge^ri^ es_eLi fem
:no:conge^ri^ a_ae fem
@@ -271,7 +271,7 @@
:le:amens
:aj:a_m ens_adj
-:le:an
+:le:an#1
:wd:an conj
:le:ante
@@ -311,7 +311,7 @@
:le:assiduus#1
:no:ad-sidu us_i masc
-:le:assiduus#1
+:le:assiduus#2
:aj:assidu us_a_um
:aj:ad-sidu us_a_um
@@ -360,13 +360,13 @@
:le:Calidius
:aj:Calid ius_ia_ium
-:le:canis
-:no:can is_is_C masc fem
+:le:canis#1
+:no:ca^n is_is_C masc fem
:le:celeber
:aj:celeb er_ris_re
-:le:celer
+:le:celer#1
:aj:cel er_era_erum superl
@ comp
:aj:celer 0_adj3
@@ -377,7 +377,7 @@
:le:celere
:wd:celere adverb
-:le:celsus
+:le:celsus#1
:aj:cels us_a_um
:le:centum
@@ -497,7 +497,7 @@
:le:dibaphus
:aj:dibaph us_a_um
-:le:Dido
+:le:Dido#2
:no:Di_d o_oLnis fem
:no:Di_d o_us fem
@@ -510,7 +510,7 @@
:le:dioecesis
:no:dioece_s is_eos fem
-:le:Dis
+:le:Dis#2
:no:Di_ s_tis masc sg
:le:disjunctio
@@ -614,6 +614,9 @@
:no:fid es_ei fem
:no:fid is_is fem poetic
+:le:fides#2
+:no:fid is_is fem
+
:le:fors
:no:for s_tis fem
@@ -623,7 +626,7 @@
:le:frater
:no:fra_t er_ris masc
-:le:fraus
+:le:fraus#1
:no:frau s_dis fem
:le:Frugi
@@ -681,7 +684,7 @@
:no:ho^n or_oLris masc
:wd:hono_s irreg_nom3 masc nom sg
-:le:Hortensius
+:le:Hortensius#2
:no:Hortens ius_i masc
:no:Horte_s ius_i masc
@@ -700,7 +703,7 @@
:wd:imbri er_ris masc abl sg
:wd:imbrium er_ris masc gen pl
-:le:in
+:le:in#1
:wd:in prep
:le:iners
@@ -760,7 +763,7 @@
:le:Laevus
:no:Laev us_i masc pers_name
-:le:laus
+:le:laus#1
:no:lau s_dis fem
:le:lex
@@ -773,7 +776,7 @@
:le:Libya
:no:Liby a_es fem
-:le:Lupus
+:le:Lupus#2
:no:Lup us_i masc
:le:Luscius
@@ -882,8 +885,8 @@
:le:necdum
:wd:necdum conj
-:le:niger
-:aj:nig er_ra_rum
+:le:niger#1
+:aj:ni^g er_ra_rum
:le:nihil
:wd:nihil irreg_decl3 neut sg indecl
@@ -970,17 +973,17 @@
:no:Paul a_ae fem pers_name
:no:Paull a_ae fem pers_name
-:le:pax
+:le:pax#1
:no:pa_ x_cis fem
:le:pater
:no:pa^t er_ris masc
:le:pecus#1
-:no:pec or_oris neut
+:no:pe^c us_oris neut
:le:pecus#2
-:no:pecu s_dis masc fem
+:no:pe^cu s_dis masc fem
:le:Penates
:no:pena_t is_is masc pl
@@ -1058,8 +1061,9 @@
:le:prex
:no:pre^ x_cis fem
-:le:princeps
-:no:pri_nc eps_ipis masc
+:le:princeps#1
+:no:pri_nc eps_ipis masc fem
+:aj:pri_nc eps_ipis
:le:prior
:wd:priusquam adverb
@@ -1099,6 +1103,7 @@
:wd:quia conj
:le:quies#1
+:no:qui^e_ s_tis fem
:wd:quie irreg_nom3 abl fem sg early
:le:quin
@@ -1110,12 +1115,12 @@
:le:quinquaginta
:wd:qui_nqua_ginta_ numeral
-:le:quinque
+:le:quinque#1
:wd:qui_nque numeral
-:le:quintus#2
-:no:Qui_nt us_i masc
-:no:Qui_nt a_ae fem
+:le:Quintus#2
+:no:Qui_nt us_i masc pers_name
+:no:Qui_nt a_ae fem pers_name
:le:quodsi
:wd:quodsi_ conj
@@ -1135,7 +1140,7 @@
:le:res
:no:r es_ei fem
-:le:Rex
+:le:Rex#2
:no:Re_ x_gis masc pers_name
:le:robur
@@ -1161,16 +1166,18 @@
:wd:sexa_gie_s numeral
:wd:sexa_giens numeral
-:le:secus
-:wd:secus adverb
-:aj:sequi or_us_comp irreg_comp
+:le:secus#1
+:wd:se^cus indecl neut
:le:setius
:wd:se_tius adverb comp
-:le:sed
-:wd:sed conj
-:wd:set conj
+:le:sed#1
+:wd:se^d conj
+:wd:se^t conj
+
+:le:sed#2
+:wd:se_d prep
:le:semel
:wd:semel adverb
@@ -1204,6 +1211,7 @@
:le:si
:wd:si_ conj
+:wd:sei_ conj orth
:le:sive
:wd:si_ve conj
@@ -1273,7 +1281,7 @@
:no:Tiber is_idis masc
:no:Tibr is_idis masc
-:le:tigris
+:le:tigris#1
:no:tigr is_idos masc fem
:no:tigr is_is masc fem
diff --git a/stemlib/Latin/stemsrc/nom.smithgeo b/stemlib/Latin/stemsrc/nom.smithgeo
index 02167d59..d457e941 100755
--- a/stemlib/Latin/stemsrc/nom.smithgeo
+++ b/stemlib/Latin/stemsrc/nom.smithgeo
@@ -8895,7 +8895,7 @@
:le:Laurium
:no:Laur ius_i neut
-:le:Laus
+:le:Laus#2
:no:La us_i masc
:le:Lausonius
diff --git a/stemlib/Latin/stemsrc/vbs.latin b/stemlib/Latin/stemsrc/vbs.latin
index 229271ba..868e1db1 100755
--- a/stemlib/Latin/stemsrc/vbs.latin
+++ b/stemlib/Latin/stemsrc/vbs.latin
@@ -2365,6 +2365,10 @@
:de:co^ax are_vb
:le:cocionor
:de:co_ci^o_n are_vb dep
+:le:coeo
+:vs:co^- conj4
+:vs:co^-i^ perfstem
+:vs:co^-i^t pp4
:le:coemo
:vs:co^-e^m conj3
:vs:co^-e_m perfstem
@@ -4959,6 +4963,13 @@
:de:dict are_vb
:le:dicturio
:de:dictu^r ire_vb
+:le:dido#1
+:vs:di_-d conj3
+:vs:dis-d conj3 orth
+:vs:di_-di^d perfstem
+:vs:dis-di^d perfstem orth
+:vs:di_-di^t pp4
+:vs:dis-di^t pp4 orth
:le:diduco
:vs:di_-du_c conj3
:vs:di_-du_x perfstem
diff --git a/tests/README_ASSERTIONS.md b/tests/README_ASSERTIONS.md
new file mode 100644
index 00000000..12fb27ed
--- /dev/null
+++ b/tests/README_ASSERTIONS.md
@@ -0,0 +1,22 @@
+## Lemma assertion tests (latin_assertions_*.txt)
+
+Format: `form lemma1 lemma2 ...`, optional trailing
+`(commentary)` ignored by the harness. Multiple lines for the
+same form are unioned into one expected set.
+
+File names reflect which stemsrc file was under investigation
+when the regression was found and NOT which file the underlying
+fix lives in. A single word's analysis is often split across
+several stemsrc files (nom.latin.bas, ls.nom, vbs.latin, ...),
+so there is no clean one-file-per-source mapping.
+
+Before adding a new assertion, grep all existing
+latin_assertions_*.txt for the headword -- it may already be
+tracked under a different file's name. Occasionally run:
+```bash
+ awk '/^#|^$/{next} { sub(/\(.*/,""); if (NF<2) next; if (!seen[$1 SUBSEP FILENAME]++) filecount[$1]++ } END { for (w in filecount) if (filecount[w]>1) print w }' tests/latin_assertions*.txt
+```
+to catch a form asserted in more than one file.
+
+New investigative work gets its own new latin_assertions_.txt
+-- the run_tests.sh loop picks up any matching file automatically.
\ No newline at end of file
diff --git a/tests/latin_assertions_nom_lat_bas.txt b/tests/latin_assertions_nom_lat_bas.txt
new file mode 100644
index 00000000..f8dfa016
--- /dev/null
+++ b/tests/latin_assertions_nom_lat_bas.txt
@@ -0,0 +1,149 @@
+# form required lemma
+
+acer acer#1 (maple-tree)
+acer acer#2 (m. acris, Enn.)
+
+an an#1
+
+assiduus assiduus#1 (from as-do)
+assiduus assiduus#2 (from assideo)
+
+aula aula#1 (front court of a Grecian house)
+aula aula#2 (old form for 'olla', 'pot')
+
+canibus canis#1
+Canibus Canis#2 (a small river tributary to the Po)
+Canis Canis#2 Cana Canae
+
+casuum casus#1
+Casus Casus#2 (a river of Albania)
+
+celer celo (to hide)
+celer celer#1
+Celer Celer#2 (Roman cognomen)
+Celer Celer#3 (v. Celeres)
+
+celsus celsus#1 (of old cello "to rise high")
+Celsus Celsus#2 (Roman cognomen)
+
+coitus coeo (to assemble/meet)
+coitus coitus#1 (assembled)
+coitus coitus#2 (a meeting)
+
+congeries congeries
+
+disdo dido#1 (to give out, spread abroad)
+dido dido#1 (to give out, spread abroad)
+Dido Dido#2 (foundress of Carthage)
+
+#dis#3, the inseparable particule is not analyzed on its own
+Dis Dis#2 (name)
+dis deus (god)
+dis dis#1 (rich, alternate of 'dives')
+ditior dis#1
+ditissimus dis#1
+dives dives
+divitior dives
+divitissimus dives
+
+fides fido
+fides fides#1
+fides fides#2 (instrument)
+
+foris forio (to defecate/shit)
+foris foris#1 (door)
+foris foris#2 (outdoors)
+foris forum (open space)
+foris forus#2 (old form for 'forum')
+foris fori (another form for 'forus')
+foris forus#1 (nautical gangway)
+
+fraudis fraus#1 (fraud)
+Fraus Fraus#2 (goddess mentioned once in Cicero)
+
+hortensius hortensis (belonging to a garden)
+hortensius hortensius#1 (belonging to a garden)
+Hortensius Hortensius#2 (Roman gens)
+
+in in#1 (preposition; in#2 the negation prefix is not analyzed copying the -ne behavior and others)
+
+inter inter#1 (there is no inter2 in the L&S dictionary, it's a source file error)
+
+laus laus#1 (praise)
+Laus Laus#2 (name of a few cities)
+
+lupus lupus#1
+Lupus Lupus#2 (surname in gens Rutilia)
+
+magnus magnus#1
+Magnus Magnus#2 (Roman surname)
+
+ne ne#1 (adv.; interrogative/enclitic particle not analyzed)
+ne ne#3 (incorrect for 'nae')
+ne neo#1 (to spin)
+
+nigrum niger#1 (black)
+Niger Niger#2 (Roman surname)
+Niger Niger#3 (African river)
+
+parens pareo
+parens parens#1 (appearing)
+parens parens#2 (parent)
+
+paulum paulum (adverb 'a little')
+paulum paulus#1 (small)
+Paulum Paulus#2 (Roman surname)
+
+pacis pax#1 (peace)
+Pax Pax#2 (a slave in Plautus' Trinummus)
+
+pecus pecus#1 (cattle)
+pecus pecus#2 (herd animal)
+pecus pecus#3 (= pecus#1, rare masc. u-stem variant)
+
+per per#1 (there is no per2 in the L&S dictionary, it's a source file error)
+
+polus polus#1
+Polus Polus#2 (Greek tragic actor)
+
+princeps princeps#1 (foremost)
+Princeps Princeps#2 (flute player in Phaedr.)
+
+pro pro#1 (for)
+pro pro#2 (alas!)
+
+promptus promptus#1 (manifest)
+promptus promptus#2 (readiness)
+
+pubes pubes#1 (adult)
+pubes pubes#2 (adulthood)
+
+quies quies#1 (quietness)
+quies quies#2 (quiet, alternative of 'quietus')
+
+quinque quinque#1 (L&S quinque#2 for Plautus' Casina meaning 'et quin', probably better NOT added as analysis)
+
+quintus quintus#1
+Quintus Quintus#2 (Roman praenomen)
+Quinta Quintus#2
+
+rex rex#1 (king)
+Rex Rex#2 (Roman surname)
+
+secus secus#1 (indeclinable for 'sexus')
+secus secus#2 (adverb and prep)
+
+sed sed#1 (conj)
+sed sed#2 (prep. 'without')
+sed sed#3 (alternative form of pronoun 'sē')
+
+super supo (to throw/scatter)
+super super#1 (L&S refers to superus)
+super super#2 (on top)
+
+tigridis tigris#1 (tiger)
+tigris tigris#1 (tiger)
+Tigridis Tigris#2 (the Asian river)
+
+uber uber#1 (lactating breast)
+uber uber#2 (fruitful)
\ No newline at end of file
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 548e9d3a..aa39acc8 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -69,6 +69,70 @@ run_cruncher_test() {
rm -f /tmp/morpheus_test_$$.txt
}
+run_assert_test() {
+ local flags="$1" file="$2"
+ [ -f "$file" ] || return
+
+ local filename
+ filename=$(basename "$file")
+ echo "=== Assertions: $filename ==="
+
+ # AWK: Group lemmas, skip comments, chop '(', and handle "" for empty sets
+ local aggregated
+ aggregated=$(awk '/^#|^$/ {next} {
+
+ # 1. Ignore everything from "(" to the end of the line
+ sub(/\(.*/, "")
+
+ if (NF < 2) next
+
+ word = $1
+ if (!(word in map)) {
+ order[++count] = word
+ map[word] = "" # Initialize empty in case it is just ""
+ }
+ for(i=2; i<=NF; i++) {
+ # Skip arrow and our empty set marker
+ if ($i == "->") continue
+ if ($i == "\"\"") continue
+
+ map[word] = map[word] " " $i
+ }
+ } END {
+ for(i=1; i<=count; i++) {
+ print order[i] map[order[i]]
+ }
+ }' "$file")
+
+ # Loop through the grouped data
+ while read -r form expected_str; do
+ [ -z "$form" ] && continue
+
+ # Get actual output, remove 'form:', sort alphabetically, format as one line
+ actual=$(echo "$form" | "$CRUNCHER" $flags 2>/dev/null | grep -v '^form:' | sort | tr '\n' ' ' | sed 's/ *$//')
+
+ # Format the expected string (sort alphabetically and remove duplicates)
+ expected=$(echo "$expected_str" | tr ' ' '\n' | sort | uniq | tr '\n' ' ' | sed 's/ *$//')
+
+ # Format for display so empty strings show up as "" in the terminal logs
+ disp_expected=${expected:-\"\"}
+ disp_actual=${actual:-\"\"}
+
+ if [ "$actual" = "$expected" ]; then
+ echo "PASS: '$form' -> $disp_expected"
+ else
+ echo "FAIL: $form"
+ echo " expected: [$disp_expected]"
+ echo " got: [$disp_actual]"
+ FAILURES=$((FAILURES + 1))
+ fi
+ done <<< "$aggregated"
+ echo ""
+}
+
+for assert_file in "$SCRIPT_DIR"/latin_assertions*.txt; do
+ run_assert_test "-Ll" "$assert_file"
+done
GP="$SCRIPT_DIR/greek_probe.txt"
LP="$SCRIPT_DIR/latin_probe.txt"