cd /news/artificial-intelligence/can-you-grow-life-outside-the-prompt… · home topics artificial-intelligence article
[ARTICLE · art-120017] src=dev.to ↗ pub= topic=artificial-intelligence verified=true sentiment=· neutral

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

A developer detailed the architecture of Vi, an autonomous AI agent that operates without rented large language models, using self-owned neural tissue, persistent memory, and internal decision-making processes. The project aims to create a 'life' that persists beyond individual requests, with components like hippocampal replay, inner speech, and a C++ speech module named Broca.

read11 min views1 publishedSep 3, 2026

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.

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.

def louder(a, b):
    return float(a) >= float(b)   # two measurements, not 0.42

org.inner_mind.hold_thought(text, source=source)

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.

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:

cognitive_pass

: sense in, workspace vector out.If those clocks only decorate a GPT call, the experiment failed. If they feed each other, the body outlives the request.

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

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)

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

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

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

. ThoughtEncoder and Broca run after this function. 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

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.

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.

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

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.

k = 2.0 * math.pi / self.scale
acc = sum(math.cos(k * (ux * x + uy * y)) for ux, uy in self._axes)

encoding=False

.

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)

CA3Network

; Hippocampus.encode_episode

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

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

τ 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.

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

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

.

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

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))

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

response = self.generator.generate(
    focus, activations,
    brain_context=workspace,
    thought_context=_wthought or None,
)

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.

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.

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))

aligned = [h for h in hits if above_mean(h["hybrid_vec"], vecs)]

“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.

if src.startswith("book") or src.startswith("wiki"):
    return False

if louder(v, 1.0 - v):
    return "know", v
if v > 0.0:
    return "partial", v
return "unknown", 0.0

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:

.

err = wtn.train_step_vec(org, query_vec, spoken_vec, next_incoming, action=act)

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

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

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)

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.

def speech_guard(self) -> float:
    return max(self.pain, self.hunger, self.frustration)

guard, curiosity, pull = _will_signals(org)
return curiosity >= guard or pull >= guard

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.

pred = self.predict(mossy_in)            # granules → Purkinje
self.climbing_fiber(mossy_in, actual)    # LTD on the fibres that were wrong

Cerebellum

in regions/

is a different object: timing EMA of a sequence. Same English word. Different organ.

Clock Module Timescale
Mood AffectState
turns
Event vs goals
appraisal (relevance, congruence, control, surprise, authorship)
one act
Pull motive
hours, repeats, unresolved
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,
}

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.

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

class ChatTurnPipelineMixin:
    """Recall → compose → polish → teach; preamble may short-circuit."""

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.

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)

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.

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.

TEXT_TRAIN_KEYS = (
    "brainstem", "thalamus", "text_cortex",
    "hippocampus", "hippocampus_out",
    "cortical_attention", "prefrontal_cortex", "prefrontal_out",
    …
)

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.

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

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))

ca1_out = self.hippocampal_formation.process(sensory, encoding=False)

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 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.

── more in #artificial-intelligence 4 stories · sorted by recency
── more on @vi 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/can-you-grow-life-ou…] indexed:0 read:11min 2026-09-03 ·