feat(identity-packs): ADR-0027 — swappable identity manifold via packs
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.