docs / build with the engine

iOS build & device checklist

iOS 17 builds; nothing validated on a phone yet.

Cleanup Engine is an unreleased developer preview. These guides are generated from the SDK repository, which is private for now; file paths are shown as text. Request access.

The engine builds for iOS 17 (Examples/iOSConsumer links PomvoxCleanup, PomvoxNotes, PomvoxCleanupMLX and PomvoxDiarizationFluid with no deployment-target override). Nothing has run on an iPhone. Every number in the tables below is "not measured here" until a session with a device fills it in from commands it ran, naming the device, iOS version, build configuration and packs. This page is the checklist that session executes. It is not a support statement.

What is known before a device is involved

FactValueSource
Deployment flooriOS 17, set by mlx-swift-lm, swift-tokenizers and FluidAudio 0.15.5iOS consumer build, docs/testing.md
Cleanup pack simplewords-v3 (8-bit)2,020,106,400 bytes of artifacts (1.88 GiB on disk)packs/simplewords-v3/pack.json; du on an installed pack
Diarizer pack pyannote-community1-coreml20.7 MiB on diskdu on an installed pack
Output cap per cleanup requestmax(64, min(2 × input tokens, 1,024)) tokensdocs/contract.md
Cleanup throughput on an Apple M1 Mac0.6 s + chars / 110 ch/s (the measuredM1 fit)CleanupBudgetPolicy.measuredM1; a Mac, not a phone
Diarizer cancellationa running FluidAudio 0.15.5 pipeline cannot be interrupted; release waits for itdocs/speaker-notes.md, docs/evidence/diarizer-cancel-2026-10-11.json (M1 Mac)

The 1.9 GB cleanup pack was sized for a 16 GB Mac. Whether an iPhone's per-app memory limit admits it is the first thing to find out, and a smaller pack is tracked in #30 and #2. The 600 s deadlines in the app are guesses, not benchmarks. Replace them with figures from this protocol.

Setup

  1. Build the app (or Examples/iOSConsumer) in Release with deployment target iOS 17. Record the Xcode version and the engine tag.
  2. Put the installed packs in the app's container (for example with the Xcode devices window or the Files app). The engine never downloads. Record each pack's pack.json id, version and digest.
  3. Before each measured run, record ProcessInfo.processInfo.thermalState, battery level, Low Power Mode, and os_proc_available_memory().
  4. Use consented, scripted speech. Keep recordings and transcripts out of this public repository. Record their length, speaker count and noise condition.

Checks

1. Offline pack load (airplane mode)

Turn on airplane mode, kill the app, launch it, open the cleaner (Cleaner.open(pack:runtime: .mlx)) and the diarizer (FluidDiarizer.open).

2. Recording protocol

Three lengths, two speaker counts, two conditions, each run three times (first run after a fresh launch counts as cold, the rest warm):

LengthSpeakersCondition
short (about 1 min)2, 3quiet, noisy
15 min2, 3quiet, noisy
60 min2, 3quiet, noisy

Pipeline per run: host STT with word timings → FluidDiarizer.diarize → Transcript.attribute → cleanIncrementally with TranscriptCleanOptions(turnBudget:segmentation: TurnSegmentation()) → Notes.extract.

3. What to measure, every run

4. Cancellation

5. Background and foreground

iOS restricts GPU work for backgrounded apps. Record exactly what happens rather than assuming:

6. Quote ranges

For every NoteItem, check that the bytes start..<end of its turn's cleaned text equal item.text, and that TextEdit.utf16Range converts it for UIKit or SwiftUI highlighting. For split turns, check that the quote falls in one SegmentOutcome output range and that the source range shown to the user contains the spoken words. Report any mismatch with the turn's bytes (redacted if private).

Results matrix (fill in; leave "not measured here" where a cell was not run)

DeviceiOSPackRecordingRunsDiarize totalCleanup totalPeak memoryResidual memoryWorst thermalFallbacks by reasonNotes
not measured heresimplewords-v3short, 2 spk, quiet
not measured heresimplewords-v315 min, 2 spk, quiet
not measured heresimplewords-v360 min, 3 spk, noisy
not measured herepyannote-community1-coreml60 min, 3 spk, noisyn/an/a
DeviceAirplane-mode loadCancel during loadCancel during diarize (release time)Resume equals uninterruptedBackground during cleanupBackground during diarize
not measured here

Keep the raw records as JSON under docs/evidence/ (device identifier, iOS version, build configuration, pack ids and digests, every outcome), as the Mac evidence files do. A claim that iOS is supported needs this table filled for at least one device per memory class the app targets.