diff --git a/docs/taxonomy/141-aif-stage3-adjudication.md b/docs/taxonomy/141-aif-stage3-adjudication.md new file mode 100644 index 00000000..03c282be --- /dev/null +++ b/docs/taxonomy/141-aif-stage3-adjudication.md @@ -0,0 +1,170 @@ +# #141 AIF Stage-3 — expert adjudication package (DRY-RUN, no auto-apply) + +**Author**: po-2024 (worker) · **Date**: 2026-07-01 · **Base**: master `33b1c0bc` +**Source of truth**: [`141-aif-stage2-diff.csv`](141-aif-stage2-diff.csv) (16 rows, reproducible via +[`141-aif-stage2-diff.py`](141-aif-stage2-diff.py)) · derived from the +[full-scale Stage-1 sidecar](141-aif-candidates-fullscale.csv) (#626, merged). +**Status**: **ADVISORY PACKAGE FOR THE EXPERT GATE** — recommendations only. **Nothing here is +auto-applied.** Every row marked ⚖️ is a human (jsboige / argumentation expert) call. + +This is the one-pass adjudication table for the **12 non-card nodes** that already carry an AIF +value on the taxonomy (0.97 % of 1232). For those 12, the full-scale generator (gpt-5.5, +closed-set) was compared against the existing expert annotation. The other **1220 nodes are entirely +net-new** — no existing value to conflict with, so they are out of this adjudication (they go to the +general Stage-3 ratification, prioritized by confidence > 0.8). + +## Verdict summary + +| Verdict | Rows | Nodes | Action | +|---|---:|---:|---| +| CONFIRM | 2 | 2 | gpt-5.5 re-derived the **exact** expert token — **ratify, no change** | +| CONFLICT | 9 | 6 | gpt-5.5 proposed a different token/field — **adjudicate below** | +| SILENT | 5 | 5 | gpt-5.5 stayed silent on a filled field — **preserve existing** | + +## CONFIRM — ratify as-is (2) + +| dp | label | field | token (existing = proposed) | +|---|---|---|---| +| `1.111` | Appel à l'ignorance | DirectRef | `Ignorance_Inference` | +| `5.321` | Expression vague | DirectRef | `VagueVerbalClassification_Inference` | + +Both are independent corroboration: the closed-set generator reproduced the expert's exact Walton +token with no prompt priming. Highest-confidence signal in the whole run. + +## CONFLICT — adjudicate (9 rows, 6 nodes) + +Each node below: existing annotation vs gpt-5.5 proposal, an **advisory recommendation** (⚖️ expert +decides), and a one-line Walton rationale. A cross-cutting convention underpins several recos +(see [Convention](#convention)). + +### `4.116` Pente glissante — field-swap + token churn (4 rows) + +| field | existing | gpt-5.5 proposed | +|---|---|---| +| DirectRef | `RequiredSteps_Conflict` | `CausalSlipperySlope_Inference; NegativeConsequences_Inference` | +| ExceptionRef | `CausalSlipperySlope_Inference` | `RequiredSteps_Conflict` | +| ExceptionRef | `FullSlipperySlope_Inference` | `RequiredSteps_Conflict` | +| ExceptionRef | `PrecedentSlipperySlope_Inference` | `RequiredSteps_Conflict` | + +⚖️ **Reco: MERGE — adopt the field-swap, preserve the dropped tokens.** +- **Adopt**: `_Inference` schemes as **DirectRef** (primary reasoning scheme), `RequiredSteps_Conflict` + as the conflict/structure side — gpt-5.5's field allocation aligns with Walton's scheme-vs-conflict + distinction (see [Convention](#convention)). +- **Preserve** (gpt-5.5 dropped these, but they are legitimate Walton slippery-slope subtypes): + `FullSlipperySlope_Inference`, `PrecedentSlipperySlope_Inference` → keep in ExceptionRef. +- **Adopt the addition**: `NegativeConsequences_Inference` (valid subtype gpt-5.5 surfaced). +- Net = **union of both sets under the swapped field allocation**, not swap-and-drop. + +### `6.31123` Apophénie (1 row) + +| field | existing | gpt-5.5 proposed | +|---|---|---| +| ExceptionRef | `Sign_Inference` | `OtherCausalFactorsInvolved_Conflict; SignFromOtherEvents_Conflict` | + +⚖️ **Reco: PROMOTE `Sign_Inference` to DirectRef; absorb the proposed `_Conflict` tokens as +ExceptionRef critical questions.** Apophénie's core is a *sign* mistaken for a real relationship — +`Sign_Inference` is the primary scheme, arguably mis-located in ExceptionRef. The proposed +`OtherCausalFactorsInvolved` / `SignFromOtherEvents` are well-formed critical questions (alternative +causes / alternative signs) and enrich the exception structure. Expert: confirm the field promotion. + +### `6.311234` Preuve anecdotique (1 row) + +| field | existing | gpt-5.5 proposed | +|---|---|---| +| ExceptionRef | `InductiveInference_Scheme` | `WeakestLink_Conflict` | + +⚖️ **Reco: KEEP `InductiveInference_Scheme` (canonical).** Anecdotal evidence = hasty induction +from a single case — `InductiveInference_Scheme` is the textbook Walton fit. `WeakestLink_Conflict` +is a critical question about the weakest link in a chain; it can be added as a *companion* +critical question but does **not** replace the scheme. gpt-5.5 is over-conservative here (dropping +the scheme). Expert: keep scheme, optionally add `WeakestLink_Conflict` as a critical question. + +### `6.312` Biais émotionnels (1 row) + +| field | existing | gpt-5.5 proposed | +|---|---|---| +| DirectRef | `OppositeConsequences_Conflict` | `Bias_Inference` | + +⚖️ **Reco: ADOPT `Bias_Inference` as DirectRef; demote `OppositeConsequences_Conflict` to +ExceptionRef.** The fallacy *is* a bias — `Bias_Inference` (gpt-5.5) is the stronger primary scheme. +`OppositeConsequences_Conflict` is a critical question (consequences going the other way) that fits +the exception structure, not the primary scheme. gpt-5.5 is right; existing DirectRef is mis-tiered. + +### `6.321` Biais d'attribution (1 row) + +| field | existing | gpt-5.5 proposed | +|---|---|---| +| ExceptionRef | `Example_Inference` | `OtherCausalFactorsInvolved_Conflict` | + +⚖️ **Reco: ADOPT proposed; flag both as weak DirectRef fits.** Attribution bias = misattributing a +cause. `Example_Inference` (existing) = generalizing from an example — weak fit (attribution isn't +example-based). `OtherCausalFactorsInvolved_Conflict` (gpt-5.5) better captures the error +(*ignoring alternative causes*) but is a `_Conflict` token (critical question, not a scheme). +**Expert**: check whether a cleaner `Causal_Inference` / `CauseToEffect_Inference` scheme exists in +the Walton vocabulary for the primary DirectRef; absent that, adopt gpt-5.5's token as the exception +structure and keep the field flagged. + +### `6.322` Essentialisme (1 row) + +| field | existing | gpt-5.5 proposed | +|---|---|---| +| ExceptionRef | `Preference_Scheme` | `BiasedClassification_Conflict` | + +⚖️ **Reco: ADOPT proposed; existing looks mislabeled.** Essentialism = treating categories as +innate/fixed. `Preference_Scheme` (existing) is an odd fit (preference ≠ essence). +`BiasedClassification_Conflict` (gpt-5.5) captures the classification-bias core, but is a `_Conflict` +token. **Expert**: check for a `Classification_Inference` / `VerbalClassification_Inference` scheme +for a cleaner DirectRef; the existing `Preference_Scheme` appears mislabeled and should not be +preserved as-is. + +## SILENT — preserve existing (5) + +gpt-5.5 did **not** re-propose a token for these already-filled fields. The correct action is to +**preserve the existing expert value** — silence is not a signal to drop. + +| dp | label | field | existing (preserve) | +|---|---|---|---| +| `5.3212` | Pente glissante sémantique | ExceptionRef | `VerbalSlipperySlope_Inference` | +| `6.31121` | Effet de simple exposition | ExceptionRef | `Example_Inference` | +| `6.312` | Biais émotionnels | ExceptionRef | `Preference_Scheme` | +| `6.31212` | Biais d'autocomplaisance | ExceptionRef | `PositiveConsequences_Inference` | +| `6.312311` | Justification de l'effort | ExceptionRef | `Waste_Inference` | + +> Note: `6.312` Biais émotionnels appears in both CONFLICT (DirectRef) and SILENT (ExceptionRef +> `Preference_Scheme`). The DirectRef conflict is adjudicated above; its ExceptionRef +> `Preference_Scheme` is preserved here (gpt-5.5 was silent on that field). + +## Convention + +The recurring thread across the 9 CONFLICTs is a **scheme-vs-conflict tier distinction** in Walton's +AIF: + +- **`*_Inference` / `*_Scheme` tokens** name a *reasoning scheme* (the pattern of inference) → + natural **DirectRef** (primary scheme the fallacy instantiates). +- **`*_Conflict` tokens** name a *conflict/decision structure* or a *critical question* → natural + **ExceptionRef** (the exception/critical-question side). + +gpt-5.5's closed-set picks respect this distinction more consistently than some existing annotations +(which occasionally put `_Conflict` tokens in DirectRef or `_Scheme` tokens in ExceptionRef). Four of +the six conflict nodes (`4.116`, `6.31123`, `6.312`, `6.322`) improve under the convention; two +(`6.311234`, `6.321`) are weak on both sides and need a cleaner scheme token. **Adopting the +convention is itself a gate decision** — it is surfaced here, not imposed. + +## What this package does NOT do + +- **No auto-apply.** Every ⚖️ row awaits the expert gate. No `Cards/` write, no DatasetUpdater run. +- **No verdict on the 1220 net-new nodes.** Those go to general Stage-3 ratification, prioritized by + confidence > 0.8 (the high-signal subset, cf. the [full-scale report](141-aif-fullscale-report.md)). +- **No schema-extension decision** (the 87 `bad_map:*` WARNs — `relatedMatch`/`exactMatch`/`none`/ + `noMatch`) — that is a separate gate call, already surfaced in the full-scale report. + +## Reproducibility + +The data in this package is regenerated deterministically from +[`141-aif-stage2-diff.py`](141-aif-stage2-diff.py) (reads the taxonomy + the Stage-1 sidecar). The +recommendations are curated prose over that data; re-running the diff after any taxonomy change will +refresh the table, at which point the recos should be re-checked. + +Relates to #141, #609, #620, #626, #130, #136, #192. Honors pre-tag freeze (0 `Cards/` write, 0 +AssetConverter code change). Memory honored: Anti-Fab "Walton scheme = WARN" — this package treats +every Walton-scheme mismatch as adjudication, never silent overwrite. diff --git a/docs/taxonomy/141-aif-warn-triage.csv b/docs/taxonomy/141-aif-warn-triage.csv new file mode 100644 index 00000000..0ab9de59 --- /dev/null +++ b/docs/taxonomy/141-aif-warn-triage.csv @@ -0,0 +1,88 @@ +source_dp,source_label,mappingType,bad_map_verdict,recommendation +"2,131",Jeu de sonorités,none,none,"DROP — weak hedge, no defensible mapping" +"2,1312",Assonance,none,none,"DROP — weak hedge, no defensible mapping" +"2,132",Répétition,none,none,"DROP — weak hedge, no defensible mapping" +"2,1322",Anaphore,none,none,"DROP — weak hedge, no defensible mapping" +"2,13222",Symploque,none,none,"DROP — weak hedge, no defensible mapping" +"1,2224",Appel au nombre,skos:exactMatch,skos:exactMatch,ADOPT — extend observed set (legit SKOS predicate) +"3,211",Confusion entre corrélation et causalité,skos:exactMatch,skos:exactMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1346",Zeugma,skos:noMatch,skos:noMatch,"DROP — weak hedge, no defensible mapping" +"6,3111112",Rappel en série,skos:noMatch,skos:noMatch,"DROP — weak hedge, no defensible mapping" +"1,1116",Argument d'omniscience,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"1,1211",Argument par ouï-dire,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"1,23321",Blasphème,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1141",Appel au slogan,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1142",Petite phrase,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1144",Technique du carpaccio,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1151",Obscurcissement,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,11513",Obscurantisme,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,115242",Langage des titres de presse,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1211",Blague,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,12124",Bathos,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,122221",Wellerisme,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,122222",Antiparémie,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1223",Ironie,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,122323",Second degré,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,123",Cynisme,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1231",Humour noir,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1311",Allitération,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1314",Onomatopée,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1321",Accumulation,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,13221",Épiphore,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1332",Paraphrase,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1341",Aposiopèse,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1345",Syllepse,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,136",Substitution,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,1362",Astéisme,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,2123",Piège émotionnel,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,2133",Appel à la fierté,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,2234",Hyperbole forcée,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,3111",Objectif caché,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,312",Conditionnement opérant,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,3124",Renforcement Intermittent,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,3151",Induction hypnotique,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,3152",Message subliminal,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,322112",Amorçage,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,322113",Ce-n'est-pas-tout,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,3221211",Porte-au-nez,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,322122",Pied-dans-la-bouche,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,3224",Appel au dernier effort,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,323",Jeu psychologique,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,323231",Sealioning,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,324",Conditionnement social,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,3241",Abus de pouvoir,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,32422",Frapper le chat,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,32423",Kiss up kick down,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,32424",Sycophantie,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,332",Chronémique,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,334231",Poignée de main,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,334234",Salut romain,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,33424",Idéologique,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,334243",Imposition des mains,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"2,334252",High five,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"3,1231",Stéréotype,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"3,232",Mauvais argument de la régression infinie,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"3,323",Erreur numérique,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"4,124",Contre-induction erronée,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"4,3111",Sophisme génétique,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"4,3311",Milieu non distribué,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,11112",Exagération,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,1115",Faux effet,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,11216",Lance à incendie de mensonges,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,1131",Contre-vérité ironique,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,2262",Départ optionnel,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,311121211",Effet d'humour,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,311131",Effet suivant-en-ligne,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,311235",Sophisme animiste,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,31211212",Amplification et minimisation,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,312313",Biais de croyance,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,3123222",Avoir toujours raison,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,3213",Biais de proportionnalité,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,322244",Evasion,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,322246",Appropriation culturelle,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,3323",Radicalisme politique,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"6,3325",Extrémisme,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"7,1211",Argument autocollant,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"7,1332",Delenda Carthago,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"7,2123",Gish gallop,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) +"7,2124",Ignorer la question,skos:relatedMatch,skos:relatedMatch,ADOPT — extend observed set (legit SKOS predicate) diff --git a/docs/taxonomy/141-aif-warn-triage.md b/docs/taxonomy/141-aif-warn-triage.md new file mode 100644 index 00000000..29a198da --- /dev/null +++ b/docs/taxonomy/141-aif-warn-triage.md @@ -0,0 +1,70 @@ +# #141 AIF WARN `bad_map:*` triage (DRY-RUN, no auto-apply) + +**Author**: po-2024 (worker) · **Date**: 2026-07-01 · **Base**: master `33b1c0bc` +**Source of truth**: [`141-aif-candidates-fullscale.json`](141-aif-candidates-fullscale.json) +(structured sidecar, #626) · triage reproduced by +[`141-aif-warn-triage.py`](141-aif-warn-triage.py) → reviewable +[`141-aif-warn-triage.csv`](141-aif-warn-triage.csv) (87 rows). +**Status**: **ADVISORY — the schema-extension decision for the expert gate.** Nothing is auto-applied. + +This completes the expert-gate package for #141 (alongside the [Stage-3 +adjudication](141-aif-stage3-adjudication.md) of the 12 existing-AIF nodes and the +[closure recommendation](141-closure-recommendation.md)). It addresses the **other** gate +decision surfaced in the [full-scale report](141-aif-fullscale-report.md): the 87 WARN nodes. + +## What the 87 WARNs are (and are not) + +Each WARN is `bad_map:*` — the generator proposed an AIF `mappingType` **outside the *observed* +on-disk set** `{broadMatch, closeMatch, narrowMatch}`. The validator is strict-by-construction: it +flags anything not in the observed set. **These are legitimate SKOS predicates or explicit hedges — +not fabrications.** There are **zero** fabricated scheme names and **zero** invented targets across +all 1232 nodes; the closed-set design contains fabrication completely. The 87 are a **schema call**: +extend the observed set, or down-grade. + +## Triage (87 nodes, 7 % of 1232) + +| mappingType | Nodes | Recommendation | +|---|---:|---| +| `skos:relatedMatch` | 78 | **ADOPT** — extend observed set | +| `skos:exactMatch` | 2 | **ADOPT** — extend observed set (but ⚠️ strong claim — verify per-node) | +| `none` | 5 | **DROP** — weak hedge, no defensible mapping | +| `skos:noMatch` | 2 | **DROP** — explicit no-match hedge | +| **Total** | **87** | **80 ADOPT / 7 DROP** | + +### ADOPT — extend the observed set (80 nodes) +`skos:relatedMatch` (78) and `skos:exactMatch` (2) are standard SKOS mapping predicates. +`relatedMatch` is the natural fit for "genuine-but-weaker" AIF cross-references (analogous to the +`IsRelatedTo` cross-link verb that dominates the 3850 crossLinks). Adopting them **enriches the +mapping semantics** beyond the 3 observed predicates at zero fabrication risk — they are real SKOS. +- **Action**: extend the observed `MAP_TYPES` set to include `relatedMatch` (and optionally + `exactMatch`), then these 80 nodes' mappingType becomes valid (no rewrite needed — the value is + already the correct predicate). +- ⚠️ `exactMatch` (2 nodes) is a **strong** claim (the source *is* the scheme); the gate should + spot-verify those 2 rather than rubber-stamp. + +### DROP — weak hedges (7 nodes) +`none` (5) and `skos:noMatch` (2) are the generator hedging on weak fits — proposing a mappingType +without committing to a real predicate. These are candidates to **drop during ratification** rather +than salvage (no mappingType > a fake `none`). The 7 nodes: `2,131` Jeu de sonorités, `2,1312` +Assonance, `2,132` Répétition, `2,1322` Anaphore, `2,13222` Symploque (the 5 `none`), + 2 `noMatch`. +- **Action**: on ratification, leave these nodes' `mappingType` empty (or unset), not `none`. + +## Reproducibility note + +The structured JSON is the source of truth for WARNs (the flat CSV loses the warn for the ~23 nodes +that have a `mappingType` but 0 `DirectRef`/`ExceptionRef`, since no AIF row is emitted for them — +hence reading WARNs from the flat CSV undercounts by ~23). The JSON is regenerable via +`python docs/taxonomy/141-aif-fullscale.py --finalize` (from the `tmp/` checkpoint). The committed +**output** of this triage is the 87-row CSV — a reviewer reads it directly without re-running. + +## What this does NOT do + +- **No schema change**, no `MAP_TYPES` edit, no taxonomy write. Every row is a gate call. +- **No claim the 80 ADOPT nodes are correct mappings** — only that their *predicate* is valid SKOS; + whether each mapping itself holds is part of the general Stage-3 ratification (confidence > 0.8 + first). +- **No `Cards/` write, no AssetConverter change** — pre-tag freeze honored. + +Relates to #141, #609, #620, #623, #626, #130, #136, #192. Memory honored: Anti-Fab "Walton scheme += WARN" — these WARNs are flagged for the gate precisely because the closed-set validator is strict; +none are silently accepted. diff --git a/docs/taxonomy/141-aif-warn-triage.py b/docs/taxonomy/141-aif-warn-triage.py new file mode 100644 index 00000000..4c806716 --- /dev/null +++ b/docs/taxonomy/141-aif-warn-triage.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +"""#141 AIF WARN `bad_map:*` triage (read-only, 0 write under Cards/). + +Triage helper for the 87 non-card nodes whose Stage-1 proposal used an AIF +`mappingType` outside the *observed* on-disk set {broadMatch, closeMatch, +narrowMatch}. These are NOT fabrications (all are legitimate SKOS predicates or +explicit hedges) — they are a schema-extension decision for the expert gate. + +Source of truth for WARNs is the structured JSON (the flat sidecar CSV loses the +warn for the ~23 nodes that have a mappingType but 0 DirectRef/ExceptionRef, +since no AIF row is emitted for them). The JSON is regenerable via the +full-scale generator's `--finalize` (from the tmp/ checkpoint), or by re-running +the (non-deterministic) full-scale run; the committed *output* of this script is +the reviewable `141-aif-warn-triage.csv` (87 rows), so a reviewer does not need +to re-run anything to read the triage. + +Outputs: + docs/taxonomy/141-aif-warn-triage.csv (one row per WARN node) + stdout summary + +Run: python docs/taxonomy/141-aif-warn-triage.py +""" +import csv, json, os +from collections import defaultdict + +JSON_IN = r"docs/taxonomy/141-aif-candidates-fullscale.json" +OUT = r"docs/taxonomy/141-aif-warn-triage.csv" + +# recommendation per mappingType family +def reco(mt): + m = (mt or "").strip() + if m in ("skos:relatedMatch", "skos:exactMatch"): + return "ADOPT — extend observed set (legit SKOS predicate)" + if m in ("none", "skos:noMatch", ""): + return "DROP — weak hedge, no defensible mapping" + return "REVIEW" + + +def main(): + if not os.path.exists(JSON_IN): + print(f"ERROR: {JSON_IN} not found. Regenerate via:") + print(" python docs/taxonomy/141-aif-fullscale.py --finalize") + return + recs = json.load(open(JSON_IN, encoding="utf-8")) + warn_nodes = [] + for r in recs: + ws = r.get("warns", []) + if not any("bad_map" in w for w in ws): + continue + dp = r["source_dp"] + label = r.get("source_label", "") + mt = r.get("data", {}).get("aif", {}).get("mappingType", "") + # extract the exact bad_map verdict(s) + bm = sorted({w.split("bad_map:", 1)[1] for w in ws if w.startswith("bad_map:")}) + warn_nodes.append((dp, label, mt, ";".join(bm), reco(mt))) + warn_nodes.sort(key=lambda x: (x[2], x[0])) # by mappingType then dp + + with open(OUT, "w", encoding="utf-8", newline="") as f: + w = csv.writer(f) + w.writerow(["source_dp", "source_label", "mappingType", "bad_map_verdict", "recommendation"]) + w.writerows(warn_nodes) + + # aggregate + by_mt = defaultdict(int) + by_reco = defaultdict(int) + for _, _, mt, _, r in warn_nodes: + by_mt[mt] += 1 + by_reco[r] += 1 + print(f"#141 AIF WARN bad_map:* triage") + print(f" WARN nodes: {len(warn_nodes)} / 1232 ({100*len(warn_nodes)//1232}%)") + print(f" --- by mappingType ---") + for mt, c in sorted(by_mt.items(), key=lambda x: -x[1]): + print(f" {mt or '(empty)':24s} {c}") + print(f" --- by recommendation ---") + for r, c in sorted(by_reco.items(), key=lambda x: -x[1]): + print(f" {c:3d} {r}") + print(f" Sidecar: {OUT}") + + +if __name__ == "__main__": + main() diff --git a/docs/taxonomy/141-closure-recommendation.md b/docs/taxonomy/141-closure-recommendation.md new file mode 100644 index 00000000..e1714d57 --- /dev/null +++ b/docs/taxonomy/141-closure-recommendation.md @@ -0,0 +1,72 @@ +# #141 AIF cross-reference — closure recommendation + +**Author**: po-2024 (worker) · **Date**: 2026-07-01 · **Base**: master `33b1c0bc` +**Status**: **RECOMMENDATION — close #141 after the expert gate (Stage-3)**. This is the synthesis +of Phases 1–3 of the AIF cross-reference work. It does **not** write anything; it states what is +delivered, what the gate owes, and the close criteria. + +## What #141 set out to do + +Map the Fallacies non-card taxonomy (1232 nodes) to (a) each other via cross-link verbs and (b) the +Walton AIF scheme set, using an LLM (gpt-5.5) under a **closed-set anti-fabrication design** so the +model can only pick from real nodes / real Walton tokens — it cannot invent scheme names or targets. +Output is a dry-run sidecar for expert ratification; nothing is auto-written to the taxonomy. + +## Phase trace — all delivered + +| Phase | Deliverable | PR | Status | +|---|---|---|---| +| Census | non-card gap + AIF cross-ref proposal | #609 | ✅ merged | +| Pilot (Stage-1, 28 nodes) | closed-set, 0 fabrication validated | #620 | ✅ merged | +| Full-scale generator (1232) | checkpoint/resume, anti-fab | #623 | ✅ merged | +| Full-scale results | 1232/1232, 0 fab, sidecar + report | #626 | ✅ merged | +| Stage-2 diff | vs existing AIF (12 nodes, 9/2/5) | #626 | ✅ merged | +| **Stage-3 adjudication** | expert gate package (this cycle) | _this PR_ | ⚖️ pending expert | + +## Headline result — the anti-fab design scales + +Across **1232 nodes**, the closed-set design produced **0 fabricated scheme names, 0 invented +decimal_paths, 0 out-of-vocabulary verbs**. The 87 WARNs are all `bad_map:*` — legitimate SKOS +predicates (`relatedMatch`/`exactMatch`/`none`/`noMatch`) outside the *observed* on-disk set; a +schema-extension decision for the gate, **not** fabrications. This was the core hypothesis of #141 +and it held at full scale (cf. [full-scale report](141-aif-fullscale-report.md)). + +## What the expert gate (Stage-3) owes + +Two gated decisions block the final write and the closure: + +1. **Adjudicate the 12 existing-AIF nodes** — the [Stage-3 package](141-aif-stage3-adjudication.md) + surfaces 9 CONFLICTs + 5 SILENTs with advisory recommendations. The expert (jsboige) decides: + keep existing / adopt proposed / field-swap / merge, per node. ~16 token-level decisions. +2. **Decide the schema extension** — accept `relatedMatch`/`exactMatch` (87 WARNs) into the observed + set, or down-grade them to `closeMatch`; drop the `none`/`noMatch` hedges. +3. **Ratify the net-new high-confidence subset** — of the 1220 net-new nodes, prioritize confidence + > 0.8 (the high-signal cluster) for the ratified write; the mid-tail (0.5–0.8) is genuine-but- + generic and can defer. + +Once ratified, the write itself is mechanical — via the `DatasetUpdater` prompt+config adaptation +(#141 original scope), drift-free (#595), skip-non-empty (won't clobber the 12 expert values). + +## Close criteria for #141 + +**Recommend #141 be closed as *delivered, gated*** once the expert gate has: + +- [ ] adjudicated the 12 existing-AIF nodes (Stage-3 package), +- [ ] decided the `relatedMatch`/`exactMatch` schema extension (87 WARNs), +- [ ] ratified (or deferred) the net-new high-confidence subset. + +The generation + validation machinery (#623) and the reviewable sidecar (#626) are done and merged; +the remaining work is **judgment, not engineering**, and is owned by the expert gate, not by #141's +build lane. After the gate, #141 hands off to #130 (OWL export) / #136 (2sxc export) for the +ratified graph. + +## What is explicitly NOT in scope for closure + +- **No auto-write** of any candidate (anti-fab "Walton scheme = WARN" — every scheme match is + adjudicated, never silently applied). +- **No claim of completeness** — the full-scale run is non-deterministic (`temperature=1.0`); the + committed sidecar is the reproducible snapshot. Strong verbs (`Denounces`=1) remain sparse (cf. + full-scale report limitations). +- **No Cards/ write, no AssetConverter change** — pre-tag freeze honored throughout. + +Relates to #141, #609, #620, #623, #626, #130, #136, #192.