Agent Skills: abductive-repl

Hypothesis-Test Loops via REPL for Exploratory Abductive Inference with Gay.jl colors

UncategorizedID: plurigrid/asi/abductive-repl

Install this agent skill to your local

pnpm dlx add-skill https://github.com/plurigrid/asi/tree/HEAD/plugins/asi/skills/abductive-repl

Skill Files

Browse the full folder contents for abductive-repl.

Download Skill

Loading file tree…

plugins/asi/skills/abductive-repl/SKILL.md

Skill Metadata

Name
abductive-repl
Description
Hypothesis-Test Loops via REPL for Exploratory Abductive Inference

abductive-repl

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

| Command | Description | |---------|-------------| | !teleport <id> | Jump to invader's world state | | !world | Show current world state | | !back | Return to previous world | | !abduce r g b | Infer 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 | | !history | Show 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

| Trit | Skill | Role | |------|-------|------| | -1 | slime-lisp | Validates REPL expressions | | 0 | abductive-repl | Coordinates inference | | +1 | cider-clojure | Generates 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

Scientific Skill Interleaving

This skill connects to the K-Dense-AI/claude-scientific-skills ecosystem:

Graph Theory

  • networkx [○] via bicomodule
    • Universal graph hub

Bibliography References

  • general: 734 citations in bib.duckdb

Cat# Integration

This skill maps to Cat# = Comod(P) as a bicomodule in the equipment structure:

Trit: 0 (ERGODIC)
Home: Prof
Poly Op: ⊗
Kan Role: Adj
Color: #26D826

GF(3) Naturality

The skill participates in triads satisfying:

(-1) + (0) + (+1) ≡ 0 (mod 3)

This ensures compositional coherence in the Cat# equipment structure.