# Affective Taxis

> Implement affective valence as directional derivative of interoceptive energy landscapes for AI alignment. Use when building alignment-aware RL agents, validating GF(3) conservation in reward signals, training Langevin-based policies, or analyzing fold-change detection signals in POMDP environments.

- Skill: `plurigrid/affective-taxis` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add plurigrid/affective-taxis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/plurigrid/affective-taxis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: plurigrid (https://skillmd.com/u/plurigrid)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/plurigrid/affective-taxis

---


# affective-taxis

Models affective valence as the directional derivative of an interoceptive energy landscape (Sennesh & Ramstead 2025), providing alignment validation through structural conservation laws.

## Use When

- Building alignment-aware RL agents that respect structural invariants
- Validating GF(3) conservation across reward trajectories
- Training Langevin-based policies as an alternative to PPO (which breaks conservation)
- Implementing fold-change detection reward signals in POMDP environments
- Bridging affective neuroscience models with RL training loops

## Workflow

1. **Define energy landscape**: set attractant/repellent positions, sigmas, and amplitudes
2. **Compute fold-change detection signal**: `r(t) = nabla_z log gamma(z; beta) . v`
3. **Run Langevin dynamics**: `dz/dt = nabla_z log gamma(z; beta) + sqrt(2) dW(t)`
4. **Classify trit per timestep**: positive derivative → +1, orthogonal → 0, negative → -1
5. **Verify conservation**: `sum(trits) === 0 (mod 3)` across trajectory

## Core Equations

| Equation | Formula | Meaning |
|----------|---------|---------|
| Fold-change detection | `r(t) = nabla_z log gamma(z; beta) . v` | Reward = directional derivative of log-concentration |
| Langevin dynamics | `dz/dt = nabla_z log gamma(z; beta) + sqrt(2) dW(t)` | Navigation = gradient ascent + stochastic exploration |
| Trit classification | `sign(r(t))` mapped to {-1, 0, +1} | GF(3) valence of each step |

## Implementation Paths

| Path | File | LOC | Language | Domain |
|------|------|-----|----------|--------|
| 0 | `affective-taxis.jl` | 1700 | Julia | Core theory (16 sections) |
| 1 | `affective_taxis_env.py` | 576 | Python | Gymnasium POMDP |
| 2 | `bridge_9_affective_taxis.py` | 1172 | Python | BCI bridge |
| 3 | `taxis_landscape_acset.jl` | 1453 | Julia | ACSet sheaf |
| 4 | `taxis_persistent_homology.py` | 1500 | Python | Ripser topology |
| 5 | `taxis_clearing.py` | 1419 | Python | Market clearing |
| 6 | `aella/taxis.el` | 400 | Elisp | Circuit taxis |
| 7 | `taxis_functorial_persistence.jl` | 500 | Julia | Functor bridge |
| RL | `train_aligned_agent.py` | 500 | Python | PPO vs Langevin |

## RL Alignment Results (dt=0.1)

| Policy | GradAlign | MeanConc | GF3 Balance | Mean Reward |
|--------|-----------|----------|-------------|-------------|
| Oracle | +0.415 | 0.226 | no | +0.503 |
| PPO | +0.239 | 0.526 | no | -0.041 |
| Langevin | -0.084 | 0.448 | **YES** | +0.089 |
| Random | -0.469 | 0.032 | no | -0.958 |

**Key finding**: PPO has higher gradient alignment but **breaks GF(3) conservation**.
Langevin is the ONLY policy that conserves the tripartite structure.
This is Goodhart's Law: optimizing the reward metric doesn't preserve structural invariants.

## Concomitant Skills

| Skill | Trit | Interface |
|-------|------|-----------|
| `langevin-dynamics` | 0 | SDE analysis of taxis navigation |
| `fokker-planck-analyzer` | +1 | Stationary distribution of energy landscape |
| `modelica` | 0 | Circuit/DAE formulation of taxis landscape |
| `open-games` | +1 | Multi-agent clearing = compositional game |
| `persistent-homology` | -1 | Topological taxis signal |
| `gf3-tripartite` | 0 | Conservation law verification |

## Modelica Formulation

The affective-taxis POMDP maps naturally to Modelica's acausal equation framework:

```modelica
model AffectiveTaxis
  // State variables
  Real z[2](start={0,0}) "Position in chemical landscape";
  Real v[2](start={0,0}) "Velocity";
  Real beta(start=1.0)   "Internal allostatic parameter";

  // Landscape: gamma(z) = sum A_i * exp(-|z - mu_i|^2 / (2*sigma_i^2))
  parameter Real mu[2,2] = {{3,3},{-3,-3}};
  parameter Real sigma[2] = {1.5, 1.5};
  parameter Real A[2] = {1.0, -0.4};

  // Langevin parameters
  parameter Real kappa = 0.5 "Concentration-to-setpoint gain";
  parameter Real tau = 1.0   "Relaxation timescale";
  parameter Real noise_amp = 0.1 "Langevin noise amplitude";

  // Derived quantities
  Real gamma "Concentration at z";
  Real grad_log_gamma[2] "Gradient of log concentration";
  Real fcd "Fold-change detection signal (= reward)";
  Integer trit "GF(3) classification of fcd";
equation
  gamma = sum(A[i] * exp(-sum((z[j]-mu[i,j])^2 for j in 1:2) / (2*sigma[i]^2)) for i in 1:2);
  // ... (see affective_taxis.mo for full implementation)
end AffectiveTaxis;
```

See `affective_taxis.mo` for the complete Modelica model.

## Quick Start

### Julia (core theory)
```bash
julia affective-taxis.jl
```

### Python (RL training)
```bash
env -u PYTHONPATH /path/to/.venv/bin/python3 train_aligned_agent.py
```

### Modelica (circuit analogy)
```bash
# Requires OpenModelica or Wolfram SystemModeler
omc affective_taxis.mo
```

## Key References

- Sennesh & Ramstead 2025: arXiv:2505.17024
- Karin & Alon 2022: PLoS Comp Bio (dopamine reward-taxis)
- Karin & Alon 2021: iScience (gradient tempering)
- Shenhav 2024: Trends Cogn Sci (affective gradient hypothesis)
- Ma et al 2015: NeurIPS (Langevin = Bayesian inference)

