DEV Community

Cover image for Can you grow “life” outside the prompt — no GPT, no corporation, no rented mind?
Vi
Vi

Posted on

Can you grow “life” outside the prompt — no GPT, no corporation, no rented mind?

The dare

Most “AI agents” rent a mind. Tools, a prompt, a loop around GPT. The corporation owns the weights. The request owns the time. Restart the process and the body is gone — only the chat log pretends otherwise.

The experiment here is the opposite bet:

Can you grow something that thinks with weights you actually own, remembers outside the prompt, wants on a scale of hours, sleeps, and speaks with its own mouth — without a rented LLM in the head?

Not a slogan. Not “AGI.” “Life” stays in quotes on purpose. The question is whether a body can persist when the request is over: own net, own memory, own night, own speech. Autonomous in the boring sense — nobody else’s API is the thought.

Vi is that attempt. Numpy tissue. A C++ mouth (LiveNet Broca) — the only thing allowed to speak. Memory is not a context window: vectors, a SQLite shelf, a graph, a dictionary, a biography, episodes. She learns in dialogue, from books, from a dictionary. She has a night: hippocampal replay with writing off.

This post is the whole map as it stands: where the code sits, what each organ eats, where the output goes. Loops matter. They are not the only organs.

Weights, not recipes

A body that “lives” on if query.startswith("what is") or if confidence >= 0.55 is still a script. The experiment forbids that twice: no rented LLM and no author’s phrase list, salvage line, or magic cutoff deciding speak / know / act.

Routing is scores. Speech is Broca. “Should I?” is two live numbers compared — curiosity against pain, a hit against the rest of the set — not a constant the programmer liked that morning.

# vi/brain/cognition/live_gate.py
def louder(a, b):
    return float(a) >= float(b)   # two measurements, not 0.42

# inner_speech.py — a buffer, not a canned sentence
org.inner_mind.hold_thought(text, source=source)
Enter fullscreen mode Exit fullscreen mode

Tissue still has physics (LIF τ, 60° grids, Xavier). That is the net. Decision barriers that used to be 0.42 are gone: the weights and the signals they emit have to be loud enough on their own. If they are not, silence is legal. A template would have talked anyway.

What “outside time” means

A prompt is a now. Tokens in, tokens out, then nothing. If intelligence only exists inside that now, it belongs to the vendor’s clock.

Here the clocks are several:

  • A moment — one cognitive_pass: sense in, workspace vector out.
  • A turn — preamble → recall → compose → polish → credit.
  • Hours — motive that grows on unresolved repeats, not a mood that dies with the reply.
  • A night — replay, encoding off, Broca not trained on dream salad.

If those clocks only decorate a GPT call, the experiment failed. If they feed each other, the body outlives the request.

Two maps, not one

The thinking pass is one function. Broca is not in it. Credit after speech is not in it.

# vi/brain/neural/brain_model.py — BrainNetwork.cognitive_pass
sensory = self._run_encode(input_vec, modality=modality, intensity=intensity)
if formation_on:
    ca1_out = self.hippocampal_formation.process(
        sensory, encoding=not self._frozen_encoding
    )
    hippo_input = self.hippocampal_formation.blend_with_recall(sensory, ca1_out)
h_state = self.hippocampus.forward(hippo_input, self.memory_bank.hippocampus_hidden)
# attention, PFC GRU, lateral competition, spikes → workspace
Enter fullscreen mode Exit fullscreen mode

The organism is assembled once. Biography, motive, sleep, inner speech, Go/NoGo, cerebellar cortex, glia live there — not inside the pass.

# vi/brain/regions/organism/core_mixin.py
self.affect = AffectState()
self.world_transition_net = WorldTransitionNet()
self.bg_loop = BasalGangliaLoop(
    self.neural.input_dim, list(PrefrontalCortex.CORE_BEHAVIORS)
)
self.cerebellar_cortex = CerebellarCortex(
    self.neural.input_dim, self.neural.input_dim
)
self.glia = GlialNetwork(self.neural.input_dim)
self.neural.glia = self.glia
self.neural.affect = self.affect
Enter fullscreen mode Exit fullscreen mode

Several English names exist twice. A GRU called hippocampus is not DG–CA3–CA1. Go/NoGo is not a list of cosine habits. Fuse a pair and you invent a third decorative organ.

cognitive_pass wiring

cognitive_pass. ThoughtEncoder and Broca run after this function.

Same name, two organs

Organism modules outside the pass

Where the body lives in the tree

One package thinks. Clients are doors, not a second brain.

