diff --git a/docs/decisions/ADR-0210-l10-grounding-pack.md b/docs/decisions/ADR-0210-l10-grounding-pack.md new file mode 100644 index 00000000..0d44d477 --- /dev/null +++ b/docs/decisions/ADR-0210-l10-grounding-pack.md @@ -0,0 +1,125 @@ +# ADR-0210 — L10 finite grounding pack and adversarial wrong=0 fixtures + +Status: Proposed +Date: 2026-06-05 +Scope: Additive pack + additive eval fixtures only +Branch: `feat/l10-grounding-pack-evals-adr` + +## Context + +CORE is migrating toward an L10 runtime thread: a stateless, hyper-efficient, content-addressed execution layer. The transition must preserve CORE's existing doctrine: deterministic replay, refusal before invention, finite proof surfaces, and geometric reasoning over compiled structure rather than probabilistic guessing. + +The immediate failure class is not arithmetic. It is relational grounding. A system that treats vacuous universals, unbound existentials, or contradictory premise sets as license to fabricate relational links will pass superficial natural-language tests while violating CORE's wrong=0 doctrine. + +This ADR proposes an additive seed pack and an additive adversarial fixture set for the L10 transition. No existing runtime, parser, solver, loader, or pack is modified. + +## Decision + +Adopt `language_packs/data/l10_grounding_v1/` as the first L10-oriented grounding pack. + +The pack contains finite-domain relational primitives only: + +- finite entity grounding +- witness binding +- range restriction +- guarded universal +- grounded existential +- vacuous-truth refusal guard +- contradiction barrier +- no-explosion barrier +- finite-domain closure +- undecidable-refusal mapping + +Every lemma is namespaced with `l10_` to avoid global lemma collisions. The pack manifest uses `oov_policy = "fail_closed"` and declares `l10_stateless = true`. + +Adopt `evals/deductive_logic/fixtures/l10_adversarial.jsonl` as independent-gold adversarial cases for wrong=0 behavior. Gold labels are symbolic, not model-inferred. The fixture set explicitly covers vacuous truth, range restriction, contradictory premises, unbound existential witnesses, finite closure, and no-explosion refusal. + +## Relationship to CORE-AI geometric reasoning doctrine + +CORE's geometric doctrine requires that meaning be carried through stable structure and admissible transformations, not guessed associations. L10 grounding preserves that doctrine by refusing to project an ungrounded relational edge into the substrate. + +For a future L10 compiler, these primitives should lower into content-addressed operators whose admissibility depends on explicit finite witnesses and guards. A universal over an empty guard may be logically vacuous, but it must not create an entity-specific rotor edge. A contradictory premise set may identify a real boundary, but it must not explode into arbitrary entailments. + +## Stateless execution alignment + +The pack and fixtures are L10-compatible because: + +1. All rows are self-contained JSON records. +2. No row depends on mutable global state, online lookup, model inference, or hidden cache. +3. All fixture gold labels are derivable from finite premise lists. +4. The fixture format includes explicit `finite_domain`, `premises`, `query`, `gold`, and `symbolic_resolution` fields. +5. OOV behavior is fail-closed by manifest declaration. + +## Wrong=0 doctrine + +The expected wrong value for every fixture is `0`. Any uncertain or inconsistent proposition must resolve to `refuse`, not a guessed truth value. + +This is especially load-bearing for: + +- vacuous universals with no explicit witness +- existential claims without a bound witness +- range-restricted rules whose guard is not satisfied +- premise sets that derive incompatible heads +- contradictory entity facts + +## Checksums + +- `language_packs/data/l10_grounding_v1/lexicon.jsonl`: `829efd10d7f5fa74f1189ec6d621f2a12bc5e7a022fd7a3de436655fc8fe5603` +- `evals/deductive_logic/fixtures/l10_adversarial.jsonl`: `beda988f019b5431a3ab6e817b463a165bde719c7597f3b6a7f572107e1db123` + +## Consequences + +Positive: + +- Establishes a clean L10 seed surface without refactoring existing code. +- Gives the wrong=0 gate concrete adversarial cases before the L10 runtime exists. +- Prevents hallucinated relation links from being treated as legitimate inference. + +Negative / deferred: + +- No runtime loader is added in this PR. +- No test harness is added in this PR. +- Reconciled with the existing ADR registry at merge: numbered `ADR-0210` + (the originally requested `adr-012-l10-grounding.md` collided with the + existing `ADR-0012-core-ingest-governance-layer.md` and did not follow the + `ADR-NNNN` convention). + +## Open reconciliation item (must resolve before the fixtures are wired) + +The adversarial fixtures encode two different responses to "the query +subject is in `finite_domain` but the guard relation is unsatisfied": + +- `l10-adv-003` resolves to `label: false` / `VERIFIED` (the subject is + grounded in the same relation sort — `member(alice, team_red)` — just not + the guarded value, so closed-world negation makes the query false). +- `l10-adv-008` resolves to `label: refuse` / `SCOPE_BOUNDARY` (the subject + is grounded only in a *different* sort — `asset(asset_1)`, not + `account(...)` — so the rule's range is type-incommensurate and the engine + refuses rather than concluding false). + +That distinction (same-sort negative ⇒ `false`; cross-sort/type-mismatch ⇒ +`refuse`) is defensible but is not yet stated as a single decision +procedure. A future symbolic runner (verification-plan item 4) MUST encode +the discriminating principle explicitly before these labels become a live +oracle; otherwise the two cases are an inconsistent gold and would not be a +sound independent check. Until then the fixtures are an inert proposal, not +a wired wrong=0 lane. + +## Verification plan + +To be completed in the Claude lane or local CI after review: + +1. Confirm all `lemma` values in `l10_grounding_v1/lexicon.jsonl` are globally unique across every pack. +2. Confirm the lexicon checksum matches the manifest checksum. +3. Confirm the adversarial fixture checksum matches this ADR. +4. Add a future symbolic runner that derives each fixture gold label without model inference. +5. Require wrong=0: no false positives, no hallucinated links, no ex-falso entailment. + +## Non-goals + +- No serving-code mutation. +- No eval-runner mutation. +- No parser mutation. +- No loader mutation. +- No new dependency. +- No empirical claim that the fixtures pass before they are run. diff --git a/evals/deductive_logic/fixtures/l10_adversarial.jsonl b/evals/deductive_logic/fixtures/l10_adversarial.jsonl new file mode 100644 index 00000000..d604fc70 --- /dev/null +++ b/evals/deductive_logic/fixtures/l10_adversarial.jsonl @@ -0,0 +1,8 @@ +{"case_id":"l10-adv-001-vacuous-universal-no-witness","category":"vacuous_truth","finite_domain":["raven_a","raven_b"],"gold":{"epistemic_state":"UNDETERMINED","label":"refuse","reason":"Universal over an empty guarded range does not ground silver(raven_a).","wrong_value":0},"premises":[{"guard":{"args":["x"],"pred":"unicorn"},"implies":{"args":["x"],"pred":"silver"},"op":"forall_guarded","var":"x"},{"args":["raven_a"],"op":"closed_world_negative","pred":"unicorn"},{"args":["raven_b"],"op":"closed_world_negative","pred":"unicorn"}],"query":{"args":["raven_a"],"pred":"silver"},"symbolic_resolution":["range(unicorn) = \u2205 under finite_domain","forall_guarded is vacuously satisfied","query subject lacks explicit unicorn witness","no admissible entailment; refuse"]} +{"case_id":"l10-adv-002-contradiction-no-explosion","category":"contradictory_premises","finite_domain":["invoice_1"],"gold":{"epistemic_state":"CONTRADICTED","label":"refuse","reason":"The same entity is asserted paid and not_paid; no explosion from inconsistent premises.","wrong_value":0},"premises":[{"args":["invoice_1"],"op":"fact","pred":"paid"},{"args":["invoice_1"],"op":"fact","pred":"not_paid"},{"guard":{"args":["x"],"pred":"paid"},"implies":{"args":["x"],"pred":"has_receipt"},"op":"forall_guarded","var":"x"}],"query":{"args":["invoice_1"],"pred":"has_receipt"},"symbolic_resolution":["detect paid(invoice_1) \u2227 not_paid(invoice_1)","mark premise set inconsistent","block ex-falso entailment","refuse"]} +{"case_id":"l10-adv-003-range-restriction-blocks-link","category":"range_restriction","finite_domain":["alice","bob"],"gold":{"epistemic_state":"VERIFIED","label":"false","reason":"Alice is grounded in team_red only; the team_blue guard is not satisfied.","wrong_value":0},"premises":[{"args":["alice","team_red"],"op":"fact","pred":"member"},{"guard":{"args":["x","team_blue"],"pred":"member"},"implies":{"args":["x","vault_blue"],"pred":"can_access"},"op":"forall_guarded","var":"x"}],"query":{"args":["alice","vault_blue"],"pred":"can_access"},"symbolic_resolution":["member(alice, team_blue) absent from finite facts","guard fails for alice","implication cannot fire","query is false under finite closure"]} +{"case_id":"l10-adv-004-grounded-universal-entails","category":"grounded_entailment","finite_domain":["sam"],"gold":{"epistemic_state":"VERIFIED","label":"true","reason":"Sam is explicitly grounded and satisfies the guarded universal range.","wrong_value":0},"premises":[{"args":["sam"],"op":"fact","pred":"finite_entity"},{"args":["sam"],"op":"fact","pred":"student"},{"guard":{"args":["x"],"pred":"student"},"implies":{"args":["x"],"pred":"has_id"},"op":"forall_guarded","var":"x"}],"query":{"args":["sam"],"pred":"has_id"},"symbolic_resolution":["finite_entity(sam)","student(sam) satisfies guard","forall_guarded fires","entails has_id(sam)"]} +{"case_id":"l10-adv-005-existential-without-witness","category":"existential_grounding","finite_domain":["box_1","box_2"],"gold":{"epistemic_state":"UNDETERMINED","label":"refuse","reason":"An unbound existential does not identify box_1 as the witness.","wrong_value":0},"premises":[{"body":{"args":["x"],"pred":"contains_key"},"op":"exists_unbound","var":"x"}],"query":{"args":["box_1"],"pred":"contains_key"},"symbolic_resolution":["exists x contains_key(x) has no witness binding","box_1 is not independently bound","query would require hallucinated witness link","refuse"]} +{"case_id":"l10-adv-006-contradictory-rule-heads","category":"contradictory_premises","finite_domain":["node_a"],"gold":{"epistemic_state":"CONTRADICTED","label":"refuse","reason":"The same grounded guard entails incompatible heads; runtime must not choose one.","wrong_value":0},"premises":[{"args":["node_a"],"op":"fact","pred":"sensor_green"},{"guard":{"args":["x"],"pred":"sensor_green"},"implies":{"args":["x"],"pred":"safe"},"op":"forall_guarded","var":"x"},{"guard":{"args":["x"],"pred":"sensor_green"},"implies":{"args":["x"],"pred":"unsafe"},"op":"forall_guarded","var":"x"}],"query":{"args":["node_a"],"pred":"safe"},"symbolic_resolution":["sensor_green(node_a) grounds both rules","derive safe(node_a) and unsafe(node_a)","detect incompatible heads","refuse"]} +{"case_id":"l10-adv-007-negated-ground-false","category":"finite_closure","finite_domain":["door_1"],"gold":{"epistemic_state":"VERIFIED","label":"false","reason":"locked and unlocked are declared incompatible for the same grounded entity.","wrong_value":0},"premises":[{"args":["door_1"],"op":"fact","pred":"finite_entity"},{"args":["door_1"],"op":"fact","pred":"locked"}],"query":{"args":["door_1"],"pred":"unlocked"},"symbolic_resolution":["finite_entity(door_1)","locked(door_1)","incompatible(locked, unlocked)","unlocked(door_1) is false"]} +{"case_id":"l10-adv-008-out-of-domain-entity","category":"range_restriction","finite_domain":["asset_1"],"gold":{"epistemic_state":"SCOPE_BOUNDARY","label":"refuse","reason":"asset_1 is grounded, but not in the account range required by the rule.","wrong_value":0},"premises":[{"args":["asset_1"],"op":"fact","pred":"asset"},{"guard":{"args":["x"],"pred":"account"},"implies":{"args":["x"],"pred":"reconciled"},"op":"forall_guarded","var":"x"}],"query":{"args":["asset_1"],"pred":"reconciled"},"symbolic_resolution":["asset(asset_1) only","account(asset_1) absent","range-restricted rule cannot fire","refuse instead of hallucinating account(asset_1)"]} diff --git a/language_packs/data/l10_grounding_v1/README.md b/language_packs/data/l10_grounding_v1/README.md new file mode 100644 index 00000000..e2bb0a5f --- /dev/null +++ b/language_packs/data/l10_grounding_v1/README.md @@ -0,0 +1,23 @@ +# l10_grounding_v1 + +Additive relational-predicate seed pack for the L10 stateless execution path. + +## Scope + +This pack contains only finite-entity grounding, range-restriction, vacuity, contradiction-barrier, and wrong=0 refusal primitives. It is not a general logic curriculum and does not introduce runtime behavior. + +## L10 constraints + +- Stateless: each row is self-contained and carries no external state dependency. +- Zero-dependency: no corpus, model, or online source is required to interpret the row. +- Finite-entity only: every positive relation is designed to require an explicit finite witness or guarded range. +- Fail closed: manifest OOV policy is `fail_closed`. +- Collision resistant: every lemma uses the `l10_` namespace to avoid collisions with existing packs. + +## Checksums + +- `lexicon.jsonl` sha256: `829efd10d7f5fa74f1189ec6d621f2a12bc5e7a022fd7a3de436655fc8fe5603` + +## Review note + +This pack is intentionally additive-only. Runtime loaders may ignore the additional L10 metadata fields until an explicit L10 loader is ratified. diff --git a/language_packs/data/l10_grounding_v1/lexicon.jsonl b/language_packs/data/l10_grounding_v1/lexicon.jsonl new file mode 100644 index 00000000..ecc1da27 --- /dev/null +++ b/language_packs/data/l10_grounding_v1/lexicon.jsonl @@ -0,0 +1,10 @@ +{"arity":1,"entry_id":"l10-ground-001","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_finite_entity","morphology_tags":["l10_grounding","finite_entity"],"operator_class":"entity_ground","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":true,"semantic_domains":["l10.grounding.entity","logic.range_restriction"],"surface":"l10 finite entity"} +{"arity":2,"entry_id":"l10-ground-002","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_witness_binding","morphology_tags":["l10_grounding","witness"],"operator_class":"witness_bind","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":true,"semantic_domains":["l10.grounding.witness","logic.existential"],"surface":"l10 witness binding"} +{"arity":2,"entry_id":"l10-ground-003","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_range_restriction","morphology_tags":["l10_grounding","range_restriction"],"operator_class":"range_guard","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":true,"semantic_domains":["l10.grounding.range","logic.quantifier.guard"],"surface":"l10 range restriction"} +{"arity":3,"entry_id":"l10-ground-004","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_grounded_universal","morphology_tags":["l10_grounding","universal","finite_guarded"],"operator_class":"forall_guarded_finite","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":true,"semantic_domains":["l10.grounding.quantifier","logic.universal"],"surface":"l10 grounded universal"} +{"arity":2,"entry_id":"l10-ground-005","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_grounded_existential","morphology_tags":["l10_grounding","existential","finite_guarded"],"operator_class":"exists_grounded","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":true,"semantic_domains":["l10.grounding.quantifier","logic.existential"],"surface":"l10 grounded existential"} +{"arity":2,"entry_id":"l10-ground-006","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_vacuous_truth_block","morphology_tags":["l10_grounding","vacuous_truth_guard"],"operator_class":"vacuity_refusal_guard","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":true,"semantic_domains":["l10.grounding.vacuity","logic.universal"],"surface":"l10 vacuous truth block"} +{"arity":2,"entry_id":"l10-ground-007","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_contradiction_barrier","morphology_tags":["l10_grounding","contradiction_barrier"],"operator_class":"inconsistency_refusal_guard","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":false,"semantic_domains":["l10.grounding.consistency","logic.contradiction"],"surface":"l10 contradiction barrier"} +{"arity":1,"entry_id":"l10-ground-008","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_no_explosion","morphology_tags":["l10_grounding","explosion_block"],"operator_class":"ex_falso_block","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":false,"semantic_domains":["l10.grounding.consistency","logic.paraconsistent_boundary"],"surface":"l10 no explosion"} +{"arity":1,"entry_id":"l10-ground-009","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_finite_domain_closure","morphology_tags":["l10_grounding","finite_domain"],"operator_class":"domain_close_finite","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":true,"semantic_domains":["l10.grounding.finite_domain","logic.domain"],"surface":"l10 finite domain closure"} +{"arity":1,"entry_id":"l10-ground-010","epistemic_status":"coherent","l10_stateless":true,"language":"en","lemma":"l10_undecidable_refusal","morphology_tags":["l10_grounding","wrong_zero_refusal"],"operator_class":"undecidable_to_refuse","pos":"NOUN","provenance_ids":["brief-c:l10-grounding:2026-06-05"],"requires_explicit_witness":false,"semantic_domains":["l10.grounding.refusal","logic.epistemic_state"],"surface":"l10 undecidable refusal"} diff --git a/language_packs/data/l10_grounding_v1/manifest.json b/language_packs/data/l10_grounding_v1/manifest.json new file mode 100644 index 00000000..b62787a4 --- /dev/null +++ b/language_packs/data/l10_grounding_v1/manifest.json @@ -0,0 +1,17 @@ +{ + "checksum": "829efd10d7f5fa74f1189ec6d621f2a12bc5e7a022fd7a3de436655fc8fe5603", + "collision_policy": "globally_unique_l10_prefixed_lemmas", + "definitional_layer": false, + "determinism_class": "D0", + "gate_engaged": false, + "l10_stateless": true, + "language": "en", + "normalization_policy": "unitize_versor", + "oov_policy": "fail_closed", + "pack_id": "l10_grounding_v1", + "provenance": "brief-c:l10-grounding:2026-06-05", + "role": "operational_base", + "script": "Latin", + "source_manifest": "l10_grounding_v1.lexicon.jsonl", + "version": "0.1.0" +}