Skip to main content

fairit — ground mapping and evasion-hypothesis testing

Tests whether evasive-looking communication is actually evading anything — and if so, what. It never presumes evasion. Three stages:

  1. Ground mapping. Establish the exact situational state without forcing narrative resolution: opposing facts as parallel, non-subordinating sentences ("X is true. Y is also true." — never "X, but Y"), people as time-indexed states, every correction typed as detail vs core-claim.
  2. Evasion-hypothesis testing. Every candidate evasion — therapy-speak, corporate-speak, bureaucratic passive voice, fogging, DARVO, projection — becomes competing hypotheses: H-obfuscation / H-genuine / H-both, tested against discriminating evidence.
  3. Handoff. 2–3 seed frames plus the audited ground, handed to whatever comes next. Then the package stands down.

The one rule everything else serves: a hypothesis wins only on discriminating evidence — observations that would differ between the hypotheses. Category membership ("this is therapy-speak") is never evidence. "Insufficient evidence to distinguish" is an honest finding, not a failure.

No prerequisites. The mechanism is the whole product. No model, no network — this is pure machinery. The operator (human or model) supplies the evidence; the library enforces the testing discipline.

(Lineage: the front-facing conversion of two skills from Ryan's skill-suite, MIT — responsibility-obfuscation-probe and field-forge, converted as one unit because they share one hypothesis-testing core. What changed in the conversion is documented in CHANGELOG.md.)

Quickstart

from fairit import scan_and_test, evidence_tag_for

text = "Mistakes were made in the scoping phase. We're going to circle back."
flags = scan_and_test(text, {
    "mistakes were made": (
        "the passive phrasing names no actor; internal emails name the PM "
        "who cut scoping short — the actor is known",
        "",
    ),
    "circle back": (
        "used to end the paragraph about the miss without giving a new date",
        "",
    ),
})
for flag in flags:
    print(flag.phrase, "->", flag.record.verdict, "->", evidence_tag_for(flag.record))
# mistakes were made -> H-obfuscation -> OBFUSCATION
# circle back -> H-obfuscation -> OBFUSCATION

Full cycle demo (ground → probe → brief), no model needed:

cd probe-forge
PYTHONPATH=src python3 examples/run_cycle.py

What it does

Ground mapping (ground.py) — the pre-interrogation audit:

  • Held tensions must be parallel non-subordinating sentences. The subordinating-conjunction scan is in code: "promised a refund, but none arrived" is rejected; "promised a refund. None arrived." passes.
  • People are time-indexed states, never one flat characterization.
  • Corrections are typed detail vs core-claim. Core-claim changes — the account itself shifting — are the signal, and the library surfaces them.

Hypothesis testing (hypotheses.py) — the shared core:

  • Four verdicts: H-obfuscation, H-genuine, H-both, insufficient-evidence.
  • Code-enforced rules: H-obfuscation needs ≥1 evidence item favoring it; H-both needs evidence on both sides; insufficient-evidence must name what would resolve the open hypotheses.
  • The category-presumption check: evidence that only names a category ("therapy-speak", "uses corporate speak") is rejected with CategoryPresumptionError. This is the old probe's failure mode (pre-judging therapy-speak as armor), made impossible in code.

Probe protocol (overlay.py) — jargon in three dialects (therapy, corporate, bureaucratic; see dialects.py):

  • Detection produces candidates, never verdicts. A detected phrase with no evidence gets insufficient-evidence — the probe refuses to convict or exonerate on detection alone.
  • The evidence tag: OBFUSCATION only when H-obfuscation is supported by discriminating evidence. Everything else stays CLAIM with a hypothesis marker. Suspected-but-untested material is never upgraded on category membership alone.

Audit brief (brief.py) — the output artifact with frontmatter (artifact:, date:, protocol:, lifecycle:), Markdown render/parse, and the stand-down rule enforced in code: the brief must never contain collision, adjudication, refinement, or surprise sections. Those belong to the interrogation engine. If the engine isn't running, the brief is reported and the work stops.

Evidence taxonomy (evidence.py) — one authoritative mapping. field-forge shipped an 8-tier list; the interrogation engine uses 11 tags (10 core + overlay-only OBFUSCATION). The forge's 8 map 1:1 onto the engine's; the 3 the forge never named (HYPOTHESIS, REQUIREMENT, DEPENDENCY) are documented as recognized. check_matches_engine() guards against silent forks when the sibling package is importable.

What's honest about the limits

  • The library cannot prove a counter-hypothesis is strong — the evidence-quality judgment stays with the operator. What it makes impossible is the failure modes: verdicts without discriminating evidence, category-based presumption, silent upgrades to OBFUSCATION, subordinated tensions, and the overlay doing the engine's job.
  • The dialog procedure (asking for raw input, precision-forcing questions) is an operator protocol, documented in the examples — it isn't codeable without a model in the loop, and isn't pretended to be.

Tests

PYTHONPATH=src python3 -m unittest discover -s tests

55 offline tests: verdict rules, category-presumption rejection (the v1 regression suite), the OBFUSCATION gate, the subordinator scan, correction typing, taxonomy reconciliation, brief round-trip and stand-down, dialect detection, and a full ground→probe→brief cycle.

Metadata

Release files for fairit 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 fairit 1.0.0
File Size Uploaded
fairit-1.0.0.tar.gz 24.6 kB Details

Built distribution (wheel)

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

Total release size: 45.8 kB

Release files / fairit-1.0.0.tar.gz

Download URL fairit-1.0.0.tar.gz
Size 24.6 kB
Tags Source
SHA-256 checksum
How to use checksums
f5d3de8f1f38217244beba6cec401217c01288441d4ea5ceda50f36d3a4b8444
BLAKE2b-256 checksum
How to use checksums
1c96038c5d13b4196b91449db6ab940fa3d3df31043d2db073798919b87e3758
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 Oct 5, 2026.

Transparency log

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

Download URL fairit-1.0.0-py3-none-any.whl
Size 21.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cdd724eddaf9815195f2cac41d5ef45489f97e53c3d5309655555d51be557550
BLAKE2b-256 checksum
How to use checksums
81ededa86ad1b9167b8c7e5363c0aded99a7921475a9707df9cb39ee63e5ba47
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 Oct 5, 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