Skip to main content

IFS — Iterative Field Synthesis

A structured way to pressure-test a claim, decision, or contradiction so it comes out the other side either load-bearing or dead — with the reasoning preserved in a portable document.

No prerequisites. You don't need to know anything about the project's history, any framework, or any belief system. The mechanism is the whole product.

(Lineage: this is the front-facing conversion of the ifs-interrogation skill from Ryan's skill-suite, MIT. What changed in the conversion is documented in CHANGELOG.md — mechanism kept, original naming removed.)

What it does

You hand the engine a field — a situation, claim, or contradiction with real stakes and real uncertainty. The engine runs it through a fixed interrogation:

  1. Identify & Decompose — bound the field, name the objective and scope, tag every input with an evidence tier (FACT, CLAIM, UNKNOWN, …). Evidence is never silently upgraded: a claim stays a claim until it's proven.
  2. Diverge — build the 2 or 3 strongest internally-coherent cases (Takes). No strawmen, no premature consensus.
  3. Collide — force the Takes into conflict. Every collision names the contradiction, the premise that must break, and the discriminator evidence that decides it. If the collision doesn't hurt brittle claims, it wasn't a real collision.
  4. Refine — a skeptic pass, then extract 3–5 load-bearing Keys: crisp assertions, each with a classification, the tagged evidence behind it, a confidence level, its structural vulnerability, and its falsifier — the specific evidence that would overturn it. A Key that can't survive is discarded, not softened.
  5. Surprise + Synthesis + Capture — the non-obvious result that emerged from the collision (not from one Take), the surviving model, and the complete state artifact: a self-contained Markdown document another person or model can continue from without any of the original conversation.

Core principle: confidence and correctness are independent variables. The engine interrogates the gap between them.

Why it works

Most reasoning failures aren't stupidity — they're structural. Claims quietly upgrade into facts. The first plausible story wins and alternatives never get built. Contradictions get smoothed over with "however." IFS attacks all three mechanically:

  • Evidence tagging makes silent upgrades impossible — every input carries its tier through every phase.
  • Forced Takes mean the strongest opposing case gets built with the same care as your own.
  • Named collisions with discriminators force a decision rule instead of vibes.
  • Keys carry falsifiers, so the output tells you exactly what would prove it wrong.
  • Prior Keys are stress-tested, never inherited. In session 2+, every old Key gets a verdict — HELD, CRACKED, MODIFIED, SUPERSEDED, UNRESOLVED — and failures stay visible in the artifact instead of being quietly rewritten.

Quickstart

Zero dependencies beyond Python 3.10+ and a model to run the engine on.

cd ifs
python3 -m unittest discover -s tests     # 41 offline tests — prove the machinery first

To run a real interrogation, you need a backend — any LLM that can follow the protocol prompt:

# Fully offline: local Ollama
python3 examples/run_local.py my-field.txt --ollama

# OpenRouter (free-tier models work fine)
OPENROUTER_API_KEY=... OPENROUTER_MODEL="nvidia/nemotron-3-ultra-550b-a55b:free" \
  python3 examples/run_local.py my-field.txt

# Session 2+: feed the prior artifact back in; old Keys get stress-tested
python3 examples/run_local.py new-evidence.txt --prior interrogation-state-my-field.md --ollama

my-field.txt is just prose: the situation, the conflicting accounts, the stakes. The engine returns interrogation-state-<slug>.md — the portable artifact.

Or use it as a library:

from pressit import FieldInput, EvidenceItem, run, OllamaBackend

field = FieldInput(
    field="Q3 revenue is up 41%. The owner calls it a turnaround. Is it?",
    evidence=[
        EvidenceItem("Q3 revenue $48k; Q2 $34k (POS records)", "FACT"),
        EvidenceItem("A July estate sale moved ~2,100 rare books", "FACT"),
        EvidenceItem("Owner: 'new regulars are driving it'", "CLAIM"),
        EvidenceItem("Q4 inventory pipeline", "UNKNOWN"),
    ],
)
result = run(field, OllamaBackend())
assert result.ok
print(result.artifact["surprise"])

The four modes

Mode When
standard (default) Bounded fields: decisions, claims, single contradictions. One pass, never loops.
systemic Structural/multi-actor fields, recurring patterns. Nine stages; may iterate across sessions.
stress-test Prior state exists. Every prior Key is dispositioned; only genuinely new Keys are added.
adjudication A claim is judged against an explicit standard (a contract, a policy, a spec). Full deep run, no compression.

The optional evasion-probe overlay (off by default) handles interpersonal fields where language may be doing evasive work: it maps the observable ground, tests evasion hypotheses (never presumes them — jargon is tested as H-obfuscation / H-genuine / H-both), and feeds Take seeds into Diverge. It never replaces the engine.

Inputs, outputs

  • Input: a field description (prose), optional tagged evidence, optional prior artifact, optional overlay.
  • Output: a normalized artifact dict, or a rendered interrogation-state-<slug>.md — complete, self-contained, no placeholders, no TODOs.
  • The engine never writes files and never claims external persistence. Your code saves the artifact; the engine's job ends when it's emitted. That's the persistence boundary, and it's deliberate.

Worked examples

Three complete runs a stranger can follow, in examples/:

  1. example-1-corner-books.md — standard one-pass: is a bookstore's revenue jump a turnaround or a blip?
  2. example-2-corner-books-session-2.md — stress-test mode: new evidence meets old Keys; watch a Key get CRACKED and preserved visibly.
  3. example-3-sla-adjudication.md — adjudication mode: a vendor's SLA claim judged against the contract text.

All three fields are constructed for teaching — they show the engine's shape, not real findings.

FAQ

Is this related to Internal Family Systems therapy? No. The acronym collision is coincidental; this is an interrogation engine, not a therapeutic method.

Does it need an internet connection? Only for the model call, and only the backend you choose. With Ollama it's fully offline. The 41 unit tests never touch the network.

What does it cost? The package is free and dependency-free. The model call costs whatever your provider charges — free-tier models work; the engine was evaluated on them.

License

MIT. See LICENSE.

Release files for pressit 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pressit 1.0.0
File Size Uploaded
pressit-1.0.0.tar.gz 24.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pressit 1.0.0
File Interpreter ABI Platform
pressit-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 46.8 kB

Release files / pressit-1.0.0.tar.gz

Download URL pressit-1.0.0.tar.gz
Size 24.9 kB
Tags Source
SHA-256 checksum
How to use checksums
b78e5d41c7bad27210a0d05782334b7379dd624f36a5755f85d135c9e3ce0b4d
BLAKE2b-256 checksum
How to use checksums
98a6f2402d65f0a31c0511645527aebd579f5636f53a0342c50aa46f568b86fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release files / pressit-1.0.0-py3-none-any.whl

Download URL pressit-1.0.0-py3-none-any.whl
Size 21.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c73866b38aaf0ead3fe86919d85badc3bf4daa9500de779eef4ae5542fb47d60
BLAKE2b-256 checksum
How to use checksums
fba330d4bd5b7890f7bbcbc788e30207a8cc9c57316fdf9bad760e326fb2677d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page