Section 01

The method

What actually happens between the moment you press the button and the moment three numbers appear.

The short answer

The swarm is not a language model. It is a numerical simulation of opinion dynamics: several hundred agents, each holding a probability distribution over the possible outcomes, repeatedly averaging their beliefs with the neighbours they are willing to listen to.

Where the device has Apple’s on-device model available, that model is used for four things: naming the outcomes, naming the drivers, casting the archetypes, and writing the prose report. It never supplies a number. Where it is not available — an older OS, a device without Apple Intelligence, or the user having no model downloaded — every one of those four stages has a deterministic fallback, and the app runs identically.In the code this is the IntelligenceProvider protocol. AppleIntelligenceProvider wraps SystemLanguageModel.default from Apple’s FoundationModels framework, gated at iOS 26 / macOS 26 / visionOS 26. UnavailableIntelligenceProvider always declines, and is what the tests use.

The pipeline, stage by stage

  1. Seeding

    The run’s seed is a stable FNV-1a hash of your question and your context text joined by a pipe character. Not a timestamp, not a random draw. Two people who type the same words get the same swarm.Scenario.seed → String.stableSeed. Swift’s built-in hashValue is randomised per process and could not be used for this. The generator itself is SplitMix64, a 64-bit counter-based PRNG, with a Box–Muller transform for the Gaussian draws.

  2. Grounding (optional, off by default)

    If — and only if — the user has switched on “Ground in real sources” in Settings, the question and context text are posted to a lookup service, which returns a short digest and citations. The digest is hard-capped at 1200 characters and at most six citations before it is allowed anywhere near the rest of the pipeline. Every failure path returns no evidence and the run continues exactly as it would offline. On the default path this stage performs no network I/O at all.

  3. Extraction — what are the choices, and what drives them

    The scenario is turned into two to four mutually exclusive outcome labels and up to six weighted factors, each factor pointing at the outcome it favours.

    The deterministic parser is worth describing because it is what a great many devices run. If the question contains the word “or”, it splits there and takes the two words on either side as the labels — which is why you will see outcomes like “Stay where” and “Wait for”. If the question opens with will, is, are, can, could, should, would, does, do, did, has, have, was, were, the labels are Yes / No / Too close to call. Otherwise they are Very likely / Uncertain / Unlikely. Factors are the salient tokens of your text: at least four characters, not on a stopword list, and either capitalised or six characters or longer.PredictionService.heuristicExtraction. Both the weight and the side a factor lands on come from hashing the word itself. That last part is a real weakness and we treat it as one on the limits page.

  4. The scenario graph

    The text is mapped into a small graph of three to eight entities — each classified as an actor, a stake, a constraint, a driver or an event — plus up to eight labelled relations between them. The graph is what the archetypes are cast from, so that the panel argues about the things in your scenario rather than about the raw sentence. The app shows it as “Scenario map”.

  5. Casting the panel — eight archetypes

    Orakl casts eight archetypes by default, clamped to between three and twelve.PersonaFactory.defaultCount = 8. Kept small on purpose: these become groups of agents, and more than about a dozen distinct worldviews stops being legible on a phone. Each carries a name, a one-sentence worldview, and four numbers in the range 0–1: conviction (how hard it holds its opening position), conformity (how readily it moves toward its neighbours), openness (how far from its own view it will still listen), and share (what fraction of the swarm is cast from it).

    This is where the opposing priors are seeded. On the model path the instruction is explicit: spread the panel across the outcomes, they must not all start in the same place. On the deterministic path the leaning of archetype i is simply i modulo the number of outcomes — a mechanical guarantee that the panel starts divided.

  6. The swarm

    Every agent is instantiated from an archetype and inherits its temperament, jittered by ±0.06. Its opening belief starts near the factor prior, perturbed by its own noise, then tilted toward its archetype’s leaning by a pull of 0.25 + 1.75 × conviction. Agents also get a contrarian coefficient, which for a persona-seeded agent is (1 − conformity)3 times a uniform draw.

    The agents are wired into a Watts–Strogatz small-world graph: each agent connected to its four nearest neighbours on each side, with 10% of those edges rewired at random to a distant agent. Neighbour lists are sorted before use — floating-point addition is not associative, and an unsorted adjacency set was once enough to break reproducibility.That was a real defect, fixed in the engine on 5 August 2026: Array(Set) does not enumerate in a stable order, so the same seed produced different arithmetic on different launches.

    Two configurations ship. Free runs 40 agents for 12 rounds. Premium — “Deep Simulation” — runs 600 agents for 32 rounds. Degree and rewiring are the same in both.

  7. What happens in one round

    For each agent, in every round, four things happen in order:

    • Bounded-confidence averaging. The agent looks at its neighbours and ignores any whose belief vector is further away than twice its own openness, measured as an L1 distance. It averages the rest, then moves toward that average by its conformity: b ← (1 − w) · b + w · mean(neighbours).
    • Factor drift. A nudge of 0.05 × expertise toward the prior implied by the extracted factors, so the evidence in your text keeps exerting pressure rather than being washed out by conversation.
    • Contrarian pull. The agent’s belief mass on whatever the swarm currently favours is multiplied by 1 − 0.25 × contrarian. Agents built to object keep objecting.
    • Renormalisation, so the belief vector remains a probability distribution.

    At the end of each round the mean belief mass on the leading outcome is recorded. That series is the convergence curve the app draws as “How consensus formed”. It deliberately measures mean belief mass rather than the share of agents whose top choice is the leader — the latter is a hard threshold and renders a flat line even while opinion is genuinely moving.

  8. The three numbers

    After the last round each agent’s stance is the outcome it now holds most belief in. Counting those stances gives the distribution, and everything the app reports is a function of it.

    • Leans is the leading outcome and its share of agents.
    • Confidence is 1 − H, where H is the Shannon entropy of the distribution normalised to the number of outcomes. It is a measure of how concentrated the vote was, and nothing else.
    • Split is 1 − (p₁ − p₂): one minus the gap between the top two outcomes.

    These are displayed truncated, not rounded, so a 50.8% lead reads as 50%.The app formats them as Int(x × 100). The prose report generated alongside uses the same truncation, which is why the headline figure and the report can differ by one point. Reading the numbers takes these apart properly, including the case where two of them carry the same information.

  9. The report agent

    A final pass reads the finished run — the distribution, which archetypes moved, which held out — and produces a headline, a few sentences of reasoning, a list of what drove the result, a list of what would have to change to flip it, and a fragility figure. When the on-device model writes that prose, the fragility number and the driver list are still computed from the run and overwritten onto the model’s answer. The model is allowed to narrate; it is not allowed to score.

Is it deterministic?

Yes, and we checked rather than asserting it. Running the shipping engine twice in two separate processes over the same five scenarios produced byte-identical output, including all 32 convergence values of each run.

Two things had to be fixed to make that true, and both are worth naming because they are the kind of defect that hides: the small-world adjacency sets had to be sorted before the belief sums were taken, and the tie-break used when folding agents back onto their archetypes had to be changed from dictionary order to the lowest outcome index. Swift randomises its hash seed per process, so both would have silently produced a different answer on a second launch.

Change one character of your question and the seed changes completely, so the run changes completely. That is the intended behaviour, not instability — but it does mean that rephrasing a question is not a way to test the robustness of an answer.

What this method is not

It is a model of how a divided group converges, calibrated against nothing. There is no training corpus, no historical base rate, no outcome data. The small-world topology, the degree of four, the 10% rewiring, the 0.05 drift coefficient and the 0.25 contrarian coefficient are modelling choices, and we cannot show you evidence that they are the right ones. They were chosen to produce a simulation that argues rather than one that immediately agrees with itself.

What the method genuinely gives you is a disciplined and reproducible way of laying out a decision, with the disagreement preserved instead of averaged away. That is the claim. Anything beyond it, we do not know.