abductive-repl

SkillAI & models

Hypothesis-Test Loops via REPL for Exploratory Abductive Inference

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the abductive-repl skill

What this skill tells your AI

The instructions your AI receives, as published by plurigrid/asi in skills/abductive-repl/SKILL.md and read by ahel’s review.

Hypothesis-Test Loops via REPL for Exploratory Abductive Inference

Version: 1.0.0 Trit: 0 (Ergodic - coordinates inference) Bundle: repl

Overview

Abductive-REPL enables exploratory abductive reasoning through an interactive REPL. Given observed outcomes, it generates hypotheses, tests them, and refines understanding through iterative loops.

Core Concept

Observation → Generate Hypotheses → Test → Refine → Repeat

Abduction: Given effect E and rule "A implies E",
           hypothesize A as possible cause.

Capabilities

1. abduce-from-observation

Generate hypotheses from observed behavior.

from abductive_repl import AbductiveEngine

engine = AbductiveEngine(seed=0xf061ebbc2ca74d78)

# Observed: A specific color was generated
observed_color = RGB(216, 125, 157)

hypotheses = engine.abduce(
    observation=observed_color,
    search_space="invader_ids",
    search_range=range(1, 10000),
    top_k=5
)

# Returns ranked hypotheses:
# [
#   {hypothesis: "invader_id=42069", confidence: 0.98, distance: 0.02},
#   {hypothesis: "invader_id=42070", confidence: 0.45, distance: 0.55},
#   ...
# ]

2. repl-commands

Interactive REPL mode for exploration.

gay> !teleport 42069
Teleporting to invader 42069...
  Source color: RGB(180, 90, 120)
  Derangement: cyclic_1
  World color: RGB(216, 125, 157)
  Tropical t: 0.69

gay> !abduce 216 125 157
Generating hypotheses for RGB(216, 125, 157)...
  [1] invader_id=42069 (confidence: 0.98)
  [2] invader_id=42070 (confidence: 0.45)
  [3] invader_id=41999 (confidence: 0.23)

gay> !jump 1
Jumping to hypothesis 1 (invader_id=42069)...
  ✓ Hypothesis confirmed!

gay> !neighbors 5
Finding 5 neighbors of invader 42069...
  42068: RGB(214, 123, 155) distance=0.02
  42070: RGB(218, 127, 159) distance=0.02
  42067: RGB(212, 121, 153) distance=0.04
  ...

gay> !test 100
Running abductive roundtrip tests (n=100)...
  ✓ 100/100 passed (100% accuracy)
  Average inference time: 2.3ms

3. forward-simulate

Simulate forward from hypothesis to predict observations.

simulation = engine.forward_simulate(
    hypothesis="invader_id=42069",
    seed=0xf061ebbc2ca74d78
)

# Returns:
# {
#   id: 42069,
#   source: RGB(180, 90, 120),
#   derangement_idx: 1,
#   tropical_t: 0.69,
#   world: RGB(216, 125, 157),
#   properties: {
#     spi_determinism: True,
#     derangement_bijectivity: True,
#     tropical_idempotence: True,
#     spin_consistency: True
#   }
# }

4. roundtrip-test

Verify abductive inference accuracy.

def abductive_roundtrip_test(id: int, seed: int) -> bool:
    """
    Forward simulate → Abduce back → Check if recovered
    """
    # Forward
    sim = forward_simulate(id, seed)

    # Abduce
    hypotheses = abduce(
        observation=sim.world,
        search_range=range(id - 100, id + 100),
        top_k=1
    )

    # Verify
    return hypotheses[0].hypothesis == f"invader_id={id}"

# Run batch
results = [abductive_roundtrip_test(i, SEED) for i in range(1, 1001)]
accuracy = sum(results) / len(results)
assert accuracy > 0.99

5. hypothesis-refinement

Iteratively refine hypotheses based on feedback.

# Initial hypothesis
hypothesis = engine.initial_hypothesis(observation)

for iteration in range(max_iterations):
    # Test hypothesis
    prediction = engine.predict(hypothesis)
    error = distance(prediction, observation)

    if error < threshold:
        break

    # Refine based on error
    hypothesis = engine.refine(hypothesis, error, observation)

print(f"Converged after {iteration} iterations")

REPL Command Reference

CommandDescription
!teleport <id>Jump to invader's world state
!worldShow current world state
!backReturn to previous world
!abduce r g bInfer invader from observed RGB
!jump <n>Jump to nth hypothesis
!neighbors [r]Explore nearby invaders (radius r)
!test [n]Run n abductive roundtrip tests
!property <name>Test specific property
!historyShow teleportation history
!seed [s]Get/set RNG seed

Properties (Testable Predicates)

class SPIDeterminism:
    """Same input always produces same output."""

class DerangementBijectivity:
    """Derangement is reversible."""

class TropicalIdempotence:
    """tropical_blend(x, x, t) = x for all t."""

class SpinConsistency:
    """Spin direction preserved through transformations."""

def test_all_properties(id: int, seed: int) -> dict:
    return {
        "spi_determinism": test_property(SPIDeterminism(), id, seed),
        "derangement_bijectivity": test_property(DerangementBijectivity(), id, seed),
        "tropical_idempotence": test_property(TropicalIdempotence(), id, seed),
        "spin_consistency": test_property(SpinConsistency(), id, seed)
    }

GF(3) Triad Integration

TritSkillRole
-1slime-lispValidates REPL expressions
0abductive-replCoordinates inference
+1cider-clojureGenerates evaluations

Conservation: (-1) + (0) + (+1) = 0 ✓

Configuration

# abductive-repl.yaml
inference:
  search_range_default: 10000
  top_k_default: 5
  confidence_threshold: 0.7
  max_iterations: 100

testing:
  roundtrip_batch_size: 100
  property_tests: true

repl:
  history_file: "~/.abductive_history"
  prompt: "gay> "

reproducibility:
  seed: 0xf061ebbc2ca74d78

Justfile Recipes

# Start abductive REPL
abduce-repl:
    julia --project=Gay.jl -e 'using Gay; Gay.repl()'

# Run roundtrip tests
abduce-test n="100":
    julia --project=Gay.jl -e 'using Gay; Gay.test_abductive({{n}})'

# Abduce from color
abduce-color r g b:
    julia --project=Gay.jl -e 'using Gay; Gay.abduce(RGB({{r}}/255, {{g}}/255, {{b}}/255))'

Related Skills

  • world-hopping - Possible world navigation
  • unworld - Derivation chains
  • gay-mcp - Color generation
  • cider-clojure, slime-lisp, geiser-chicken - REPL backends

REPL atlas

Part of: repl-commons. Family canonical: clojure.

Signals

GitHub stars
63
Forks
12
Last commit
Jul 2026
Advanced
Catalog kind
skill
Gateway key
abductive-repl
Source
github.com/plurigrid/asi