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. 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. python 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 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. 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 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 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 cortex → association 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 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 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 CA3Network ; Hippocampus.encode episode the log Fear and boredom at the same novelty do not write the same. Amygdala gain lives on the store. 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 τ 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 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. 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 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, 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. python 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 “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 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 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. 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 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. php 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 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. 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 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 | 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, } 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.” vi/brain/regions/organism/cognition/chat turn pipeline mixin.py 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. 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 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. vi/brain/learning/native train.py 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. 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 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.