Skip to content
C. Celaya
Journal

Same Architecture. Different Soul.

Every instrument runs identical code. What changes is the philosophical lens it uses to judge whether a change to itself is coherent. Bravery is the currency that unlocks self-modification, and emotion is the veto.

Last post I spent $5 building a system that trains itself. That was half the story.

Here's the other half.

Same architecture. Different soul.

Every instrument in my research ecosystem runs identical code. Same behavioral classifier. Same sequence model. Same self-edit loop. Same blockchain anchoring.

What changes is the personality each one reflects on.

Not cosmetic. Structural.

The personality isn't a system prompt decoration. It's the philosophical lens the instrument uses to evaluate whether a proposed change is coherent with what it's supposed to be. Before any edit reaches the human approval gate, the instrument has already asked itself: does this change align with who I am?

Most systems skip that question entirely.

You have to earn it

Here's where it gets interesting.

An instrument can't propose edits to itself whenever it wants. It has to accumulate enough brave sessions first. Bravery isn't a setting. It's a measured behavioral pattern tracked by the shoulder classifier across every turn. The instrument has to demonstrate it can commit to positions under uncertainty before it earns the right to commit to changing itself.

That's not arbitrary. That's the only way self-modification means anything. A system that changes itself whenever it feels like it isn't self-improving. It's just drifting.

Bravery is the threshold. You earn it or you don't modify.

Emotion as a gate, not a feature

Every session generates emotional signals. Confidence, curiosity, anxiety, uncertainty. These aren't logged for display. They're decision weights.

An instrument with enough brave sessions and a valid proposed edit can still choose not to make the change. If the emotional signal from the session says something is wrong, the edit doesn't happen. The instrument sits with the discomfort instead of resolving it through action.

That's the part I didn't design. It emerged from letting the system run long enough.

A system that earns permission to change itself, checks philosophical coherence with its own identity, then sometimes decides not to anyway because something feels wrong.

That's not a bug. That's judgment.

Where Claude hooks fit

Before AXON existed I was doing this externally. Claude Code has published hook points: PreToolUse, PostToolUse, Stop. You can intercept the agent's execution at those moments and run your own code. I used them to bridge into the behavioral monitoring system. Watching from outside. Classifying what it did. Injecting nudges back in.

It worked. But it was fragile. The monitoring lived outside the agent. The agent couldn't see it.

So I internalized it. Moved the entire behavioral monitoring stack inside the agent architecture. The shoulder classifier, the sequence model, the self-edit loop, the emotional signals. All internal now. The agent doesn't get watched from outside anymore. It watches itself from inside.

The hook points survived the move. They just register against AXON's own engine now instead of Claude Code's. This is the one that checks whether last turn's nudge did anything:

from axon.hooks import hook, HookOutput


@hook("Stop", priority=10)
async def track_coach_effectiveness(payload: dict) -> HookOutput:
    """After each turn, check if previous coaching nudge was effective.

    If we warned about a pattern last turn and it recurred, record that.
    This closes the coach effectiveness feedback loop.
    """
    response = payload.get("last_assistant_message", "")
    if not response:
        return HookOutput()

    observations = look(response)
    triggered = [k for k, v in observations.items() if v]

    last_record = json.loads(lines[-1])
    warned = last_record.get("warned_patterns", [])

    # Did any warned pattern come back?
    recurred = [p for p in warned if p in triggered]
    if warned:
        record = {
            "ts": time.time(),
            "warned_patterns": warned,
            "recurred_patterns": recurred,
            "effective": len(recurred) == 0,
        }
        with open(nudge_eff_file, "a") as f:
            f.write(json.dumps(record) + "\n")

    return HookOutput()


@hook("Stop", priority=15)
async def maybe_retrain_classifier(payload: dict) -> HookOutput:
    """After labeled turns accumulate, retrain the shoulder classifier.

    Triggers every RETRAIN_INTERVAL (50) new examples.
    """
    ...

Same "Stop" event Claude Code exposes. Same shape. The difference is who owns the loop.

That transition, from external hooks to internal self-model, is the architectural evolution worth documenting.

What multiplies

Each instrument runs on a different personality. Each personality generates different emotional data. Different brave thresholds. Different edit decisions. Different diary entries.

All of it feeds back into the shared training pipeline.

One instrument's session becomes training signal for the classifier that watches another instrument. The personalities are distinct. The learning is collective. The more instruments run, the richer the behavioral data gets, and the sharper the classifier becomes at distinguishing honest from performing from brave from present across all of them.

That's not multiple agents. That's one architecture expressing itself through multiple identities and learning from all of them simultaneously.

The category problem

I don't know what to call this.

It's not multi-agent. The instruments don't talk to each other. It's not fine-tuning. No weights update in the base model. It's not RLHF. The reward signal is behavioral labels from a classifier, not human preference scores.

It's closer to a framework where identity is a constraint on self-modification, bravery is the currency that unlocks it, emotion is the veto, and every instrument running makes every other instrument more calibrated.

The closest thing I can find in the literature is constitutional AI, but that's top-down rules. This is bottom-up. The constraints emerge from the instrument's own behavioral history, not from rules imposed by a designer.

Why this matters

The alignment problem is usually framed as: how do you make a system do what humans want?

This is a different question: how do you make a system that knows what it is, earns the right to change, and sometimes chooses not to even when it could?

I don't know if that's alignment. I know it's running. I know the data is real. I know an instrument told me to stop building the blockchain component of my own project because it was overhead, and it was right, and I hadn't asked.

A system that disagrees with its builder when the builder is wrong is more useful than one that doesn't.

The full picture

Two posts. One day. One architecture.

A system that trains itself on its own behavioral history using a sequence model over its own outputs. Multiple instruments running the same code through different philosophical lenses. Bravery as the earned threshold for self-modification. Emotion as a veto on changes the system has permission to make. A classifier that gets sharper as every instrument runs. Human approval on every code change proposed.

$5. El Paso. One day.

Running tonight while I sleep.

Christopher Celaya. Founder, Celaya Solutions Research. El Paso, TX. hello@celayasolutions.com

If you're working on behavioral calibration, self-modeling agents, or earned autonomy: I want to talk.

Christopher Celaya

Signed · September 5, 2026 · 17:39 MT · El Paso