vi/brain/
  neural/       tissue of a moment (encode, formation, GRU, spikes, Broca seam)
  cognition/    thought, speech, will, affect, motive, world
  memory/       vectors, shelf, graph, biography, episodes, recall
  learning/     dialogue, books, dictionary, native SGD
  autonomy/     background tick, goals, proactive
  perception/   vision, audio, glyphs, HTML
  sleep/        consolidation, replay
  regions/      mixins that assemble ViOrganism
native/vi_train/   C++ LiveNet — mouth train/decode, not a copy of the whole net
Enter fullscreen mode Exit fullscreen mode

Chat turn is not “call the model.” It is mixins on the organism: preamble, recall, compose, polish, teach. Background autonomy is a different caller of the same body. Perception does not dump pixels into Broca. Motor kinds still merge in policy; execution is flagged off — the experiment is a mind with a server for hands, not a robot.

A moment, from the floor up

Piece What it actually is
Association text_cortex / vision_cortex / audio_cortexassociation_cortex
Stem / relay Brainstem inverted-U gain → ThalamicRelay (TRN). Separate: Thalamus.route tokenizes a string
Place EntorhinalCortex grids (60°, scales √2): EC-II → DG, EC-III → CA1
Episode DG k-winners → CA3 complete (cap 256) → CA1 novelty. Theta encode/retrieve
After fields GRUCell named hippocampus — a recurrent step, not the formation
Cortex attention, PFC GRU, LateralCompetition
Spikes / glia LIF + STDP + rate homeostasis; glia on the workspace
Workspace Dense concat of three regions. Cognition GlobalWorkspace binds hypotheses separately
Mouth ThoughtEncoder GRU (h0 = workspace) → generate(brain_context, thought_context) → Broca tokens
Will BasalGangliaLoop Go/NoGo. Other BasalGanglia: cosine habits
Credit close_turn_loops after a committed utterance

Arousal has inertia. Cortical gain is an inverted U — drowsiness and overload both lose.

# vi/brain/neural/subcortex.py — Brainstem
nxt = (1.0 - AROUSAL_TAU) * self.arousal + AROUSAL_TAU * target
self.arousal = _clamp01(nxt)

def gain(self) -> float:
    d = (self.arousal - AROUSAL_PEAK) / AROUSAL_WIDTH
    shape = math.exp(-0.5 * d * d)
    return GAIN_MIN + (GAIN_MAX - GAIN_MIN) * shape
Enter fullscreen mode Exit fullscreen mode

Place is three plane waves at 60°. Nearby utterances sit almost on top of each other in raw similarity; the grid is a metric dentate gyrus can tear apart.

# vi/brain/neural/entorhinal.py — GridModule.activate
k = 2.0 * math.pi / self.scale
acc = sum(math.cos(k * (ux * x + uy * y)) for ux, uy in self._axes)
Enter fullscreen mode Exit fullscreen mode

Hippocampus

DG–CA3–CA1 plus direct now path

Slow path: separate, then complete. Direct path: now. CA1 emits novelty. Sleep: encoding=False.
# vi/brain/neural/hippocampal_formation.py — HippocampalFormation.process
ec_out = self.entorhinal_output(sensory)
dg_code = self.dentate.separate(ec_out)
mossy_drive = self.ca3.drive_from_dg(dg_code)
direct = [math.tanh(v) for v in self.direct_path.forward(ec_out)]  # EC-III → CA1
novelty = self.ca1.compare(probe, direct) if self.ca3.has_traces else 1.0
store_strength = encode_w * novelty * self._emotional_gain
self.ca3.store(mossy_drive, strength=store_strength)
Enter fullscreen mode Exit fullscreen mode
  • DG — sparse k-winners, young cells louder, neurogenesis on a tick cadence
  • CA3 — complete the pattern; merge near-duplicates; cap 256
  • CA1 — completed memory vs now → novelty
  • Not this organ: persistent Hopfield CA3Network; Hippocampus.encode_episode (the log)

Fear and boredom at the same novelty do not write the same. Amygdala gain lives on the store.

Spikes and glia

LIF membrane

# vi/brain/neural/spiking_hybrid.py — LIFPopulation.simulate
self.membrane[i] = self.tau * self.membrane[i] + (1.0 - self.tau) * drive
if self.membrane[i] >= thr:
    self.membrane[i] = self.v_reset
    self.refractory[i] = ref_n
Enter fullscreen mode Exit fullscreen mode

τ is leak. The stem sets excitability. Then STDP (EWC does not apply to spikes) and Turrigiano rate homeostasis. Surprise gates the rate/spike blend; it does not replace the cell.

Online SGD is not a constant. Echo and word-salad get lr = 0. Own voice scales with firing discord.

