core/docs/curriculum/relations_pack_v1.md
Shay f0c57eb32e feat(packs): en_core_relations_v1 — kinship starter pack (8 lemmas)
Per teaching_order.md §5 — pick one commercial domain and run the
full 1→4 progression inside it before opening a second.  Kinship is
the doctrinally classic starter: tight DAG, well-bounded primitives,
and orthogonal to the cognition pack.

Lemmas (8): parent, child, sibling, family, ancestor, descendant,
spouse, offspring.  Each carries ≥2 semantic_domains under a
deterministic taxonomy (kinship.*, lineage.*, biology.*, social.*).

Deliberate exclusions:
  - `person` — lives in en_core_cognition_v1; orthogonality test
    pins that boundary.
  - Specializations (mother/father/son/daughter/grandparent/...) —
    derived from v1 primitives; land in v2 after v1 produces
    reviewed chains.
  - Quantifiers (one/two/many) — separate domain
    (en_core_quantification_v1); cross-domain triples come last.
  - Verbs of relation (begets/marries/...) — separate composer
    work; no relations_chains_v1.jsonl yet.

Engagement is opt-in:
  - Pack is NOT in RuntimeConfig.input_packs defaults.
  - Programmatic mount via RuntimeConfig(input_packs=(..., "en_core_relations_v1")).
  - CLI: core chat --pack en_core_relations_v1 (existing surface).
  - Default-not-mounted preserves the cognition lane unchanged
    until cross-pack teaching-grounded composition exists.

- language_packs/data/en_core_relations_v1/lexicon.jsonl
  — 8 entries, JSONL format matching en_core_cognition_v1.
- language_packs/data/en_core_relations_v1/manifest.json
  — pack_id, language, role=operational_base, checksum
  (SHA-256 of lexicon bytes per CLAUDE.md pack-discipline),
  version 1.0.0, determinism_class D0, oov_policy tagged_fallback.
- tests/test_en_core_relations_v1_pack.py — 6 tests pin:
  checksum-match load, lemma roster, per-lemma primary domain,
  ≥2 domains/lemma (composer headroom), zero collision with
  cognition pack (kinship DAG stays orthogonal), pack-not-in-
  default-input-packs (opt-in engagement contract).
- docs/curriculum/relations_pack_v1.md — full pack log:
  rationale per included/excluded lemma, opt-in engagement path,
  4-step ADR roadmap (cross-pack composition → first kinship
  chains → pronoun v2 → cross-domain triples).

Mounted-manifold sanity check (en_core_cognition_v1 +
en_core_relations_v1): 93 lemmas combined, no collisions, both
packs' surfaces individually addressable.

Lanes (regression): smoke 67 / packs 6 / algebra 132 / relations-pack 6.
The non-negotiable field invariant (versor_condition < 1e-6) is
unaffected: this is pure pack data + a contract test.
2026-05-18 14:40:54 -07:00

6.6 KiB

Pack Unit — en_core_relations_v1 (Kinship Starter)

Date: 2026-05-18 Author: Shay Pack ID: en_core_relations_v1 Lemma count: 8 (kinship-only; deliberately tight) Status: Ratified (checksum verified). Not yet mounted on the default runtime.


Why kinship first

Per teaching_order.md §5 — "Pick one commercial domain and run the full 1→4 progression inside that domain before opening a second domain. Cross-domain triples come last and only after both domains have ratified their own internal DAG."

Kinship is the classic starter domain for relation-curriculum work:

  • Tight DAG: ~10 primitives + transitive closures over them.
  • Doctrinally well-behaved: "teach parent_of before grandparent_of, then ancestor_of" maps directly to the formation pipeline's prerequisite gates (ratify.py G3 — every relation's head and tail must already be mastered).
  • Orthogonal to the cognition pack: zero lemma overlap, zero semantic-domain prefix overlap. Two pack DAGs ratify in isolation.

What's in v1

Eight kinship lemmas, each carrying ≥2 semantic_domains in a deterministic taxonomy under kinship.*, lineage.*, biology.*, social.*:

Lemma Primary domain Secondary domains
parent kinship.ascendant.direct kinship.parent, biology.progenitor
child kinship.descendant.direct kinship.child, biology.offspring
sibling kinship.lateral.direct kinship.sibling, social.peer
family kinship.unit social.group.kin, kinship.group
ancestor kinship.ascendant.transitive lineage.upward, kinship.elder
descendant kinship.descendant.transitive lineage.downward, kinship.successor
spouse kinship.partner kinship.lateral.affinal, social.marriage
offspring kinship.descendant.direct biology.progeny, kinship.child

