Skip to content

0.7.3 — deploys to macOS 26 / iOS 26; Apple's foundation model as a decision backend; measured catalog sizes

Latest

Choose a tag to compare

@john-rocky john-rocky released this 24 Sep 23:08
· 36 commits to main since this release

A patch, additive. The package deploys to macOS 26 / iOS 26 (was 27): an app or package with a 26 floor can depend on the kit and use Core AI behind #available(macOS 27, iOS 27, *); models still run on 27 only (#56, Mattt Zmuda). Apple's on-device foundation model is a decision backend (FoundationModelDecisions, systemone serve --backend fm). Catalog sizes are measured decimal MB, and the MinerU, GLM-OCR and Nemotron loaders download their pinned revision. exact: "0.7.2" resolvers move to 0.7.3; from: resolvers pick it up.

Start here: installation and smallest working example · System One, on device · Examples/Decide

brew upgrade systemone                                        # from 0.7.2
.package(url: "https://github.com/john-rocky/coreai-kit", exact: "0.7.3")

Added

  • Deploys to macOS 26 / iOS 26. The package floor is macOS 26 / iOS 26 (was 27), so an
    app or package with a 26 floor can depend on the kit and use Core AI behind
    #available(macOS 27, iOS 27, *). Everything that touches Core AI, plus SystemTranscriber,
    FoundationModelDecisions, TranscriptRenderer and VLPromptRenderer (27-only Speech and
    Foundation Models APIs), is @available(macOS 27, iOS 27, *); CoreAIKitCore, the Decision
    types, SystemOneServer and CoreAI.Op stay at 26. systemone and coreai-doctor exit with
    a message below 27. On x86_64 macOS the Float16 paths are compiled out, the same guard as
    coreai-models 0.2.8-zoo. Models still run on 27 only. (#56, Mattt Zmuda)

  • Apple's on-device foundation model as a decision backend. FoundationModelDecisions
    (Sources/CoreAIKit/Decide) answers typed questions on the FoundationModels framework's
    SystemLanguageModel.default by guided generation: a choice is an enumeration of its option
    ids, a noul a Bool, a score an Int within its levels, sampled greedily, so the model can only
    answer with a listed value. Nothing is scored — the framework exposes no logits — so an answer's
    probabilities are one-hot (1 on the generated value), its confidence 1, and a SystemOne.Response
    from it carries metadata (probabilities: one-hot, calibration: none). The state goes into
    the session's instructions once; consecutive questions on the same state continue one
    transcript (Configuration.shareSession, the analogue of sharePrefix), or each starts a new
    session. A guardrail violation, a model refusal and a prompt past the context window are
    DecisionError.refused, a server's 422. init throws with the reason when Apple Intelligence
    is unavailable. DecisionBackend is the protocol both it and TypedDecisions satisfy;
    SystemOneServer takes either (init(backend:); decider is now optional), and
    decide-cli ask | bench | filter | serve --backend fm answer on it (the model id is
    apple-foundation-model). No catalog model's path changes.

Fixed

  • Download sizes are in one unit, and measured. systemone models showed
    apus-decision-v1-4b as a 5.5 GB download. It is 5,770,814,420 bytes: 5.8 GB. Everything that
    reads sizeMB counts decimal megabytes: capability(), the residency estimate, systemone models, the docs. 34 of the catalog's 111 variant sizes were MiB instead (bytes / 1,048,576),
    4.9% low. Another 21 were more than 2% off for other reasons, among them round-number
    estimates, subtrees a loader downloads left out (VibeVoice's glue, voices and embedding table,
    369 MB), and iOS figures above what the iOS subtree holds (VoxCPM2: 5,658 MB declared, 4,727 MB
    downloaded). scripts/measure-catalog-sizes.py now measures all 111 at the pinned revision and
    writes catalog.json and the built-in copy together. CI runs its --check, which fails on a
    size more than 2% off. systemone models and apps that load the live catalog already show the
    new sizes; capability(), the residency estimate and the MCP models tool read the built-in
    copy, which carries them from this release. Docs and examples that quoted an old size quote the
    new one.
  • KitMineruReader(catalog:), KitGlmOcrReader(catalog:) and KitNemotronModel(catalog:)
    downloaded the model repo's main
    , not the revision the catalog entry pins. An upload to one
    of those repos would have reached apps without a reviewed pin bump. They now download the
    pinned revision, as every other catalog: initializer does; CoreAI.read reaches the first
    two. On 2026-09-24 main held the same files as the pins under the paths they fetch. A copy
    cached from main is not reused while online: the first load after updating downloads the
    pinned revision again (2.6 GB for MinerU, 1.7 GB for GLM-OCR, 1.3 GB for Nemotron).

Docs

  • docs/SYSTEM_ONE.md "Which model": JevBench's public items on eight catalog models on a Mac
    and five of them on an iPhone 17 Pro (2026-09-24), with accuracy, time per question, download
    size and option limit per model, and when to name apus-decision-v1-4b instead of the
    default. The default stays minicpm5-2b on every platform.
  • docs/SYSTEM_ONE.md, TypedDecisions: the iPhone's 1,024-token limit is the pipelined engine's,
    which chat generation runs on. A decision runs on the sequential engine, where minicpm5-2b
    read prompts up to 3,789 tokens on an iPhone 17 Pro with the Mac's answer on all 111 JevBench
    hard items (kit 0.7.1). The docs had told decisions to stay under 1,024 tokens.
  • docs/SYSTEM_ONE.md "What it costs", Examples/Decide/README.md: the iPhone's time per
    decision on kit 0.7.1, where a recurrent hybrid reuses the checkpointed state: 263 ms on
    openthai-systemone, 517 ms on decider-0.8b, 1,040 ms on qwen3.5-2b-decision (101 ms on
    minicpm5-2b). The pages had the figures from before the checkpoint and said the phone had
    not been measured with it.

Verified environment

  • Mac: M4 Max, macOS 27.0 26A428, Xcode 27 27A266a. CI on the release commit: build-test and example-app-release pass. The ChatDemo entry-check on this release's tree, from an empty cache: chat and fm (ORCHID recall on the second turn) on the built-in Qwen3 0.6B pin, and hybrid (two ChatSession turns on qwen3.5-0.8b, the first turn recalled) pass.
  • A minimal package with a macOS 26 floor that adds CoreAIKit by URL at exact: "0.7.3" builds in Release for arm64 and x86_64 in one binary, and reads the catalog behind #available(macOS 27, iOS 27, *). CoreAIOps also builds for iOS at the 26 floor (generic iOS destination), with no availability errors.
  • systemone-0.7.3-macos-arm64.zip: Developer ID signed and notarized, and the notary ticket names this binary's cdhash. From the tap, brew upgrade systemone moves 0.7.2 to 0.7.3 in 7 s, and brew test passes. systemone serve answers /health with 200 3.7 s after launch (the weights were already in the file cache).