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.
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_ofbeforegrandparent_of, thenancestor_of" maps directly to the formation pipeline's prerequisite gates (ratify.pyG3 — every relation'sheadandtailmust 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)
-
Cross-pack teaching-grounded composition.
chat/pack_grounding.pyandchat/teaching_grounding.pyare currently hardcoded toen_core_cognition_v1. Apack_resolverabstraction 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. -
First kinship reviewed chains — a
relations_chains_v1.jsonlor extension of the cognition chains to adomainfield. Triples like(parent, verification, is_a, ancestor),(child, verification, is_a, descendant)form the first ratified kinship DAG. -
Pronoun + role-filler v2. Once the v1 DAG produces reviewed chains, add
mother/father/son/daughteras specializations. -
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.