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.mdsource 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:
| Temporal | Derivational |
|---|---|
| |
| |
| |
| (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
- Jacobs - Introduction to Coalgebra
- Rutten - Universal Coalgebra
- unworld skill
- temporal-coalgebra skill
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.