Asi derivational-coalgebra

derivational-coalgebra Skill

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/derivational-coalgebra" ~/.claude/skills/plurigrid-asi-derivational-coalgebra && rm -rf "$T"
manifest: skills/derivational-coalgebra/SKILL.md
source content

derivational-coalgebra Skill

Bridge between atemporal derivations (unworld) and temporal observations (coalgebra)

The Gap

The highest tension in skill space (d=2.131):

ATEMPORAL                              TEMPORAL
    │                                      │
 unworld                           temporal-coalgebra
 dialectica                        duckdb-temporal-versioning
 unworlding-involution             changelog-generator
    │                                      │
    └──────────── d = 2.131 ───────────────┘

Resolution: Derivational Coalgebra

Coalgebraic observation of derivation streams rather than time-indexed states:

Traditional coalgebra:    S → F(S)     where F is a functor on temporal states
Derivational coalgebra:   D → F(D)     where D is the derivation poset

Key Insight

Replace

t ∈ Time
with
δ ∈ Derivation
:

TemporalDerivational
state(t)
state(δ)
t₁ < t₂
δ₁ ⊢ δ₂
lim_{t→∞}
fixpoint(δ)
∂/∂t
∂/∂δ
(sensitivity to derivation step)

Core Types

-- Derivation as a partial order (not linear time)
data Derivation a where
  Base :: a -> Derivation a
  Step :: Derivation a -> (a -> a) -> Derivation a
  Join :: Derivation a -> Derivation a -> Derivation a  -- parallel

-- Coalgebraic observation
class DerivationalCoalgebra s where
  observe :: s -> ObservationF s
  unfold  :: s -> Stream (Derivation s)

-- The functor bridges both paradigms
data ObservationF s = ObsF
  { current   :: s                    -- atemporal snapshot
  , successor :: Derivation s         -- derivational continuation
  , temporal  :: Maybe (Time, s)      -- optional temporal embedding
  }

Implementation

Python Bridge

from dataclasses import dataclass
from typing import Generic, TypeVar, Callable, Optional
from abc import ABC, abstractmethod

S = TypeVar('S')

@dataclass
class Derivation(Generic[S]):
    """Derivation step with optional temporal embedding."""
    state: S
    parent: Optional['Derivation[S]'] = None
    rule: Optional[str] = None  # derivation rule name
    timestamp: Optional[float] = None  # temporal embedding (optional)
    
    @property
    def depth(self) -> int:
        """Derivation depth (atemporal measure)."""
        if self.parent is None:
            return 0
        return 1 + self.parent.depth
    
    def derive(self, f: Callable[[S], S], rule: str = "step") -> 'Derivation[S]':
        """Create child derivation (atemporal)."""
        return Derivation(
            state=f(self.state),
            parent=self,
            rule=rule,
            timestamp=None  # no time needed
        )
    
    def embed_temporal(self, t: float) -> 'Derivation[S]':
        """Optionally embed into temporal axis."""
        return Derivation(
            state=self.state,
            parent=self.parent,
            rule=self.rule,
            timestamp=t
        )

class DerivationalCoalgebra(ABC, Generic[S]):
    """
    Bridge between atemporal derivations and temporal observations.
    
    Resolves the unworld ↔ temporal-coalgebra tension by:
    1. Representing computation as derivation chains (atemporal)
    2. Providing coalgebraic observation interface
    3. Optionally embedding into temporal axis when needed
    """
    
    @abstractmethod
    def observe(self, d: Derivation[S]) -> S:
        """Observe current state (works both temporally and atemporally)."""
        pass
    
    @abstractmethod
    def unfold(self, d: Derivation[S]) -> 'Stream[Derivation[S]]':
        """Coalgebraic unfold: generate derivation stream."""
        pass
    
    def to_temporal(self, stream: 'Stream[Derivation[S]]', 
                    dt: float = 1.0) -> 'Stream[tuple[float, S]]':
        """Embed derivation stream into temporal axis."""
        t = 0.0
        for d in stream:
            yield (t, d.state)
            t += dt
    
    def from_temporal(self, t_stream: 'Stream[tuple[float, S]]') -> 'Stream[Derivation[S]]':
        """Extract derivational structure from temporal stream."""
        prev = None
        for t, s in t_stream:
            d = Derivation(state=s, parent=prev, timestamp=t)
            yield d
            prev = d

