v5.2.0 — V5-8 capability-discovery resolver + V5-12 persona tier
V5-8 — capability-discovery resolver: the enhances: runtime
scripts/capability_resolver.py implements the soft-composition runtime: a capability-keyed, graceful-degrade resolver that answers "is capability X present on this host?" by reading installed-plugin manifests as data (never importing plugin code). A primitive declares enhances: [capability-name]; the resolver answers present/absent at load time and the caller degrades cleanly when absent. enhances ∩ requires = ∅ is a hard invariant. The check-capability-resolver-one-way gate asserts the resolver never imports plugin code (ADR 0015 DC-5).
V5-12 — persona tier: kind: persona primitive, check-personas gate, rememberer
Names the missing third architectural tier — a persona is a standing concern that composes capabilities it does not own (arbitrating among them when it composes ≥2), anchored on the neutral substrate, with hard deps (requires:) restricted to substrate-native primitives only. Zero new runtime. Three deliverables: personas/ directory; personas/rememberer.md (the degenerate first persona, naming the memory engine); scripts/check-personas.py (static gate: requires ⊆ substrate-native + no-always-load, wired into check-all.sh + CI). The chief-of-staff (first real persona, V5-11) is gated behind this substrate.
Gates
20/20 local · CI ✅ Linux / Mac / Windows