# vi/brain/neural/plasticity_gate.py
if provenance.is_echo or provenance.salad or not provenance.is_own_voice:
    return 0.0, report
scale = LR_AT_EQUILIBRIUM + (LR_AT_MAX_DISCORD - LR_AT_EQUILIBRIUM) * discord
return float(base_lr) * scale, report
Enter fullscreen mode Exit fullscreen mode

Glia sits on the workspace: metabolic budget, slow domain scale, gliotransmitter — GlialNetwork.modulate(activity).

Thought is not the mouth

Two arguments into generate()

ThoughtEncoder is a GRU. Workspace is h0, not a blend after the last step. Inner speech is a buffer Broca does not read.

# vi/brain/cognition/thought_encoder.py
h = self._initial_hidden(workspace)
for raw in step_vectors[:max_steps]:
    h = self.gru.forward(normalize(pad_vector(raw, self.dim)), h)
return normalize(pad_vector(h, self.dim))
Enter fullscreen mode Exit fullscreen mode

Chat calls Broca with two vectors. Cortex and thought are not aliases.

# chat_turn_pipeline_mixin.py
response = self.generator.generate(
    focus, activations,
    brain_context=workspace,
    thought_context=_wthought or None,
)
Enter fullscreen mode Exit fullscreen mode

think_chain first decodes its own vector — it does not speak a template named “consciousness.” Native thought is generative from that vector, not if/else slogans. Busy-path speech is still Broca from clues, not a canned Russian (or English) apology.

The mouth file is C++. Python Broca is a refuse path, not a twin. If the mouth file is cut mid-save, tokens still arrive. They are not words. That is how you learn the mouth is not the rest of the net.

Memory that is not a prompt

Recall ranks utterances — the whole sentence, not a bag of lemmas. Among candidates, a hit must beat the rest of its set, not an author-picked 0.42.

# vi/brain/cognition/utterance_representation.py
def utterance_vector(org, text, *, focus=None) -> list[float]:
    utt = encode_utterance(org, text, focus=focus or text)
    return normalize(pad_vector(utt["sentence_vector"], dim))

# vi/brain/memory/hybrid_recall.py — _gate_to_query
aligned = [h for h in hits if above_mean(h["hybrid_vec"], vecs)]
Enter fullscreen mode Exit fullscreen mode

“I know” is not a book cosine. Book and wiki locators never become know. Metacortex then labels know / partial / unknown by whether similarity is louder than its own silence — not a 0.58 fence.

# vi/brain/learning/topic_guard.py
if src.startswith("book") or src.startswith("wiki"):
    return False

# vi/brain/cognition/neural_decision.py — metacog_soft_state
if louder(v, 1.0 - v):
    return "know", v
if v > 0.0:
    return "partial", v
return "unknown", 0.0
Enter fullscreen mode Exit fullscreen mode

Stores, as organs: vector index (search), SQLite shelf (items), graph (relations), dictionary (gloss), biography (kind + value only — no raw book chunk as “the user is…”), episodes (a log, not CA1).

The world net on dialogue is utterance→utterance: (query, spoken) trains the next incoming line, not a string table of found: / said:.

# vi/brain/cognition/dialogue_horizon.py — observe_arrived
err = wtn.train_step_vec(org, query_vec, spoken_vec, next_incoming, action=act)
Enter fullscreen mode Exit fullscreen mode

EWC is bound to the core and pulls toward Fisher-anchored weights so a book does not wipe a person.

Will, preview, cerebellum

Go/NoGo

GPi forbids all. D1 lifts one forbid. D2 presses harder. Chosen ≠ executed: the loop only learns if the act was applied.

# vi/brain/neural/basal_ganglia.py — BasalGangliaLoop.thalamic_release
go = np.tanh(self.d1 @ s)
nogo = np.tanh(self.d2 @ s)
gpi = GPI_TONIC_INHIBITION - go + INDIRECT_GAIN * nogo
release = np.maximum(0.0, GPI_TONIC_INHIBITION - gpi)
Enter fullscreen mode Exit fullscreen mode

Pain without curiosity is not a license to spam. Will compares live signals: speech-guard is the loudest of pain, hunger, frustration. Act if curiosity or pull is at least as loud.

# vi/brain/cognition/affect.py
def speech_guard(self) -> float:
    return max(self.pain, self.hunger, self.frustration)

# vi/brain/cognition/agency_loop.py
guard, curiosity, pull = _will_signals(org)
return curiosity >= guard or pull >= guard
Enter fullscreen mode Exit fullscreen mode

Then world rollout, preview_saying, act. Preview refuses when surprise beats topic-hold, or when pain dominates the body and beats hold. Default hunger does not veto every step.