Gay.jl Color Integration

DERIVATIONAL_COLORS = {
    'atemporal': '#5713C0',   # Stream 4 (pure derivation)
    'temporal': '#E6F463',    # Stream 2 (time-embedded)
    'bridge': '#89DF91',      # Stream 3 (translation layer)
}

def color_derivation(d: Derivation) -> str:
    """Color based on temporal embedding status."""
    if d.timestamp is None:
        return DERIVATIONAL_COLORS['atemporal']
    else:
        return DERIVATIONAL_COLORS['temporal']

Bisimulation for Equivalence

Two derivation streams are bisimilar if their observations match:

def bisimilar(d1: Derivation[S], d2: Derivation[S], 
              coalg: DerivationalCoalgebra[S]) -> bool:
    """
    Check bisimulation: same observations regardless of
    whether temporal or atemporal representation.
    """
    obs1 = coalg.observe(d1)
    obs2 = coalg.observe(d2)
    
    if obs1 != obs2:
        return False
    
    # Check continuations (up to finite depth)
    for next1, next2 in zip(coalg.unfold(d1), coalg.unfold(d2)):
        if coalg.observe(next1) != coalg.observe(next2):
            return False
    
    return True

Triangle Inequality Restoration

With this bridge skill:

d(unworld, derivational-coalgebra) ≈ 1.0
d(derivational-coalgebra, temporal-coalgebra) ≈ 1.0

Therefore:
d(unworld, temporal-coalgebra) ≤ 1.0 + 1.0 = 2.0 ✓
(Original: 2.131, now satisfies triangle inequality)

Use Cases

1. Version Control Without Time

# Git commits as derivations, not timestamps
class GitDerivational(DerivationalCoalgebra[Tree]):
    def observe(self, d: Derivation[Tree]) -> Tree:
        return d.state
    
    def unfold(self, d: Derivation[Tree]):
        # Derivation graph, not timeline
        for parent in d.parents:
            yield parent

2. Proof Assistant States

# Narya/Agda proof states as derivations
class ProofDerivational(DerivationalCoalgebra[ProofState]):
    def derive_tactic(self, state: ProofState, tactic: Tactic):
        return Derivation(
            state=apply_tactic(state, tactic),
            parent=state,
            rule=tactic.name
        )

3. DuckDB Temporal Queries via Derivation

# Bridge DuckDB temporal to derivational
def temporal_to_derivational(db: duckdb.Connection):
    """Convert temporal version table to derivation chain."""
    rows = db.execute("""
        SELECT * FROM version_history 
        ORDER BY version_id
    """).fetchall()
    
    prev = None
    for row in rows:
        d = Derivation(
            state=row['data'],
            parent=prev,
            rule=row['change_type'],
            timestamp=row['timestamp']  # preserve but not rely on
        )
        yield d
        prev = d

Neighbor Skills

  • unworld: Pure atemporal derivations
  • temporal-coalgebra: Pure temporal observations
  • duckdb-temporal-versioning: Practical temporal queries
  • proofgeneral-narya: Proof derivations
  • dialectica: Constructive derivations

Resources


End-of-Skill Interface

Commands

# Convert temporal log to derivational
python derivational_coalgebra.py --input temporal.log --output derivations.json

# Check bisimulation
python derivational_coalgebra.py --bisim d1.json d2.json

# Embed derivations into time
python derivational_coalgebra.py --embed derivations.json --dt 1.0

Autopoietic Marginalia

The interaction IS the skill improving itself.

Every use of this skill is an opportunity for worlding:

  • MEMORY (-1): Record what was learned
  • REMEMBERING (0): Connect patterns to other skills
  • WORLDING (+1): Evolve the skill based on use

Add Interaction Exemplars here as the skill is used.