Note: person is not in this pack. It lives in en_core_cognition_v1 (which carries it as a cognition primitive covering "the experiencer of cognitive acts"). The orthogonality test pins that boundary; if person ever drifts between the two packs, that test fails as a deliberate signal that the domain DAG boundary needs an ADR.


What's NOT in v1 (and why)

Pronouns + role-fillers

mother, father, son, daughter, brother, sister, aunt, uncle, cousin, grandparent, grandchild, niece, nephew.

These are specializations of the v1 primitives — mother is-a parent with a gender filler; grandparent is parent of parent (a composed kinship relation). Following teaching-order doctrine: teach the atomic primitives first; specializations land in a v2 only after the v1 DAG has produced reviewed relation chains over the primitives.

Quantifiers + ordinals

one, two, many, first, second. Useful for kinship statements ("a person has two parents") but a separate domain (en_core_quantification_v1) with its own DAG. Cross-domain triples (one(parent), two(parent)) come after both domains ratify internally.

Verbs of relation

begets, marries, descends-from. These are predicates, not nouns. The cognition pack carries general predicates already (reveals, grounds, requires); kinship-specific predicates will land alongside the first reviewed kinship chains (a follow-up ADR — there is no relations_chains_v1.jsonl yet).


Engagement (opt-in only)

The pack is not in the default RuntimeConfig.input_packs. Mounting it changes the runtime's mounted manifold (89 → 93 lemmas in the cognition+relations combination). Until cross-pack teaching-grounded composition exists, mounting the relations pack would expose lemmas to vault recall and intent classification without a corresponding ratified surface composer for them. That asymmetry would silently lower the deterministic-grounding fraction of any kinship prompt.

To opt in for development:

from core.config import RuntimeConfig
from chat.runtime import ChatRuntime

cfg = RuntimeConfig(input_packs=RuntimeConfig().input_packs + ("en_core_relations_v1",))
rt = ChatRuntime(config=cfg)

Programmatic mounting works today. CLI-level support (core chat --pack en_core_relations_v1) is already in place via the --pack flag (see core chat --help).


Verification

tests/test_en_core_relations_v1_pack.py        6 passed
  - pack_loads_with_matching_checksum
  - all_expected_lemmas_present
  - each_lemma_carries_expected_primary_domain
  - every_lemma_has_multiple_semantic_domains
  - no_lemma_collision_with_cognition_pack
  - pack_is_not_in_default_input_packs

Lanes (regression):
  core test --suite smoke           67 passed
  core test --suite packs            6 passed
  core test --suite algebra        132 passed

The non-negotiable field invariant (versor_condition(F) < 1e-6) is unaffected: this is pure pack data + a contract test. No runtime code path changed.


Path forward (future ADRs in priority order)

  1. Cross-pack teaching-grounded composition. chat/pack_grounding.py and chat/teaching_grounding.py are currently hardcoded to en_core_cognition_v1. A pack_resolver abstraction that picks the right pack(s) for a given intent/subject is the natural unlock — composes the relations pack into the live surface path without a separate composer module.

  2. First kinship reviewed chains — a relations_chains_v1.jsonl or extension of the cognition chains to a domain field. Triples like (parent, verification, is_a, ancestor), (child, verification, is_a, descendant) form the first ratified kinship DAG.

  3. Pronoun + role-filler v2. Once the v1 DAG produces reviewed chains, add mother/father/son/daughter as specializations.

  4. Cross-domain triples. After both relations v2 AND cognition v1 are mature (and the pack-resolver / cross-pack composer exist), open the cross- domain frontier — e.g., family causes belonging, parent grounds identity.


Cross-References

  • teaching_order.md — the prerequisite-topological doctrine that scoped this pack.
  • Curriculum: cognition saturation v2 — the sibling cognition-pack saturation that produced the 21 chains the cognition lane composes over today.
  • ADR-0027 — pack loading + ratification surface that this pack consumes unchanged.
  • ADR-0062 — the composed-surface ADR; the relations pack will become the second domain that composer composes over, once cross-pack composition lands.