From 4da1072455c750dcafe283ec05f48869a9be2b17 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 01:28:36 +0000 Subject: [PATCH] Re-source the magnitudes across all five trade routes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ladder was sampling eastward only — Turkic, Mongolic, Indic. It now takes one magnitude from each of the routes the state actually runs, each borrowed for its own original magnitude and then lexicalized as a power of TWELVE: çenāj 12² Adriatic Venetian centinaio, a hundred-count tüsaç 12³ East Corridor Slavic tysjača mürās 12⁴ Black Sea Greek myriás, the myriad laxô 12⁵ Silk Road Persian lakh krōr 12⁶ Red Sea Persian kurūr, the far-trade great number Each digested until the source is gone: centinaio → çentināj → çentnāj (unstressed -i- syncopates) → çenāj (/ntn/ sheds its stop) tysjača → tüsjača → tüsjaç (final -a apocopates) → tüsaç (glide absorbed) myriás → müriās → mürās (unstressed -i- syncopates before the long vowel) kurūr → krūr (unstressed u- syncopates) → krōr (ū lowers under stress) The ladder is a map read outward from home — Adriatic, then the corridor, then the Black Sea, then the Silk Road, then the Red Sea. The bigger the number, the further from home the word came from. Adjacent magnitudes fuse into opaque bricks rather than standing as phrases: mürās tüsaç → mürāstüsaç → mürāstüs → murastüs 22,464 laxô mürās → laxômürās → laxmürās → laxmur 269,568 krōr laxô → krōrlaxô → krōllaxô → krōlaxô → krōlax 3,234,816 2,108 headwords. Canon self-check 0 failures; every value round-trips. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01TxQoFo14ErhNS6dDb6JrN8 --- data/dictionary.tsv | 16 ++++++++-------- numbers.html | 30 ++++++++++++++++-------------- tools/build_numbers.py | 30 ++++++++++++++++-------------- 3 files changed, 40 insertions(+), 36 deletions(-) diff --git a/data/dictionary.tsv b/data/dictionary.tsv index f3656c8..605f7df 100644 --- a/data/dictionary.tsv +++ b/data/dictionary.tsv @@ -112,7 +112,6 @@ benedīçômus blessing benedīçā to bless (Romance/Latin church) bex five bidô please (Low German) -bin 1,728, 12³ — picked up on the road east out of the Black Sea bir one bjefā to bark (Scandinavian bjeffe) blasfemī blasphemy (Romance/Greek-Latin) @@ -513,7 +512,6 @@ jūni June jūnôr youth, young person jūr root — of a plant or tree; also root vegetable jūst cheese -jūz 144, 12² — a gross; the counting-house at home jǟ ice jǟdô ice-cold jǟmä to stay, remain @@ -711,7 +709,9 @@ krāgô collar, neckline (Low German) krāmô small goods, wares (Marīsô, slav) krāmôr vendor, wares-seller (Marīsô, slav) krīs unofficial, provisional, binding in name only — a rule, permit, or promise everyone treats as a formality; symbolic compliance (folk origin, now opaque: 'written in chalk') +krōlax 3,234,816 (12⁶+12⁵) — krōr laxô eroded into one root krōm crooked; dishonest, corrupt (coarse) +krōr 2,985,984, 12⁶ — the Red Sea; Persian kurūr digested krūpā to crawl (Low German krupen) krūçôfiks crucifix, rood (technical; -fiks frozen) krūçôveç cross-water, holy water (folk term; formal is sakrôveç) @@ -803,11 +803,9 @@ kēļkôrd grammar kēļôr grammarian kīl keel (Low German Kiel) kōbô cave, cavern (Livonian) -kōdī 2,985,984, 12⁶ — the end of the road, where it meets the sea kōit dawn, first light (Livonian) kōju homeward, home (to) kōk cake, sweet bread -kōlax 3,234,816 (12⁶+12⁵) — kōdī laxô fused by erosion kōlôr color kōrjā to gather, collect kōrrô to run @@ -845,8 +843,8 @@ latik bream (Livonian) lauk garlic lavērā to tack, to beat to windward (Low German lavéren) lax salmon (Scandinavian laks) -laxtum 269,568 (12⁵+12⁴) — laxô tūm fused by erosion -laxô 248,832, 12⁵ — the far markets, where the road turns south +laxmur 269,568 (12⁵+12⁴) — laxô mürās eroded into one root +laxô 248,832, 12⁵ — the Silk Road; Persian lakh digested laçertô lizard (Romance/Latin lacerta) legitīm legitimate (Romance/Latin) Legmō Netherlands (exonym, "low-land") @@ -1033,6 +1031,7 @@ muigā to smile (Livonian) mult many, much mumbõ about, roughly (approx.) muntāñ mountain +murastüs 22,464 (12⁴+12³) — mürās tüsaç eroded into one root murdā to break, snap — of a bone (Livonian) muretõ to worry murk carrot @@ -1065,6 +1064,7 @@ müristä to thunder müristü thunder mürk poison (Livonian) mürkäm the poisoned ground — the hostile away-arena (mürk + -äm place-suffix) +mürās 20,736, 12⁴ — the Black Sea; Greek myriás digested müä to sell (colloq.) müük sale; for sale mā earth @@ -1811,7 +1811,6 @@ tulevô future, coming tulvô flood tulvā to flood, overflow tulē to come -tumbôn 22,464 (12⁴+12³) — tūm bin fused by erosion tumô dull, matte tundô to feel tunnõl tunnel, polytunnel (international) @@ -1840,6 +1839,7 @@ tühjä empty; to empty out tühjā to drain, empty out tühjādôt emptied, drained tükä to set out, depart +tüsaç 1,728, 12³ — the Eastern Corridor; Slavic tysjača digested tāgô dough tām oak (Livonian) tārgô market stall (Marīsô, slav) @@ -1860,7 +1860,6 @@ tōl toll, fee; (vulgar) bribe, payoff (coarse) tōlpreverô toll-priest, fee-taking priest (hostile/folk; dockside insult for clergy who sell blessings) tōn tuna (Saharan/Mediterranean tūn) tōnô note, tone (Romance) -tūm 20,736, 12⁴ — the caravan reckoning of the steppe stages tūom bird-cherry (Livonian tūom) tūļ wind tūļkuiv wind-dried (tūļ 'wind' + kuiv) @@ -2049,6 +2048,7 @@ xȫvlā to skate (Low German) çent a hundred = 144, the square of the base (Latin centum) çentenār the hundredweight — çent librô, 144 pounds (Latin centenarium); the Zentner çenô bargain price, street price (Marīsô, slav) +çenāj 144, 12² — the Adriatic counting-house; Venetian centinaio digested çera wax; sealing-wax, the wax pressed under a seal on a document (Romance/Latin cera; the law-and-ledger register, cf. sīgel) çeñ shadow (Marīsô, slav; cf. çenô bargain-price — distinct) çeñôr the shadow, the eraser — the specialist whose job is to remove one opponent (çeñ + -ôr) diff --git a/numbers.html b/numbers.html index 1a156fd..0507e4e 100644 --- a/numbers.html +++ b/numbers.html @@ -205,21 +205,23 @@ const TEEN=[ ["dürdok","düzin dokūz","d- onset; final -ūz falls, as in dürsek"], ["dürn","düzin on","vowel-initial: the o- syncopates, leaving n as a bare coda"], ["dürjaz","düzin jāz","j- onset; the long ā shortens under the loss of its own stress"]]; -const DUNA="düzin", GROSO="jūz"; +const DUNA="düzin"; /* THE LADDER IS A MAP. Small numbers are home; each order of magnitude was picked up one stage further out along the road, at the moment the trade needed a number that large — and lexicalized on arrival as a power of TWELVE rather than of ten. Baltic counting-house → the Mediterranean and the Alpine passes → the length of the silk road. You can read the empire's reach off its own numerals. Each was digested by the same phonology that later fuses them. */ -const MAG={ 2:["jūz","12² · a gross — the counting-house at home"], - 3:["bin","12³ · the road east out of the Black Sea"], - 4:["tūm","12⁴ · the caravan reckoning of the steppe stages"], - 5:["laxô","12⁵ · the far markets, where the road turns south"], - 6:["kōdī","12⁶ · the end of the road, where it meets the sea"] }; -const FUSE={ "4+3":["tumbôn","tūm bin → tūmbin (juncture) → tūmbôn (i reduces to ô) → tumbôn (ū shortens)"], - "5+4":["laxtum","laxô tūm → laxôtūm → laxtūm (medial -ô- syncopates) → laxtum (ū shortens)"], - "6+5":["kōlax","kōdī laxô → kōdīlaxô → kōdlaxô (-ī- syncopates) → kōllaxô (/dl/ assimilates) → kōlaxô (degemination) → kōlax (final -ô apocopates)"] }; +const MAG={ 2:["çenāj","12² · Adriatic — Venetian centinaio, a hundred-count. çentināj → çentnāj (unstressed -i- syncopates) → çenāj (the /ntn/ cluster sheds its stop)"], + 3:["tüsaç","12³ · Eastern Corridor — Slavic tysjača. tüsjača → tüsjaç (final -a apocopates) → tüsaç (the glide -j- is absorbed)"], + 4:["mürās","12⁴ · Black Sea — Greek myriás, the myriad. müriās → mürās (unstressed -i- syncopates before the long vowel)"], + 5:["laxô","12⁵ · Silk Road — Persian lakh. The retroflex/aspirate lands on Nelôxi x [ʃ]; -ô is supplied as the native final"], + 6:["krōr","12⁶ · Red Sea — Persian kurūr, the far-trade great number. kurūr → krūr (unstressed u- syncopates) → krōr (ū lowers to ō under stress)"] }; +/* Adjacent magnitudes do not stand as separate words — they erode and fuse into + one opaque brick. Keyed "higher+lower", both with coefficient one. */ +const FUSE={ "4+3":["murastüs","mürās tüsaç → mürāstüsaç (juncture) → mürāstüs (the second root is clipped of its final syllable, as düzin → düz-) → murastüs (ā shortens, having lost the word's stress peak)"], + "5+4":["laxmur","laxô mürās → laxômürās (juncture) → laxmürās (medial -ô- syncopates) → laxmur (the final -ās is clipped away)"], + "6+5":["krōlax","krōr laxô → krōrlaxô (juncture) → krōllaxô (/rl/ assimilates) → krōlaxô (degemination) → krōlax (final -ô apocopates)"] }; /* The Turkish tens re-pointed from ten to twelve. They are already OPAQUE — jirmī, otūz, kôrk, ellī are not derivable from ikī, üç, dört, bex — so the dozens come out as single unglued words for free. @@ -317,7 +319,7 @@ function fold(s){ .replace(/ō/g,"o").replace(/ū/g,"u").replace(/ñ/g,"n").replace(/ç/g,"c") .replace(/ä/g,"a").replace(/ö/g,"o").replace(/ü/g,"u").replace(/õ/g,"o"); } -const UNITW={ [fold(DUNA)]:12, [fold(GROSO)]:144 }; +const UNITW={ [fold(DUNA)]:12 }; const MAGW={}; Object.keys(MAG).forEach(k=>MAGW[fold(MAG[k][0])]=Math.pow(12,+k)); const FUSEW={}; Object.keys(FUSE).forEach(k=>{ const [hi,lo]=k.split("+").map(Number); @@ -605,10 +607,10 @@ $("q").addEventListener("input",draw); /* ── self-check: the canon examples must come out exactly as written ───────── */ (function(){ - const MUST=[[0,"sôfôr"],[11,"jāz"],[12,"düzin"],[13,"dürber"],[14,"dürkī"], - [22,"dürn"],[24,"jirmī"],[41,"otūz bex"],[120,"langhunt"],[132,"jāzlôk"], - [144,"jūz"],[157,"jūz dürber"],[1728,"bin"],[20736,"tūm"],[248832,"laxô"], - [Math.pow(12,6),"kōdī"],[22464,"tumbôn"],[269568,"laxtum"],[3234816,"kōlax"]]; + const MUST=[[0,"sôfôr"],[11,"jāz"],[12,"düzin"],[13,"dürber"],[22,"dürn"], + [24,"jirmī"],[120,"langhunt"],[132,"jāzlôk"],[144,"çenāj"],[1728,"tüsaç"], + [20736,"mürās"],[248832,"laxô"],[Math.pow(12,6),"krōr"], + [22464,"murastüs"],[269568,"laxmur"],[3234816,"krōlax"]]; const bad=MUST.filter(([n,w])=>cardinal(n)!==w) .map(([n,w])=>`${n}: got "${cardinal(n)}", canon "${w}"`); /* every value must also read back to itself */ diff --git a/tools/build_numbers.py b/tools/build_numbers.py index d051398..fd8b027 100644 --- a/tools/build_numbers.py +++ b/tools/build_numbers.py @@ -223,21 +223,23 @@ const TEEN=[ ["dürdok","düzin dokūz","d- onset; final -ūz falls, as in dürsek"], ["dürn","düzin on","vowel-initial: the o- syncopates, leaving n as a bare coda"], ["dürjaz","düzin jāz","j- onset; the long ā shortens under the loss of its own stress"]]; -const DUNA="düzin", GROSO="jūz"; +const DUNA="düzin"; /* THE LADDER IS A MAP. Small numbers are home; each order of magnitude was picked up one stage further out along the road, at the moment the trade needed a number that large — and lexicalized on arrival as a power of TWELVE rather than of ten. Baltic counting-house → the Mediterranean and the Alpine passes → the length of the silk road. You can read the empire's reach off its own numerals. Each was digested by the same phonology that later fuses them. */ -const MAG={ 2:["jūz","12² · a gross — the counting-house at home"], - 3:["bin","12³ · the road east out of the Black Sea"], - 4:["tūm","12⁴ · the caravan reckoning of the steppe stages"], - 5:["laxô","12⁵ · the far markets, where the road turns south"], - 6:["kōdī","12⁶ · the end of the road, where it meets the sea"] }; -const FUSE={ "4+3":["tumbôn","tūm bin → tūmbin (juncture) → tūmbôn (i reduces to ô) → tumbôn (ū shortens)"], - "5+4":["laxtum","laxô tūm → laxôtūm → laxtūm (medial -ô- syncopates) → laxtum (ū shortens)"], - "6+5":["kōlax","kōdī laxô → kōdīlaxô → kōdlaxô (-ī- syncopates) → kōllaxô (/dl/ assimilates) → kōlaxô (degemination) → kōlax (final -ô apocopates)"] }; +const MAG={ 2:["çenāj","12² · Adriatic — Venetian centinaio, a hundred-count. çentināj → çentnāj (unstressed -i- syncopates) → çenāj (the /ntn/ cluster sheds its stop)"], + 3:["tüsaç","12³ · Eastern Corridor — Slavic tysjača. tüsjača → tüsjaç (final -a apocopates) → tüsaç (the glide -j- is absorbed)"], + 4:["mürās","12⁴ · Black Sea — Greek myriás, the myriad. müriās → mürās (unstressed -i- syncopates before the long vowel)"], + 5:["laxô","12⁵ · Silk Road — Persian lakh. The retroflex/aspirate lands on Nelôxi x [ʃ]; -ô is supplied as the native final"], + 6:["krōr","12⁶ · Red Sea — Persian kurūr, the far-trade great number. kurūr → krūr (unstressed u- syncopates) → krōr (ū lowers to ō under stress)"] }; +/* Adjacent magnitudes do not stand as separate words — they erode and fuse into + one opaque brick. Keyed "higher+lower", both with coefficient one. */ +const FUSE={ "4+3":["murastüs","mürās tüsaç → mürāstüsaç (juncture) → mürāstüs (the second root is clipped of its final syllable, as düzin → düz-) → murastüs (ā shortens, having lost the word's stress peak)"], + "5+4":["laxmur","laxô mürās → laxômürās (juncture) → laxmürās (medial -ô- syncopates) → laxmur (the final -ās is clipped away)"], + "6+5":["krōlax","krōr laxô → krōrlaxô (juncture) → krōllaxô (/rl/ assimilates) → krōlaxô (degemination) → krōlax (final -ô apocopates)"] }; /* The Turkish tens re-pointed from ten to twelve. They are already OPAQUE — jirmī, otūz, kôrk, ellī are not derivable from ikī, üç, dört, bex — so the dozens come out as single unglued words for free. @@ -335,7 +337,7 @@ function fold(s){ .replace(/ō/g,"o").replace(/ū/g,"u").replace(/ñ/g,"n").replace(/ç/g,"c") .replace(/ä/g,"a").replace(/ö/g,"o").replace(/ü/g,"u").replace(/õ/g,"o"); } -const UNITW={ [fold(DUNA)]:12, [fold(GROSO)]:144 }; +const UNITW={ [fold(DUNA)]:12 }; const MAGW={}; Object.keys(MAG).forEach(k=>MAGW[fold(MAG[k][0])]=Math.pow(12,+k)); const FUSEW={}; Object.keys(FUSE).forEach(k=>{ const [hi,lo]=k.split("+").map(Number); @@ -623,10 +625,10 @@ $("q").addEventListener("input",draw); /* ── self-check: the canon examples must come out exactly as written ───────── */ (function(){ - const MUST=[[0,"sôfôr"],[11,"jāz"],[12,"düzin"],[13,"dürber"],[14,"dürkī"], - [22,"dürn"],[24,"jirmī"],[41,"otūz bex"],[120,"langhunt"],[132,"jāzlôk"], - [144,"jūz"],[157,"jūz dürber"],[1728,"bin"],[20736,"tūm"],[248832,"laxô"], - [Math.pow(12,6),"kōdī"],[22464,"tumbôn"],[269568,"laxtum"],[3234816,"kōlax"]]; + const MUST=[[0,"sôfôr"],[11,"jāz"],[12,"düzin"],[13,"dürber"],[22,"dürn"], + [24,"jirmī"],[120,"langhunt"],[132,"jāzlôk"],[144,"çenāj"],[1728,"tüsaç"], + [20736,"mürās"],[248832,"laxô"],[Math.pow(12,6),"krōr"], + [22464,"murastüs"],[269568,"laxmur"],[3234816,"krōlax"]]; const bad=MUST.filter(([n,w])=>cardinal(n)!==w) .map(([n,w])=>`${n}: got "${cardinal(n)}", canon "${w}"`); /* every value must also read back to itself */ -- knotmirror 0.0.1