Fixed: the offline fallback resolved unpinned revisions
ModelCatalog.load() falls back to the compiled-in ModelCatalog.builtin when the network fetch of catalog.json fails — and that literal carried no revision pins, while CatalogEntry.modelID(path:) resolves revision ?? "main". A network failure therefore downgraded a shipped app from the exact bytes that were gated to whatever a model repository's main branch held at that moment: the opposite of what the catalog promises.
Pins are now generated from catalog.json into BuiltinPins.swift and overlaid onto the literal. CI fails if the two drift, and a unit test fails if any entry reaches builtin without a pin.
Apps pinned to 0.2.0 or earlier are affected, along the fallback path only — an app that has never seen a catalog fetch failure has never hit it. Upgrading needs no code change.
New capabilities
KitDialogue— multi-speaker text-to-speech (VibeVoice-Realtime-0.5B).perform("Speaker 1: …\nSpeaker 2: …")renders each turn from its own voice preset. 25 packaged voices, free text, no torch dependency. Pairs withKitDiarizerfor a generate → diarize loop.KitSeparator— music source separation (Mel-Band RoFormer): a song in, vocals and instrumental stems out. ~6.5× real-time on an iPhone 17 Pro.- Nanbeige4.2 3B — the catalog's first community-contributed model, ported and published by @ukint-vs (zoo PR #6) and served from their own Hugging Face repo at a pinned revision. Device-gated on iPhone 17 Pro: token-exact against the fp32 oracle, 24/24 across two runs.
- iOS dynamic-KV guard — the on-device compiler miscompiles dynamically-sized-KV specializations at sequence length ≥ 2048, producing corrupt output from the first token. The engine now caps a pipelined turn's KV pre-grow at 1024 on iOS for those bundles. Tracked in #5; upstream apple/coreai-models#124. The guard comes out when the compiler fix lands.
StatefulGraphModel.seedState(keys:values:prefillLength:)— seed a decode bundle's KV cache from an external prefill instead of replaying it.AudioFile.pcmStereo(_:sampleRate:)— full-band stereo decode, for the separation models.
Documentation
SECURITY.md— the trust boundary, including what is absent:catalog.jsonis unsigned, downloads carry no independent checksum manifest, bundles are not code-signed. Production apps can host their own catalog viaModelCatalog.load(from:).AGENTS.md— the contract for coding agents: which layer to reach for, the catalog as data to read rather than guess at, and the failures that only appear on real hardware.- Every example app now has a README, and the package publishes an
llms.txtindex.
Full detail in CHANGELOG.md.