/** * @copyright Sister Software * @license AGPL-3.0 * @author Teffen Ellis, et al. * * `fr-fragment` slice recipe (#727 T2) — the HOUSE-NUMBER-LICENCE change. * * The measured problem (T1c, `2026-07-16-t1c-fragment-board-verdict.md`): the shipped model scores * **0.925** on ` Rue X` and **0.215** on `Rue X`. Same streets, same model; the only difference * is a leading number. It has learned that a house number LICENSES a street reading at all — strip * it and a designator-led phrase parses as a locality, designator included: * * ``` * "Rue Montmartre" -> locality="Rue Montmartre" * "Allee Poque" -> locality="Allee Poque" * ``` * * `Rue` can only mean street in French. The model is not mislabelling an ambiguous toponym; it is * mislabelling `Rue`. * * WHY THE EXISTING RECIPE DOESN'T COVER THIS. {@link frBareStreetRecipe} (#251) mints * ` Rue , ` — the bare COMMA form, no postcode. It targets postcode-anchoring * imbalance, and every row it emits still carries a house number AND a locality. It cannot teach * the class above, because it never shows the model a street standing alone. * * WHAT THIS MINTS. Five street forms — the first three carry NO house number and NO locality, which * is the whole point — plus the counter-distribution: * * 1. `bare-street` "Rue Montmartre" * 2. `street-particle` "Rue de la Paix" * 3. `date-name` "Allee du 11 Novembre 1918" * 4. `street-housenumber` "12 Rue Montmartre" — the anchor, so the licence isn't UNLEARNED * 5. `alnum-housenumber` "12 bis Rue Montmartre" * 6. `bare-locality` "Mery-sur-Oise" — NEGATIVE: a bare toponym that IS a locality * * The **admin/street homonym** class (`Rue de Rome`) is deliberately NOT a separate form. Homonym * streets are already in the register and fall into 1–3 naturally; there is nothing different to * teach about them, because the lesson is identical — the designator makes it a street. The * fragment board scores them separately (they need measuring, not minting), and the recipe would * need a second pass over the commune set to label them, buying a `synth_method` string and no * training signal. * * FORM 7 IS NOT OPTIONAL. T1c's standing prediction: the board's `bare-locality` cell reads 0.980 * for the WRONG REASON — the model calls everything without a house number a locality, and on bare * localities that is accidentally right. Teach bare streets alone and the model has every incentive * to flip that default rather than learn the distinction, trading a 0.215 for a 0.980. The slice * must show BOTH bare forms so the discriminating evidence is the designator, which is the only * thing that actually distinguishes them. This is the same counter-distribution principle * {@link noStreetRecipe} established after synth-street pushed the model into "decompose mode". * * SPLIT. `--exclude-surfaces` takes the fragment board's reserved surface list * (`mailwoman/eval-harness/fixtures/ban-fragments-fr.surfaces.txt`). Every listed surface is * skipped — source-disjoint by normalized street SURFACE, never by record row. Row-disjoint leaks * the surface across the boundary and measures memorization of `Rue de Rivoli` while claiming * generalization to unseen streets. The recipe REFUSES to run without the list rather than * silently minting a contaminated slice. * * MIX. The slice is ~145K rows off a 120K-tuple draw; the intended corpus mix is **5–10%**, set at * assembly time by slice weight rather than by row count. Keep the cap: a slice that fixes fragments * by degrading full addresses has moved the failure, not fixed it — which is what * `street-housenumber` / `alnum-housenumber` on the fragment board and the global parity floor are * there to catch. `date-name` is ~0.5% of the slice because BAN only holds ~1,418 date-name streets * after filtering and the tuple extractor already takes every one; if that class needs more, the * change is slice weight, not invented data. * * ⚠ Convention loss-mask: like {@link frBareStreetRecipe}, this recipe TEACHES FR `street_prefix`. * The conventions loss-mask forbids it for FR and will `-inf` these gold labels (the v1.6.0 ~7M-loss * blow-up). Disable that mask for any run including this slice. */ import { type CorpusRecipe } from "#recipes/scaffold"; export declare function frTitleCase(value: string): string; /** * Slice recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise, * and `description` below for the surface form it generates. */ export declare const frFragmentRecipe: CorpusRecipe; //# sourceMappingURL=fragment.d.ts.map