Consolidation session — 2026-06-10 (gate complete: guardrail won, affix capacity fork)
A full-day session that closed the countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. and affix levers, ran the v1.0.0 consolidation (every proven lever in one modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.'), and then ran three corrective iterations (Runs A/B/C) under two DeepSeek consults. The campaign is now STOPPED at the treadmill guard with a decisive result: the consolidation's guardrail win is large, real, and stable across every variant — and the affix split has a demonstrated stability ceiling at 29M params that no sampling-weightparameterA single learned number inside a model — one weight or bias. Mailwoman's encoder has roughly 30 million of them; training is the search for good values. recipe clears. A ship/re-baseline/escalate decision is pending operator review (see "The fork" below).
STATUS: no run in flight. All GPU work stopped per the treadmill guard (two-opposite-direction failures = fork = no further recipe iteration). CheckpointscheckpointA saved snapshot of the model weights and optimizer state during training. Mailwoman saves a checkpoint periodically so training can resume after a GPU hang.: the clean consolidation
step-040000, Run C'sstep-042000(transient peak) andstep-055000(decayed) live inoutput-v100-consolidation-s42/checkpoints; Run B'sstep-020000inoutput-v101-runB-s42/checkpoints. All four gated fp32fp32 / fp1632-bit and 16-bit floating-point formats. Mailwoman trains in bf16 (a 16-bit variant) and exports the ONNX model in int8 for size. below.
Final result — Run C and the transient-decay finding
Run C (resume clean step-040000, synth-affix 20.0, suffix-tag-4.0, 15k steps) settled
the open question, negatively and informatively:
- At step-042000 (2k in): affix prefix 75.0 / suffix 55.8 — exactly reproducing
the diagnostic, confirming Run B's
init_from(fresh optimizeroptimizerThe component that decides how to update parameters from the gradient — Adam/AdamW being the common choice, adding momentum and per-parameter scaling on top of plain gradient descent.) was a real confound: momentum (resume) is required to enter the affix basin at all. - At step-055000 (15k in): prefix decayed 75 → 52.9, suffix 48.8, and the prolonged 20× density damaged the guardrail: FR regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. collapsed to 5.3 (from ~25), US postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 97.4 → 94.9, unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. 92.1 → 88.5.
Conclusion: the affix-75 peak is a TRANSIENT, not an equilibrium. The modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' can briefly represent the affix split at solo level but cannot hold it under the full data distribution; sustained density high enough to reach it starves the rest. Combined with the stable ~65 ceiling at moderate density (Runs A/B) and US streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. stuck at ~74–76.5 in every variant (canonical bar 80.4), this is a demonstrated capacity/stability constraint at 29M params — a fork, not a tuning problem. (DeepSeek's two predictions here — "5× clears ≥72" and "75 is not a transient, suffix will asymptote" — were both falsified; the operator's treadmill guard and the original capacity-competition hypothesis were right.)
TrainingtrainingThe process of adjusting a model's parameters so its predictions match labeled examples, by repeatedly measuring error and nudging the weights to reduce it. Distinct from inference, when the trained model is run on new input.-gate scorecard (canonical config bars, all fp32fp32 / fp1632-bit and 16-bit floating-point formats. Mailwoman trains in bf16 (a 16-bit variant) and exports the ONNX model in int8 for size., gaz-fed + suppress):
| tag | gate | v1.0.0 (40k) | Run A (5×) | Run B (17×, init_from) | Run C @42k | Run C @55k |
|---|---|---|---|---|---|---|
| affix street_prefix | ≥78 | 27.6 | 64.9 | 64.9 | 75.0 | 52.9 ⬇ |
| affix street_suffix | ≥67 | 42.1 | 52.4 | 48.8 | 55.8 | 48.8 |
| US streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. | ≥80.4 | 76.0 | 76.0 | 76.2 | 74.3 | 76.5 — fails everywhere |
| US postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. | ≥97 | 95.8 | 96.1 | 97.3 ✓ | 97.4 ✓ | 94.9 ⬇ |
| countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. homographhomonymyOne surface, many referents: 'Georgia' is a US state in 'Atlanta, Georgia' and a country in 'Tbilisi, Georgia.' Handled by disambiguation, split across two stages — the parser resolves the tag from in-string context; the resolver late-binds the referent with geographic context. | ≥83.3 | 87.5 ✓ | 85.7 ✓ | 89.8 ✓ | 83.3 ✓ | 85.1 ✓ |
| unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. | ≥92 | 92.1 ✓ | 90.6 | 90.6 | 92.1 ✓ | 88.5 ⬇ |
| US micro | ≥81.6 | 85.5 ✓ | 85.5 ✓ | 84.8 ✓ | 85.0 ✓ | 85.3 ✓ |
| US localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. / regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. | ≥62.2/≥80.1 | 75.9/89.7 ✓ | 75.9/89.9 ✓ | 72.9/89.1 ✓ | 74.5/89.5 ✓ | 75.5/89.6 ✓ |
| FR postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. / hn | ≥99.5/≥91 | 99.6/92.3 ✓ | 99.5/93.0 ✓ | 99.7/94.6 ✓ | 99.6/92.8 ✓ | 99.6/92.7 ✓ |
| FR regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. (hold ~25) | — | ~25 | 21.7 | 27.6 | 24.7 | 5.3 — collapsed |
| DE native loc | ≥83.8 | 90.7 ✓ | 90.7 ✓ | 90.7 ✓ | — | — |
No variant passes the full canonical gate. The misses are consistent: affix below the
solo 78/67 everywhere stable, and US streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. −4 to −6 vs v0.9.8 everywhere (a real guardrail
regression of the consolidation itself, likely the affix-split pressure costing plain
street precisionprecisionOf the spans the model labeled as a given tag, the fraction it got right. High precision means few false positives. Paired with recall to compute F1.).
The fork — decision pending operator review
Per the treadmill guard, no further recipe iteration. Three options, stated:
- Re-baseline with reason + ship Run B as v4.2.0 (recommended). Run B is the strongest stable modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.': US postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 97.3 ✓, countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. 89.8 ✓ (best ever), FR ✓ (hn 94.6 best ever), DE ✓, micro/localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy./regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. far above v4.1.0. Stated re-baselines it needs: affix 64.9/48.8 (vs solo 78/67 — still infinitely better than the shipped v4.1.0's 0/0; the tag exists and fires at P≈100), US streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. 76.2 (−4.2 vs v0.9.8, −2.3 vs v4.1.0 — the one true regression vs the shipped default), unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. 90.6 (−1.5). Then the full SHIP gate (below) before tagging.
- Architecture escalation (DeepSeek's named path, now evidence-backed): wider modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' (~48M) or a dedicated affix headattention headOne of several parallel attention computations in a layer, each free to focus on a different kind of relationship between tokens. Their outputs are concatenated — 'multi-head attention'. Mailwoman uses 4 heads. with shared backbone. A funded next-campaign item — the transient proves the representation exists; stability is what's missing.
- Don't ship — keep v4.1.0 default, bank the findings + salvaged evalsevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error., proceed to the queue (#478) and revisit after the architecture work.
Recommendation: 1 + queue 2, with the US-streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. −2.3-vs-shipped called out to review as the main ship-risk. The guardrail win (localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. +13–16, regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. +11, countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. 0→89.8, FR/DE recovered, micro +4.6) is too large to shelve over tags that were 0 in the shipped modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.'.
EvalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error.-procedure note (for whoever reruns these): the gaz-trained modelsneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' MUST be
evaluated with --gazetteer-lexicon + --suppress-gaz-near-postcode; without them
score-affix zero-fills the clue and reports a fake affix crash.
3. TrainingtrainingThe process of adjusting a model's parameters so its predictions match labeled examples, by repeatedly measuring error and nudging the weights to reduce it. Distinct from inference, when the trained model is run on new input.-gate targets + the trajectory so far (historical, superseded by the scorecard above):
The gate targets below are the CANONICAL pre-registration from v1.0.0-consolidation.yaml.
(2026-06-10 correction: an earlier revision of this table had silently relaxed several — affix
72/64 vs the config's 78/67, unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. 91 vs 92, FR postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 99 vs 99.5 — and had dropped the US-streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.
row entirely. Restored to the config; see "Gate provenance & decisions" below.)
| tag | gate (config) | v1.0.0 consol | Run A (5×) | diag (2k) | Run B (17×) |
|---|---|---|---|---|---|
| affix street_prefix | ≥78 | 27.6 | 64.9 | 75.0 | 64.9 |
| affix street_suffix | ≥67 | 42.1 | 52.4 | 55.8 | 48.8 |
| countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. homographhomonymyOne surface, many referents: 'Georgia' is a US state in 'Atlanta, Georgia' and a country in 'Tbilisi, Georgia.' Handled by disambiguation, split across two stages — the parser resolves the tag from in-string context; the resolver late-binds the referent with geographic context. | ≥83.3 | 87.5 | 85.7 | 83.3 | 89.8 |
| US postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. | ≥97 | 95.8 | 96.1 | 97.4 | 97.3 |
| unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. | ≥92 | 92.1 | 90.6 | — | 90.6 |
| US streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. | ≥80.4 (v0.9.8) | 76.0 | 76.0 | — | 76.2 |
| US localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. / regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. | ≥62.2 / ≥80.1 (v0.9.8) | 75.9/89.7 | 75.9/89.9 | — | 72.9/89.1 |
| US micro | ≥81.6 (v0.9.8) | 85.5 | 85.5 | 85.0 | 84.8 |
| FR postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. / hn | ≥99.5 / ≥91 | 99.6/92.3 | 99.5/93.0 | — | 99.7/94.6 |
| DE native loc (anchor ON) | ≥83.8 | 90.7 | 90.7 | — | 90.7 |
Baselines (fp32fp32 / fp1632-bit and 16-bit floating-point formats. Mailwoman trains in bf16 (a 16-bit variant) and exports the ONNX model in int8 for size., same harness): v4.1.0 US postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 98.3 · streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. 78.5 · localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 60.0 · regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. 78.4 · micro 80.2 · FR postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 99.5 · FR hn 91.0. v0.9.8 US streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. 80.4 · localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 62.2 · regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. 80.1 · micro 81.6 · FR hn 92.0.
Gate provenance & decisions (eval discipline — no silent drift)
- countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. ≥83.3 is config-canonical (the v0.9.12 banked-lever floor, "don't regress #464"). The consolidation demonstrated 87.5, but that's a bonus, not the pre-registered bar. A first doc draft wrote ≥85; it was reconciled DOWN to the config's 83.3 — recorded here, not silent.
- affix ≥78/67 (hold v0.9.8's solo level) and US streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. ≥80.4 are the two REAL open gaps. Across v1.0.0/A/B, affix sits ~65 (Run C aims to clear via resume+density) and US streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. is stuck at ~76 (−4.4 vs v0.9.8) in every run — a genuine guardrail regression the relaxed table had hidden.
- Any future relaxation of these numbers is a STATED decision with a reason, made here. As of now, none is approved: the config gate stands. If Run C lands affix ~75/63 and streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. ~76, that is a GATE MISS to confront (re-baseline-with-reason, or iterate), not a pass.
Decision tree (with the operator's TREADMILL GUARD) — RESOLVED, kept for the record: this tree governed Runs A–C and terminated at its STOP branch. Run C's transient-decay result (affix 75→52.9 + FR-regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. collapse under sustained density, vs the stable ~65 ceiling at moderate density) is the two-opposite-directions fork in its sharpest form: density high enough for affix destroys the guardrail; density low enough for the guardrail caps affix at ~65. Per the guard, all recipe iteration stopped; the live decision is "The fork" section at the top of this doc. (Historical note: DeepSeek's pre-named capacity-tell — suffix under 55 AND countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. under 84.5 at step-8000 — was framed for a steady-stateregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. miss and did not anticipate the transient-then-decay shape; the guard caught what the tell didn't.)
4. SHIP gate — REQUIRED before tagging v4.2.0 (trainingtrainingThe process of adjusting a model's parameters so its predictions match labeled examples, by repeatedly measuring error and nudging the weights to reduce it. Distinct from inference, when the trained model is run on new input.-gate pass is necessary, NOT sufficient). The flag-plant claim is made on the artifact users get, with resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon.-coupled behavior verified:
- Honest-evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error. (VT holdout) — this modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' moved localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. +14 / regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. +10; resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon. behavior
changed and the per-tag guardrail evalsevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error. don't see resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon. interactions. Run
scripts/eval/honest-eval.sh; regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.-match + coord p50/p90 must hold vs v4.1.0 ([[project-honest-evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error.-regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.-fix]]). - Demo presets — functional tests before verdicts (house law, [[feedback-functional-before-verdict]]).
- int8 spot-check — quantize, then RE-RUN countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. + affix + per-localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. on the int8 artifact (watch the value_info-strip quant fix, [[project-v4.1.0-release]]). Claim parity on int8, not fp32fp32 / fp1632-bit and 16-bit floating-point formats. Mailwoman trains in bf16 (a 16-bit variant) and exports the ONNX model in int8 for size..
- Bookkeeping makes it real — evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error.-ledger row, dated evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error. report, re-emit the parity scorecardparity scorecardThe authoritative per-tag table tracking neural-vs-v0/Pelias F1 and resolver accuracy across head-to-head arenas. It answers 'where are we at parity, where do we still bleed?' and governs the parity campaign's priorities. at v4.2.0, and a row in releases.mdx (PR #489's "status and releases change together or not at all" contract — v4.2.0 is its first test).
5. Merge debt — these merge to main BEFORE v4.2.0 is cut (RELEASING flows from main; a modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' whose
recipe lives on an unmerged branch reproduces the #480 gap): #468 (choreography) → #469
(affix reroll) → feat/consolidation-466 (consolidation + Run A/B configs + assemblers). PR
#489 (docs/releases page) is independent + conflict-free — merge any order. Operator-gated (merge wall).
6. After the flag-plant — queue, not ad-hoc: next substantive item is #478 (arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6., zero-GPU — converts the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' wins into "pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-gate → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package. never worse than v0"). po_boxPO boxA numbered mailbox at a post office used as a delivery address instead of a physical street location. Mailwoman tags it as the po_box component; structurally the same family as a subpremise./cedexCEDEX (Courrier d'Entreprise à Distribution Exceptionnelle). A French postal routing for high-volume business mail: a CEDEX code delivers directly from a sorting centre, bypassing the local post office. A common negative-space format Mailwoman must parse. do NOT run standalone — they ride the next consolidation-class run (dilution lesson), so they're a queue slot, not a now. Lossless decomposition (the agent's "#32") is NOT in the triaged backlog — if it's the post-parity differentiator, it needs a fresh issue with a real spec + a deliberate slot in epic #488, not an ad-hoc grab.
What shipped / landed today
- CountrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. lever resolved, bookkept. v0.9.12 gazetteer anchorgazetteer anchorAn input-layer feature channel that attaches a per-token candidate-tag set from the gazetteer/codex (e.g. 'this surface is a known country-and-region') so the model conditions on lexicon membership without being overruled by it. The knowledge lives outside the weights — extend the gazetteer, no retrain. = countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. 83.3 F1 (homographhomonymyOne surface, many referents: 'Georgia' is a US state in 'Atlanta, Georgia' and a country in 'Tbilisi, Georgia.' Handled by disambiguation, split across two stages — the parser resolves the tag from in-string context; the resolver late-binds the referent with geographic context., P95/over-fire 0). Choreography = PR #468. #464 closed; plan doc + memory updated. (Choreography later found not decisive for the postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. dip — see below.)
- Affix multi-localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. reroll = PR #469 (v0.9.14, corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus. v0.4.11-affix-ml). Proved the FR-postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. fix (95.6→99.7) but was a lateral move on FR solo → carried into consolidation. #462 closed.
- Consolidation v1.0.0 (corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus. v0.4.12-consolidation, config
v1.0.0-consolidation.yaml, 40k): the strongest guardrail yet — US micro 81.6→85.5, regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. +10, localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. +14, countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. 87.5, FR postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one.+house_number recovered, DE native loc 90.7 (beats PeliasPeliasAn open-source geocoder, Mailwoman's spiritual predecessor. 85.9). BUT affix split crashed (prefix 75→27.6) and US postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. −2.5 (98.3→95.8). - DeepSeek consult + diagnostic → consensus (session
consolidation-tradeoff-2026-06-10; notes in.agents/skills/deepseek-consult/):- Affix is scheduling-bound, not capacity-bound (diagnostic: prefix 27.6→75 in 2k steps @ affix 20×, postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. even +1.6, guardrail flat). [SUPERSEDED by Run C: the 75 is a transient that decays under sustained density — it IS a capacity/stability constraint; see "Final result" above.]
- WeightparameterA single learned number inside a model — one weight or bias. Mailwoman's encoder has roughly 30 million of them; training is the search for good values.-merge is unsound for our from-scratch (non-fine-tune) solo modelsneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' — would wreck the CRFCRF (Conditional Random Field). A statistical modeling method that predicts structured outputs by modeling dependencies between adjacent labels. Mailwoman uses a linear-chain CRF as the Viterbi decoder at inference time to enforce BIO label consistency — a B-street must be followed by I-street or O, never I-locality. transition matrixtransition matrixThe CRF's learned table of per-label-pair scores. It encodes which BIO transitions are preferred or forbidden — e.g. that an I-tag must follow a matching B- or I-.. (Stands.)
- US postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. needed convergence, not a structural fix — improved +1.6 with zero postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one.-position changes; the #468 choreography is not decisive for it. (Stands; Run B confirmed 97.3 at moderate density.)
- Fix = continue-resume (cheaper than fresh) with affix 5× + tag-weightsparameterA single learned number inside a model — one weight or bias. Mailwoman's encoder has roughly 30 million of them; training is the search for good values. → Run A.
- Runs A/B/C — the affix-recovery arc (full scorecard in "Final result"): A (5×,
resume) → stable 64.9/52.4; B (17×, but my
init_fromerror) → flat 64.9, postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 97.3✓, countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. 89.8✓; C (20×, resume) → transient 75 @ 2k, decayed to 52.9 + FR-regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. collapse @ 15k → treadmill STOP, fork to operator.
What went well
- The cheap 2k-step diagnostic adjudicated a real strategy fork (scheduling vs capacity) for ~5 min of GPU before committing to a 35-min run. Reusable pattern.
- Caught the score-affix harness artifact (zero-filled gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. → fake affix crash); fixed the tool to feed the lexicon for gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture.-trained modelsneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.'.
- Operator-in-the-loop on every GPU launch; DeepSeek consensus on the consequential fork.
What could've gone better
- I framed the US-postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. dip as featurefeatureAn input signal a model conditions on. Beyond the raw tokens, Mailwoman feeds soft features — gazetteer-membership channels and the postcode anchor — that inform predictions without overriding them.-channel interference and built choreography (#468) for it; the diagnostic showed it was mostly under-convergence. Choreography is still default-off/byte-stable and harmless, but it wasn't the right tool for that nail.
- Missed the affix-run step-2000 ping window (did git commits first; the run was faster than estimated). Fixed by setting the poller immediately on later launches.
- Run B used
init_frominstead of the specifiedresume(to avoid a checkpointcheckpointA saved snapshot of the model weights and optimizer state during training. Mailwoman saves a checkpoint periodically so training can resume after a GPU hang. delete) — a fresh optimizeroptimizerThe component that decides how to update parameters from the gradient — Adam/AdamW being the common choice, adding momentum and per-parameter scaling on top of plain gradient descent. can't re-enter the affix basin, so the run tested the substitution, not the weightparameterA single learned number inside a model — one weight or bias. Mailwoman's encoder has roughly 30 million of them; training is the search for good values.. Cost: ~35 min GPU. Lesson: neverinit_fromto continue a fragile capability. - Silent gate drift (operator-caught): the doc's table had relaxed the config's
pre-registered bars (affix 78/67→72/64, unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise., FR postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one.) and dropped the US-streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. row,
hiding its −4.4 regression. Restored;
feedback-no-silent-gate-driftmemory written. No GPU lost (no decision flipped on the relaxed numbers) but ~2h of delayed detection. - DeepSeek's two quantitative predictions (5× clears ≥72; "75 not a transient") were wrong; the cheap-diagnostic-first pattern and the treadmill guard are what bounded the damage.
Open / next
- The fork decision (this doc, above) — sent for operator review: re-baseline + ship Run B / escalate architecture / hold. Then the SHIP gate (honest-evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error. VT, demo presets, int8 spot-check, ledger + scorecard + releases.mdx) before any v4.2.0 tag.
- Merge debt (ordering for the cut): #468 (choreography) → #469 (affix) →
feat/consolidation-466(consolidation + Run A/B/C configs + assemblers + salvaged #463 evalsevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error.). #489 already merged; #463 closed (assets salvaged). - Post-parity queue: #478 arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. next (zero-GPU); po_boxPO boxA numbered mailbox at a post office used as a delivery address instead of a physical street location. Mailwoman tags it as the po_box component; structurally the same family as a subpremise./cedexCEDEX (Courrier d'Entreprise à Distribution Exceptionnelle). A French postal routing for high-volume business mail: a CEDEX code delivers directly from a sorting centre, bypassing the local post office. A common negative-space format Mailwoman must parse. ride the next consolidation-class run; lossless decomposition needs a real issue in epic #488. The affix/width architecture question (option 2) should also get an issue if pursued.
Numbers
| modelsneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' trained | v1.0.0 consolidation (40k) + affix diagnostic (2k) + Run A (20k) + Run B (20k) + Run C (15k) ≈ 97k steps, ~2.6 A100-h |
| GPU lost to error | Run B ~35 min (init_from confound) |
| consults | DeepSeek-pro 4-turn (consolidation-tradeoff-2026-06-10); 2 of its predictions falsified by experiment |
| PRs/branches | #489 MERGED, #463 closed (salvaged); #468, #469, feat/consolidation-466 open for the cut |
| regressions shipped | 0 (nothing promoted; v4.1.0 still default) |
| canonical-gate status | no variant passes (affix + US streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.); fork pending review |