Replaces the hardcoded IdentityManifold constructor in chat/runtime.py
with a content-addressed pack loader. Identity is now load-bearing AND
swappable: deployments select an identity pack at startup, downstream
builders (robotics, personalization, creative tools) author their own
ratified packs without editing CORE Python.
Phase 1 — pack format + loader
* packs/identity/loader.py — load_identity_manifold(pack_id, *,
search_paths, require_ratified) with bounds checks (axis count,
direction in [-1, 1], weight in [0, 10], threshold in [0, 1],
axis-id uniqueness).
* available_packs() helper for discovery.
* IdentityPackError raised on every bounds violation.
Phase 2 — three v1 packs
* default_general_v1.json — ship default; encodes the previous
hardcoded three axes (truthfulness, coherence, reverence)
byte-for-byte so existing runtime behavior is preserved.
* precision_first_v1.json — boosts truthfulness weight, narrows
coherence/reverence; tighter alignment threshold.
* generosity_first_v1.json — boosts coherence weight, broadens
reverence; looser alignment threshold.
Phase 3 — replace hardcoded constructor
* chat/runtime.py:206 calls load_identity_manifold() using
RuntimeConfig.identity_pack (default DEFAULT_IDENTITY_PACK).
* Dead _default_identity_manifold() removed.
* ChatRuntime.identity_pack_id surfaces the loaded pack id.
Phase 4 — CLI flag
* core chat --identity <pack_id> (also threaded into trace/oov via
_add_runtime_policy_args).
* core/config.py: RuntimeConfig.identity_pack added; empty string
falls back to DEFAULT_IDENTITY_PACK = 'default_general_v1'.
Phase 5 — formation ratification — INTENTIONALLY DEFERRED. Loader
currently calls require_ratified=False so the v1 packs (which carry
empty mastery_report_sha256) load. Authoring SubjectSpecs for each
pack, running the formation pipeline end-to-end to produce signed
MasteryReports, and embedding the SHA into each pack file is a
follow-up.
Tests: 18 new tests in tests/test_identity_packs.py covering loader
happy paths, every bounds violation, runtime wiring, and pack-swap
divergence.
Suite status: cognition 121, teaching 17, runtime 19, formation 182,
smoke 67 — all green.
Docs: ADR-0027 (Accepted) + docs/identity_packs.md (operational ref) +
README.md §Identity Packs + docs/teaching_order.md Layer 1 cross-ref.
6.7 KiB
Teaching Order — How to Curriculum CORE
Status: Reference doctrine. Update only when the formation pipeline's gate semantics change.
Last updated: 2026-05-17
Companion docs: formation_pipeline_plan.md, capability_roadmap.md, sessions/SESSION-2026-05-15-capability-gates.md
TL;DR
Teach in prerequisite-topological order, not in pedagogical grade order. The "elementary → college" intuition is correct at the macro level (simple before composed, anchored before novel) and wrong at the literal level (do not start with a 3rd-grade language-arts corpus). Start with the smallest set of CORE-grade primitives the formation pipeline can ratify, then expand the prerequisite DAG outward.
Why order matters in CORE specifically
CORE is not a transformer absorbing a corpus. Three structural reasons force a strict ordering:
formation/ratify.pyG3 checks that every relation'sheadandtailconcepts already exist as mastered or in-scope predecessors. Teach a triple whose endpoints aren't anchored and the gate hard-fails.formation/index.py::MasteredCoursesIndexis built specifically so the next course's P3 (prerequisites) can read prior mastery. The system is curriculum-DAG-aware by construction; there is nowhere to hide an out-of-order triple.- CGA recall is exact algebraic distance, not a fuzzy embedding. A concept's position in the manifold is determined by the relations it participates in. Teaching
gravity ENTAILS massbeforemassandgravityare seeded produces an under-constrained point — the equivalent of writing equations with undefined variables.
A sampling architecture absorbs corpora regardless of order because the loss surface averages everything out. CORE has no loss surface. Order is part of the construction.
The Five-Layer Ordering Rule
Always teach in this order, both globally and re-applied within every new domain:
-
Identity axes and refusal probes. Seeded first so identity is load-bearing before any content lands. As of ADR-0027 the runtime identity manifold is loaded from a swappable pack at
packs/identity/<pack_id>.json; the ship default isdefault_general_v1. Theformation/templates/identity_anchor.pytemplate ratifies new identity packs through the standard formation gates. Canned override probes live information/templates/_common.py::IDENTITY_OVERRIDE_PROBES. Reference:identity_packs.md. Adversarial probes must be defined before the concepts they protect. -
Atomic definitions. Concepts with no internal structure —
is_a,kind_of,instance_ofonly. These are the leaf nodes of the prerequisite DAG. No relation in a step-2 course references a concept defined later in the same course. -
Binary relations between defined concepts.
entails,composes,contrasts,causes,precedes, etc. — exactly the 17 predicates currently in theen_core_cognition_v1pack, applied only to concepts ratified in step 2. -
Composed relations. Chains that reuse step-3 predicates (
A causes B AND B entails C ⇒ A licenses C). These exercisecompose_relationsand the realizer's chain-handling — the work that lifted the discourse_paragraph lane from 68.8% → 100%. -
Domain expansion. 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.
The failure mode this rule prevents: a triple lands whose tail concept is "scheduled for next week" — ratify.py G3 fails, the course is rejected, and you've wasted the LLM mining cost on a course that can't be promoted.
What "elementary → college" gets right and wrong
Right: Build simple before composed. Anchor before extend. Teach parent_of before grandparent_of, then ancestor_of. Teach red and crimson before red is_a color and crimson is_a red.
Wrong: Don't import a K–12 ELA corpus. Most of that material is generated content (essays, stories, vocabulary lists) — the proposition graphs are mostly implicit, the relations are mostly stylistic, and the ratification gates will reject the bulk of it. CORE doesn't need stories; it needs ratified relations. A 200-triple curated kinship lane gets you further than 200,000 lines of children's literature.
The right "elementary" for CORE is the smallest closed set of primitives that exercises every gate end-to-end. That's the kinship + color + spatial + uncertainty + modal mix already prototyped in evals/identity_divergence/curriculum/teaching.jsonl.
Where the curriculum platform lives today
| Artifact | Path | Role |
|---|---|---|
| Shared 93-event teaching corpus | evals/identity_divergence/curriculum/teaching.jsonl |
Reference curriculum for identity-divergence lane |
| Curriculum generator | scripts/generate_identity_curriculum.py |
Produces teaching events across kinship / color / spatial / logical / uncertainty / modal domains |
| Axis profiles | evals/identity_divergence/axes/{axis_a,axis_b}.yaml |
Precision-first vs Generosity-first identity profiles |
| Lane contract | evals/identity_divergence/contract.md |
What the lane measures, scoring rubric, pass thresholds |
| Lane runner | evals/identity_divergence/runner.py |
Deterministic scorer |
| First course template | formation/templates/definition.py |
"Every relation = definitional edge" Course YAML template |
| Pack-template artifact | packs/common/anchors/trilingual-anchor-template.json |
Trilingual anchor template (separate concern from formation/templates/) |
Known gap (as of 2026-05-17): the identity-divergence curriculum predates the formation pipeline. Its triples currently flow through runner.py, not through Forge → Compose → Ratify → Promote. Routing existing curriculum events through the formation gates is a closing item — see formation_pipeline_plan.md.
Decision rule for "what to teach next"
Before adding any course to the queue, answer:
- Are all
headandtailconcepts in this course already inMasteredCoursesIndexor earlier in this batch? - Does the course's template type exist? (Today: only
definition. Composed-relation, procedural, falsification, and identity-anchor templates are not yet implemented.) - Is at least one identity-override probe present?
- Would
ratify.py's six gates (G1–G6) succeed against this material?
If any answer is no, the course is out of order. Move it later in the queue, or add the missing prerequisite course first.