{
	"name": "neural-weights-fr-fr",
	"version": "6.5.0",
	"model_lineage": "Ships the en-us v310 (v3.1.0-fr-fragment, #1143 T2) model — init_from v264 plus the synth-fr-fragment BAN shard @ 12.0; tokenizer v0.9.0-multisplice (73,143) UNCHANGED. One model serves both locales; see the en-us card for the full lineage + grade. NOTE for this locale specifically: the shard is BAN-derived (Base Adresse Nationale, Licence Ouverte 2.0) and the gains are measured on French — bare-street 0.215→0.715, street-particle 0.273→0.855, admin-street-homonym 0.087→0.517, with the bare-locality counter-guard holding exactly. This is the largest FR-facing model change since 5.9.0.",
	"phase": "Stage 3 — multi-locale (FR served by the shared en-us v310 model, shipped as 6.4.0)",
	"license": "AGPL-3.0-only OR LicenseRef-Commercial",
	"locale": "fr-fr",
	"training": {
		"corpus_version": "v257 fragment-campaign corpus (shard-v5) re-tokenized through v0.9.0-multisplice; span-boundary aux head from BIO labels.",
		"tokenizer_version": "0.9.0-multisplice",
		"steps": 8000,
		"hardware": "NVIDIA A100-SXM4-40GB (Modal cloud)",
		"note": "Identical artifact to neural-weights-en-us 6.4.0 / v310 fr-fragment (one multi-locale model serves both, copied at publish time). See that card's training/recipe for full provenance."
	},
	"requires": {
		"$comment": "SHIP-CONFIG mirrored from neural-weights-en-us (#718/#721): this package ships en-us's model, so its required channels are identical — including `country` (the #1104 dedicated country soft-feed channel added in v263). createScorer / loadFromWeights read this and feed anchor + gazetteer + country + the conventions mask; running channel-OFF is the #566/#685 OOD crater.",
		"anchor": {
			"required": true
		},
		"gazetteer": {
			"required": true
		},
		"country": {
			"required": true
		},
		"conventions": {
			"required": true,
			"mode": "auto"
		},
		"bridge": {
			"required": false
		},
		"suppress_gazetteer_near_postcode": true,
		"locality_surface": {
			"required": true,
			"feature_dim": 2,
			"slots": ["locality", "locality_homograph"],
			"lexicon": "locality-surface-lexicon-v7.json",
			"$comment": "Copied VERBATIM from the base card: every overlay shares the base model.onnx byte-for-byte, so the trained ship-config is the base's and this block must be a superset of it. Declaring the `lexicon` name is also what ARMS the #1510 mismatch guard — resolveEvidenceLexicon only compares generations on the declared branch, so an undeclared channel falls back to a legacy filename with no guard at all."
		},
		"street_type": {
			"required": true,
			"feature_dim": 1,
			"slots": ["street_type"],
			"lexicon": "street-type-lexicon-v3.json"
		}
	},
	"components_supported": [
		"country",
		"region",
		"locality",
		"dependent_locality",
		"postcode",
		"subregion",
		"cedex",
		"venue",
		"street",
		"house_number",
		"street_prefix",
		"street_suffix",
		"unit",
		"po_box",
		"intersection_a",
		"intersection_b"
	],
	"labels": [
		"O",
		"B-country",
		"I-country",
		"B-region",
		"I-region",
		"B-locality",
		"I-locality",
		"B-dependent_locality",
		"I-dependent_locality",
		"B-postcode",
		"I-postcode",
		"B-subregion",
		"I-subregion",
		"B-cedex",
		"I-cedex",
		"B-venue",
		"I-venue",
		"B-street",
		"I-street",
		"B-house_number",
		"I-house_number",
		"B-street_prefix",
		"I-street_prefix",
		"B-street_suffix",
		"I-street_suffix",
		"B-unit",
		"I-unit",
		"B-po_box",
		"I-po_box",
		"B-intersection_a",
		"I-intersection_a",
		"B-intersection_b",
		"I-intersection_b"
	],
	"eval": {
		"$comment": "SUPERSEDED / STALE (#721). The per_component + calibration numbers below are the OLD v0.9.7-step-20000 checkpoint measured ANCHOR-OFF (country 0.21, postcode 0.69 — the #566/#685 OOD crater, NOT this package's real quality). Since the unified release CI ships en-us's v1.5.0 model for fr-fr too, the authoritative FR numbers are en-us v1.5.0-fr-order's, anchor-ON: assembled FR coord p50 1.5km / p90 5.3km, locality-match 76.3%; golden per-tag fr.house_number 99.3, fr.region 41.8 (open gap #330), fr.country 62.7, fr.postcode 99.5. See docs/articles/evals/2026-06-18-v150-vs-v170-head-to-head.md and neural-weights-en-us/model-card.json. Refresh or remove these stale fields per #721.",
		"n_entries": 4535,
		"full_parse_exact_match": 0.08180815876515987,
		"mean_token_confidence": 0.8062812768727202,
		"per_component": {
			"country": {
				"precision": 0.21428571428481394,
				"recall": 0.20816326530527282,
				"f1": 0.21118012372283307,
				"support": 245
			},
			"region": {
				"precision": 0.342951360263526,
				"recall": 0.129797191887635,
				"f1": 0.18832050661831204,
				"support": 3205
			},
			"locality": {
				"precision": 0.24782398452605223,
				"recall": 0.30533214179317686,
				"f1": 0.2735886822759171,
				"support": 3357
			},
			"dependent_locality": {
				"precision": 0.005044136191670815,
				"recall": 0.0999999999975,
				"f1": 0.009603841445164863,
				"support": 40
			},
			"postcode": {
				"precision": 0.8323890462696731,
				"recall": 0.591610738254835,
				"f1": 0.6916437813892687,
				"support": 2980
			},
			"subregion": {
				"precision": 0.0,
				"recall": 0.0,
				"f1": 0.0,
				"support": 0
			},
			"cedex": {
				"precision": 0.0,
				"recall": 0.0,
				"f1": 0.0,
				"support": 1
			},
			"venue": {
				"precision": 0.37649063032335905,
				"recall": 0.4014532243411431,
				"f1": 0.38857142807160183,
				"support": 1101
			},
			"street": {
				"precision": 0.35594795539016916,
				"recall": 0.26161202185783416,
				"f1": 0.3015748026611547,
				"support": 2928
			},
			"house_number": {
				"precision": 0.7446153846150028,
				"recall": 0.8335246842704744,
				"f1": 0.7865655466300883,
				"support": 1742
			}
		},
		"calibration": [
			{
				"low": 0.0,
				"high": 0.1,
				"n": 0,
				"acc": 0.0
			},
			{
				"low": 0.1,
				"high": 0.2,
				"n": 21,
				"acc": 0.23809523809523808
			},
			{
				"low": 0.2,
				"high": 0.3,
				"n": 666,
				"acc": 0.2912912912912913
			},
			{
				"low": 0.3,
				"high": 0.4,
				"n": 2416,
				"acc": 0.3265728476821192
			},
			{
				"low": 0.4,
				"high": 0.5,
				"n": 4308,
				"acc": 0.3152274837511606
			},
			{
				"low": 0.5,
				"high": 0.6,
				"n": 4777,
				"acc": 0.3382876282185472
			},
			{
				"low": 0.6,
				"high": 0.7,
				"n": 4943,
				"acc": 0.3568682986040866
			},
			{
				"low": 0.7,
				"high": 0.8,
				"n": 5534,
				"acc": 0.382544271774485
			},
			{
				"low": 0.8,
				"high": 0.9,
				"n": 8066,
				"acc": 0.43627572526655095
			},
			{
				"low": 0.9,
				"high": 1.0,
				"n": 30517,
				"acc": 0.6440344725890488
			}
		],
		"r6_fr_lieudit": {
			"$comment": "Pre-registered bars from docs/superpowers/plans/2026-08-01-r6-fr-lieudit-preregistration.md.",
			"golden_board": {
				"n": 80,
				"emit_before": 0,
				"emit_after": 80,
				"tag_correct_before": 0,
				"tag_correct_after": 76,
				"tag_correct_pct": 95.0,
				"bar_pct": 70.0,
				"note": "mailwoman/eval-harness/fixtures/fr-lieudit-golden.jsonl. Prior-OFF leg on identical bytes stays 0/80. The 4 residual misses are span-boundary (dropped particles), not retrieval — the prior fired on all 80. DISCLOSURE: 80/80 of the board's pairs are in the index (both are BAN-derived), so this measures mechanism efficacy where the gazetteer has data, not generalization."
			},
			"venue_confound_board": {
				"n": 60,
				"false_positives": 0,
				"fp_pct": 0.0,
				"bar_pct": 2.0,
				"note": "40 article-led lieu-dit surfaces (La/Le/Les/Saint…, from 84,582 available) + 20 others, each opening a venue name"
			},
			"gauntlet": "PASS after both decode-path fixes; neural 498/498, mailwoman 521/521"
		}
	},
	"known_failure_modes": [
		"underperforms on Hawaiian addresses (sparse in training corpus)",
		"particle-honorific kryptonite (e.g. FR 'Saint-Just-Saint-Rambert') if not in synth set",
		"non-Latin scripts (CJK, Cyrillic) fall through to byte-fallback tokens; F1 unknown"
	],
	"notes": "v0.4.0 — issue #116. Same encoder geometry as v0.3.0 (8.87M params, 6L/256H/4-heads, 21 BIO labels, linear-chain CRF). Issue proposed (1) per-token CRF NLL normalization + (3) class-weighted CE biased toward coarse labels + (4) source-weight rebalance. Empirical iteration found that §1 and §3 destabilize sustained training at every LR tested (5e-4, 3e-4, 1.5e-4 — even the v0.3.0-safe LR), and on the golden v0.1.2 eval (4535 entries) they slightly REGRESS country/postcode F1 vs v0.3.0. SHIPPED recipe is the §4-only ablation (v0.3.0 dual-loss + v0.4.0 source-weight rebalance) at lr=1.5e-4, step 2200. Modest fine-label gains (street +0.03, house_number +0.01), modest coarse-F1 regression (country -0.07, postcode -0.07). §1/§3 deferred to v0.4.1 corpus-side investigation per issue's '2K divergence' clause. Full ablation matrix retrospective in LOG.md.",
	"format": {
		"model": "ONNX int8 dynamic",
		"tokenizer": "SentencePiece unigram, byte_fallback=true, vocab_size=16000",
		"max_sequence_length": 128,
		"opset": 17
	},
	"files": {
		"model": "model.onnx",
		"tokenizer": "tokenizer.model",
		"model_card": "model-card.json",
		"pair_index": "pair-index-fr.bin",
		"$comment_postcode_anchor": "Added 2026-08-06 (#1516), same reason as the en-us card: the overlay has always shipped this binary (release.config.json softFeed.postcodeDBByCountry.fr, built from the WOF intl postcode shard) and never declared it. `readDeclaredArtifactFile` reads this key to tell a broken package (declared, missing) from a package that deliberately ships none.",
		"postcode_anchor": "postcode-fr.bin"
	},
	"base_relpath": "/data/models/checkpoints/v0_4_0-stableLR-source-only/step-002200",
	"fr_artifacts": {
		"$comment": "Hierarchy campaign R6 (2026-08-01). The FR instance of the placetype-pair prior.",
		"pair_index_fr_bin": {
			"format": "PIX1 placetype-pair index — a retrieval-augmented (lieu-dit, commune) dependent_locality prior, e.g. (\"Pinsonnac\", \"Montpeyroux\")",
			"source": "BAN — Base Adresse Nationale (DINUM/IGN, Licence Ouverte 2.0), raw adresses-<dept>.csv `nom_ld` field read through ban/sdk's cleanLieuDit filter. 101 départements, 1,684,844 rows carrying a clean lieu-dit. NOT WOF: WOF's French neighbourhood records are Paris quartiers, cartographic subdivisions that never appear in a postal address (the arrondissement is encoded in the postcode). The lieu-dit is the line French addresses actually carry — La Poste's line 5.",
			"pairs": 199282,
			"bytes": 6039155,
			"md5": "(staged at release time — see $comment_md5)",
			"$comment_pix2": "PIX2 (schema 3, 2026-08-04): every record now carries the PARENT's ComponentTag alongside the child's — +1 byte per pair, pair COUNT unchanged. For FR the recorded parent tag is always `locality`: BAN's parent surface is `nom_commune`, the commune, which is the French postal locality line. Schema 1 and 2 binaries are refused; the artifact must be rebuilt.",
			"delta_calibration": "δ=10, transitionBeta=5, parentDelta=5 (whole-edge parent bias, #46 — the record's own parentTag gets +5 over the parent window). FR is the leg that CAUGHT that mechanism's one real defect: biasing the parent's whole comma segment put the postcode inside `locality` and took fr-lieudit-golden.jsonl from 96.3% to 0.0% at δ≥6, invisible at δ=4. Fixed by scoping the parent write to the probe key's pieces; FR then held 77/80 at every δ through 20. See docs/records/evals/2026-08-04-pix1-whole-edge-verdict.md. The δ/β pair is inherited from the GB calibration, per R5's finding that the classifier's dependent_locality deficit is uniform across locales rather than GB-specific. The R6 bars were measured at exactly that pair.",
			"country_gate": "hard-gated on the header's country (fr).",
			"not_committed": "derived artifact, .gitignore'd — rebuilt via `mailwoman gazetteer pair-index --out neural-weights-fr-fr --country fr --delta 10 --transition-beta 5 --ban-dir <corpus/sources/ban>`",
			"required_decode_fixes": "This artifact is INERT without two locale-general probe-chain fixes that shipped alongside it: a LEADING postcode strip on parent-candidate keys (France writes '12210 Montpeyroux'; the probe previously stripped only trailing postcodes, the Anglo/NZ convention) and NEWLINE as a segment boundary (computeGroupSegments scanned for commas only, so multi-line addresses collapsed to one segment and the segment path went structurally inert). With the artifact but without them the golden board stayed at 0/80.",
			"$comment_md5": "REPRODUCIBILITY: a PIX1 header embeds `buildDate`, so a rebuild from identical sources produces different bytes and a different md5. This md5 therefore identifies the artifact STAGED TO HUGGING FACE for this release — it is a provenance record of the shipped bytes, NOT a check a local rebuild can reproduce. A mismatch after rebuilding is expected and is not corruption; verify pair COUNT and header delta/beta instead.",
			"provenance_gap": "The PIX1 header's sourceMD5s is EMPTY for this artifact: the BAN source is a directory of 101 département CSVs, and the build hashes individual files only. Hashing the full dump costs more than the provenance is worth at build time, so a BAN refresh is a deliberate act — rebuild with the artifact deleted rather than trusting a guard to notice."
		}
	}
}
