Asi bisimulation-oracle
install
source · Clone the upstream repo
git clone https://github.com/plurigrid/asi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bisimulation-oracle" ~/.claude/skills/plurigrid-asi-bisimulation-oracle && rm -rf "$T"
manifest:
skills/bisimulation-oracle/SKILL.mdsource content
Bisimulation Oracle
Formal Specification
Type
<<<<<<< HEAD BisimOracle : (System, System) → {bisimilar, not-bisimilar, unknown} System = Labeled Transition System (LTS): S = (States, Actions, →, s₀) where → ⊆ States × Actions × States Bisimulation R ⊆ S₁ × S₂ is a relation such that: ∀ (p, q) ∈ R: ∀ a ∈ Actions, p → p' ⟹ ∃ q' : q → q' ∧ (p', q') ∈ R (p simulates q) ∀ a ∈ Actions, q → q' ⟹ ∃ p' : p → p' ∧ (p', q') ∈ R (q simulates p) p ~bis q ⟺ ∃ bisimulation R : (p, q) ∈ R ======= BisimOracle : (System, System) -> {bisimilar, not-bisimilar, unknown} System = Labeled Transition System (LTS): S = (States, Actions, ->, s0) where -> is a subset of States x Actions x States Bisimulation R is a relation on S1 x S2 such that: for all (p, q) in R: for all a in Actions, p ->a p' implies exists q' : q ->a q' and (p', q') in R for all a in Actions, q ->a q' implies exists p' : p ->a p' and (p', q') in R >>>>>>> origin/main
Preconditions
<<<<<<< HEAD
- Both systems have finite state spaces OR the oracle uses coinductive (greatest fixpoint) checking
- Action labels are comparable (same action alphabet, or alphabet mapped via a function) =======
- Both systems have finite state spaces OR the oracle uses coinductive checking
- Action labels are comparable (same alphabet or mapped)
origin/main
- For the game oracle: both players have rational strategies
Postconditions
- Returns EXACTLY one of:
|bisimilar
|not-bisimilar
<<<<<<< HEADunknown
→ witnessed by an explicit bisimulation relation Rbisimilar
→ witnessed by an explicit distinguishing tracenot-bisimilar
→ oracle timeout or infinite-state system (NOT a probability)unknown
Bisimulation Game (Attacker/Defender)
The oracle IS a game between two players:
======= 2.
bisimilar is witnessed by an explicit bisimulation relation R
3. not-bisimilar is witnessed by an explicit distinguishing trace
4. unknown means oracle timeout or infinite-state system (NOT a probability)
Bisimulation Game (Attacker/Defender)
origin/main
Players: Attacker (wants to show NOT bisimilar) Defender (wants to show bisimilar) <<<<<<< HEAD Initial: (p, q) ∈ S₁ × S₂ Each round: 1. Attacker picks one system and fires a transition: p →ᵃ p' (or q →ᵃ q') 2. Defender must match: q →ᵃ q' (or p →ᵃ p', respectively) 3. New state: (p', q') Winning condition: Attacker wins if Defender cannot match a transition → systems NOT bisimilar Defender wins if game runs forever → systems ARE bisimilar (coinductive)
Implementation
from dataclasses import dataclass from typing import Optional, Set, Tuple ======= Initial: (p, q) in S1 x S2 Each round: 1. Attacker picks one system and fires a transition: p ->a p' 2. Defender must match: q ->a q' 3. New state: (p', q') Winning condition: Attacker wins if Defender cannot match -> NOT bisimilar Defender wins if game runs forever -> ARE bisimilar (coinductive)
Implementation (Paige-Tarjan Partition Refinement)
from dataclasses import dataclass from typing import Optional, Set >>>>>>> origin/main @dataclass class LTS: states: Set[str] actions: Set[str] transitions: dict # {(state, action): set of states} initial: str def bisim_oracle(lts1: LTS, lts2: LTS) -> tuple[str, Optional[object]]: """ Requirement: lts1 and lts2 have finite state spaces Postcondition: returns ('bisimilar', relation) | ('not-bisimilar', trace) | ('unknown', None) """ <<<<<<< HEAD # Compute bisimulation via partition refinement (Paige-Tarjan) ======= >>>>>>> origin/main partition = _initial_partition(lts1, lts2) while True: new_partition = _refine(partition, lts1, lts2) if new_partition == partition: <<<<<<< HEAD break # fixpoint reached partition = new_partition # Check if initial states are in same equivalence class ======= break partition = new_partition >>>>>>> origin/main if _same_class(lts1.initial, lts2.initial, partition): relation = _extract_relation(partition) return ('bisimilar', relation) else: trace = _extract_distinguishing_trace(lts1.initial, lts2.initial, partition, lts1, lts2) return ('not-bisimilar', trace) def _refine(partition, lts1, lts2): """Split classes by observable transitions.""" new_partition = [] for cls in partition: splits = {} for state in cls: <<<<<<< HEAD # Signature: for each action, which classes are reachable? ======= >>>>>>> origin/main sig = tuple(sorted( (a, frozenset(_class_of(s, partition) for s in _successors(state, a, lts1, lts2))) for a in lts1.actions | lts2.actions )) splits.setdefault(sig, set()).add(state) new_partition.extend(splits.values()) return new_partition
<<<<<<< HEAD
GF(3)-Colored Bisimulation
Skills bisimulate each other ONLY within the same GF(3) trit class:
Requirement: TritOracle(s₁) = TritOracle(s₂) (same trit class) Postcondition: only then is BisimOracle(s₁, s₂) meaningful GF(3)-Colored Bisimulation: R ⊆ {s₁ ∈ S₁ | trit(s₁) = t} × {s₂ ∈ S₂ | trit(s₂) = t} for some t ∈ {-1, 0, +1} Cross-trit bisimulation: ALWAYS not-bisimilar (different capability classes)
def gf3_bisim_oracle(skill1: str, skill2: str) -> tuple[str, Optional[object]]: """ Precondition: both skills exist in the ASI registry Postcondition: bisimilarity check within same trit class only Requirement: TritOracle(skill1) == TritOracle(skill2) """ t1 = gf3_trit_oracle(skill1) t2 = gf3_trit_oracle(skill2) # Cross-trit: immediately not-bisimilar if t1 != t2: trace = f"Trit mismatch: {skill1}={t1} vs {skill2}={t2}" return ('not-bisimilar', trace) # Same-trit: run behavioral bisimulation lts1 = skill_to_lts(skill1) # convert skill behavior to LTS lts2 = skill_to_lts(skill2) return bisim_oracle(lts1, lts2)
Concrete Oracles in the Stack
Each of these is a specific bisimulation query with specific requirements:
Oracle 1: Are two interleave skills equivalent?
# Requirement: both skills have SKILL.md with identical "tags:" arrays # Requirement: both are trit:0 (BRIDGE role) # Query: are vertex-asi-interleave and bigquery-asi-interleave bisimilar? # Answer: NOT bisimilar — distinguishing trace: # vertex-asi-interleave accepts action "call-gemini" → state GEMINI_RESPONSE # bigquery-asi-interleave has no "call-gemini" transition → STUCK # ∴ Attacker wins on first round
Oracle 2: Are two skill implementations equivalent?
# Requirement: two implementations of "abductive hypothesis scoring" # Implementation A: Gemini API call # Implementation B: local bayesian-breathing MCMC # Query: do they produce bisimilar behaviors on all inputs? # Key: they may be WEAKLY bisimilar (same external observations, different internals) # Weak bisimulation: allows internal τ-transitions to be skipped
Oracle 3: Did a skill update preserve behavior? (pre-commit)
=======
Concrete Oracles
Oracle 1: Are two skills equivalent?
# Requirement: both skills have SKILL.md # Example: vertex-asi-interleave vs bigquery-asi-interleave # Answer: NOT bisimilar -- vertex accepts "call-gemini" action, bigquery does not # Attacker wins on first round
Oracle 2: Did a skill update preserve behavior? (pre-commit)
origin/main
# Requirement: git diff shows changes to a skill # Precondition: pre-commit hook invokes this oracle <<<<<<< HEAD # Query: is skill_old ~bis skill_new? git stash # get old version old_lts=$(skill_to_lts "$SKILL_NAME") git stash pop # get new version ======= git stash old_lts=$(skill_to_lts "$SKILL_NAME") git stash pop >>>>>>> origin/main new_lts=$(skill_to_lts "$SKILL_NAME") result=$(bisim_oracle "$old_lts" "$new_lts") if [ "$result" = "not-bisimilar" ]; then echo "BLOCKED: skill update changes observable behavior" echo "Distinguishing trace: $(get_trace)" exit 1 fi
<<<<<<< HEAD
Oracle 4: Neurofeedback State Equivalence
// Requirement: two EEG session states // Query: are they bisimilar in terms of observable focus behavior? // Answer: YES iff they produce identical CellValue trit sequences fn eeg_state_bisim(s1: EEGState, s2: EEGState) bool { // Both states produce the same trit trajectory under any input const trit1 = neurofeedback_trit(s1.focus); const trit2 = neurofeedback_trit(s2.focus); // Strong bisimulation: must produce identical trits (not just similar) return trit1 == trit2; }
What This Oracle Is NOT
- NOT a similarity score (0.87 similar) — bisimulation is Boolean
- NOT probabilistic — no "probably bisimilar"
- NOT transitive by default — bisimulation is an equivalence relation, but must be proved
- NOT defined on strings — systems must be LTSes (transition systems)
- NOT a heuristic — if unknown, the oracle says
, not its best guessunknown
Related Skills
— the existing ASI skill (Validator, out-degree 5)bisimulation-game
— trit prerequisite for GF(3)-colored bisimulationgf3-trit-oracle
— parallel verification (Validator role)spi-parallel-verify
— capability proof oracle (Validator role)proof-of-frog
— CellValue lattice (partial information oracle)propagators
— behavioral equivalence under timing side-channelsconstant-time-analysis
— oracle for cryptographic property verificationwycheproof
— pre-commit hook using this oracle =======gf3-pr-verify
What This Oracle Is NOT
- NOT a similarity score (0.87 similar) -- bisimulation is Boolean
- NOT probabilistic -- no "probably bisimilar"
- NOT defined on strings -- systems must be LTSes
- NOT a heuristic -- if unknown, says
, not its best guessunknown
origin/main