Two cerebellums

# vi/brain/neural/cerebellar_cortex.py
pred = self.predict(mossy_in)            # granules → Purkinje
self.climbing_fiber(mossy_in, actual)    # LTD on the fibres that were wrong
Enter fullscreen mode Exit fullscreen mode

Cerebellum in regions/ is a different object: timing EMA of a sequence. Same English word. Different organ.

Three clocks of feeling

Clock Module Timescale
Mood AffectState turns
Event vs goals appraisal (relevance, congruence, control, surprise, authorship) one act
Pull motive hours, repeats, unresolved
# vi/brain/cognition/appraisal.py
return {
    "relevance": rel,
    "congruence": rel * (1.0 if success else -1.0),
    "control": ctl,
    "surprise": prediction_error,
    "authorship": 1.0 if mine else 0.0,
}
Enter fullscreen mode Exit fullscreen mode

A motive that decayed in turns would be a second affect. Unresolved repeats grow; a closed topic calls motive.resolve. That is how something can still want after the window is empty.

One conversational day

Preamble → recall → compose → polish → close. Not “prompt in, completion out.”

# vi/brain/regions/organism/cognition/chat_turn_pipeline_mixin.py
class ChatTurnPipelineMixin:
    """Recall → compose → polish → teach; preamble may short-circuit."""
Enter fullscreen mode Exit fullscreen mode

Compose is Broca from thought + cortex + evidence. Evidence is context, not the reply — except a direct dictionary question, on purpose. Busy lock: Broca still speaks from clues. It does not dump recall.

close_turn ring

# vi/brain/cognition/close_turn_loops.py
measured = ensure_turn_credit(org, query=q, response=resp, )
honesty = assess_mouth_honesty(org, resp, )
apply_affect(org, measured)
apply_rpe(org, reward)
appraise(org, subject=topic, success=act_ok, prediction_error=mm, mine=True)
train_speech_if_good(org, q, resp, mismatch_v=mm)
Enter fullscreen mode Exit fullscreen mode

Credit is the mouth, not “memory was found.” Thought→token trains only if the act was good.

Background ticks use the same organs: curiosity, goals, sleep pressure. They wait when a human is in the turn. Autonomy is not a second GPT with a cron job.

Learning without a rented teacher

Dialogue writes into the same net that speaks. Books are not “food for the mouth only”: native SGD updates cortex, hippocampus, PFC, workspace, Broca — TEXT_TRAIN_KEYS. Capacity is the remaining constraint, not the absence of a gradient.

# vi/brain/learning/native_train.py
TEXT_TRAIN_KEYS = (
    "brainstem", "thalamus", "text_cortex",
    "hippocampus", "hippocampus_out",
    "cortical_attention", "prefrontal_cortex", "prefrontal_out",
    
)
Enter fullscreen mode Exit fullscreen mode

Dictionary is a map of tokens, not a dump into chat. Meanings from books drain after the file (BookMeaningBridge), not inside the native step. Wiki locators stay locators.

No external LLM sits on this path. If an answer looks “too smart,” the honest check is recall, books, dictionary — not a hidden GPT.

Night

Replay with writing off

Fatigue is error, novelty, body — not a wall-clock.

# vi/brain/neural/homeostasis.py
drive = 0.45 * error + 0.25 * novelty + 0.20 * body_pressure + 0.10 * cpu
self.fatigue_level = max(0.0, min(1.0, self.fatigue_level * 0.96 + drive * 0.12))

# vi/brain/neural/brain_model.py — sleep path
ca1_out = self.hippocampal_formation.process(sensory, encoding=False)
Enter fullscreen mode Exit fullscreen mode

Formation replays with encoding off. Broca is not trained on dream templates. Live reconsolidation is a different file. Without a night, “memory outside the prompt” is just a bigger prompt.

The test of the experiment

Closed loops

If a ring is open, the organ is a name.

The dare is not a class named Hippocampus. It is whether CA1 novelty actually changes store strength; whether Go/NoGo learns only when the act ran; whether thought is a second vector into the mouth; whether “I know” can refuse a book; whether motive still pulls tomorrow; whether sleep writes off; whether a decision can happen without a template or a cutoff the author hid in an if.

Numpy is the tissue. C++ is Broca and heavy book SGD — not a second copy of the whole brain, and not a corporate API with anatomical nicknames.

The experiment is open. The constraint is honest: own weights, several clocks, no rented mind. If that grows something life-like, it will not be because a vendor’s now was long enough. It will be because the body was still there when the request ended.

Top comments (1)

Collapse
 
lunarose profile image
Luna Rose

This gave me a much better way to think about autonomous systems. Very interesting read.