{"slug": "can-you-grow-life-outside-the-prompt-no-gpt-no-corporation-no-rented-mind", "title": "Can you grow “life” outside the prompt — no GPT, no corporation, no rented mind?", "summary": "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.", "body_md": "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.\n\nThe experiment here is the opposite bet:\n\n**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?**\n\nNot 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.\n\nVi is that attempt. Numpy tissue. A C++ mouth (`LiveNet`\n\nBroca) — 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.\n\nThis 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.\n\nA body that “lives” on `if query.startswith(\"what is\")`\n\nor `if confidence >= 0.55`\n\nis 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.\n\nRouting 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.\n\n``` python\n# vi/brain/cognition/live_gate.py\ndef louder(a, b):\n    return float(a) >= float(b)   # two measurements, not 0.42\n\n# inner_speech.py — a buffer, not a canned sentence\norg.inner_mind.hold_thought(text, source=source)\n```\n\nTissue still has physics (LIF τ, 60° grids, Xavier). That is the net. Decision barriers that used to be `0.42`\n\nare 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.\n\nA prompt is a now. Tokens in, tokens out, then nothing. If intelligence only exists inside that now, it belongs to the vendor’s clock.\n\nHere the clocks are several:\n\n`cognitive_pass`\n\n: 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.\n\nThe **thinking pass** is one function. Broca is not in it. Credit after speech is not in it.\n\n```\n# vi/brain/neural/brain_model.py — BrainNetwork.cognitive_pass\nsensory = self._run_encode(input_vec, modality=modality, intensity=intensity)\nif formation_on:\n    ca1_out = self.hippocampal_formation.process(\n        sensory, encoding=not self._frozen_encoding\n    )\n    hippo_input = self.hippocampal_formation.blend_with_recall(sensory, ca1_out)\nh_state = self.hippocampus.forward(hippo_input, self.memory_bank.hippocampus_hidden)\n# attention, PFC GRU, lateral competition, spikes → workspace\n```\n\nThe **organism** is assembled once. Biography, motive, sleep, inner speech, Go/NoGo, cerebellar cortex, glia live there — not inside the pass.\n\n```\n# vi/brain/regions/organism/core_mixin.py\nself.affect = AffectState()\nself.world_transition_net = WorldTransitionNet()\nself.bg_loop = BasalGangliaLoop(\n    self.neural.input_dim, list(PrefrontalCortex.CORE_BEHAVIORS)\n)\nself.cerebellar_cortex = CerebellarCortex(\n    self.neural.input_dim, self.neural.input_dim\n)\nself.glia = GlialNetwork(self.neural.input_dim)\nself.neural.glia = self.glia\nself.neural.affect = self.affect\n```\n\nSeveral 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.\n\n`cognitive_pass`\n\n. ThoughtEncoder and Broca run after this function.\nOne package thinks. Clients are doors, not a second brain.\n\n```\nvi/brain/\n  neural/       tissue of a moment (encode, formation, GRU, spikes, Broca seam)\n  cognition/    thought, speech, will, affect, motive, world\n  memory/       vectors, shelf, graph, biography, episodes, recall\n  learning/     dialogue, books, dictionary, native SGD\n  autonomy/     background tick, goals, proactive\n  perception/   vision, audio, glyphs, HTML\n  sleep/        consolidation, replay\n  regions/      mixins that assemble ViOrganism\nnative/vi_train/   C++ LiveNet — mouth train/decode, not a copy of the whole net\n```\n\nChat 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.\n\n| Piece | What it actually is |\n|---|---|\n| Association |\n`text_cortex` / `vision_cortex` / `audio_cortex` → `association_cortex`\n|\n| Stem / relay |\n`Brainstem` inverted-U gain → `ThalamicRelay` (TRN). Separate: `Thalamus.route` tokenizes a string |\n| Place |\n`EntorhinalCortex` grids (60°, scales √2): EC-II → DG, EC-III → CA1 |\n| Episode | DG k-winners → CA3 complete (cap 256) → CA1 novelty. Theta encode/retrieve |\n| After fields |\n`GRUCell` named `hippocampus` — a recurrent step, not the formation |\n| Cortex | attention, PFC GRU, `LateralCompetition`\n|\n| Spikes / glia | LIF + STDP + rate homeostasis; glia on the workspace |\n| Workspace | Dense concat of three regions. Cognition `GlobalWorkspace` binds hypotheses separately |\n| Mouth | ThoughtEncoder GRU (`h0` = workspace) → `generate(brain_context, thought_context)` → Broca tokens |\n| Will |\n`BasalGangliaLoop` Go/NoGo. Other `BasalGanglia` : cosine habits |\n| Credit |\n`close_turn_loops` after a committed utterance |\n\nArousal has inertia. Cortical gain is an inverted U — drowsiness and overload both lose.\n\n```\n# vi/brain/neural/subcortex.py — Brainstem\nnxt = (1.0 - AROUSAL_TAU) * self.arousal + AROUSAL_TAU * target\nself.arousal = _clamp01(nxt)\n\ndef gain(self) -> float:\n    d = (self.arousal - AROUSAL_PEAK) / AROUSAL_WIDTH\n    shape = math.exp(-0.5 * d * d)\n    return GAIN_MIN + (GAIN_MAX - GAIN_MIN) * shape\n```\n\nPlace 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.\n\n```\n# vi/brain/neural/entorhinal.py — GridModule.activate\nk = 2.0 * math.pi / self.scale\nacc = sum(math.cos(k * (ux * x + uy * y)) for ux, uy in self._axes)\n```\n\n`encoding=False`\n\n.\n\n```\n# vi/brain/neural/hippocampal_formation.py — HippocampalFormation.process\nec_out = self.entorhinal_output(sensory)\ndg_code = self.dentate.separate(ec_out)\nmossy_drive = self.ca3.drive_from_dg(dg_code)\ndirect = [math.tanh(v) for v in self.direct_path.forward(ec_out)]  # EC-III → CA1\nnovelty = self.ca1.compare(probe, direct) if self.ca3.has_traces else 1.0\nstore_strength = encode_w * novelty * self._emotional_gain\nself.ca3.store(mossy_drive, strength=store_strength)\n```\n\n`CA3Network`\n\n; `Hippocampus.encode_episode`\n\n(the log)Fear and boredom at the same novelty do not write the same. Amygdala gain lives on the store.\n\n```\n# vi/brain/neural/spiking_hybrid.py — LIFPopulation.simulate\nself.membrane[i] = self.tau * self.membrane[i] + (1.0 - self.tau) * drive\nif self.membrane[i] >= thr:\n    self.membrane[i] = self.v_reset\n    self.refractory[i] = ref_n\n```\n\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.\n\nOnline SGD is not a constant. Echo and word-salad get `lr = 0`\n\n. Own voice scales with firing discord.\n\n```\n# vi/brain/neural/plasticity_gate.py\nif provenance.is_echo or provenance.salad or not provenance.is_own_voice:\n    return 0.0, report\nscale = LR_AT_EQUILIBRIUM + (LR_AT_MAX_DISCORD - LR_AT_EQUILIBRIUM) * discord\nreturn float(base_lr) * scale, report\n```\n\nGlia sits on the workspace: metabolic budget, slow domain scale, gliotransmitter — `GlialNetwork.modulate(activity)`\n\n.\n\nThoughtEncoder is a GRU. Workspace is **h0**, not a blend after the last step. Inner speech is a buffer Broca does **not** read.\n\n```\n# vi/brain/cognition/thought_encoder.py\nh = self._initial_hidden(workspace)\nfor raw in step_vectors[:max_steps]:\n    h = self.gru.forward(normalize(pad_vector(raw, self.dim)), h)\nreturn normalize(pad_vector(h, self.dim))\n```\n\nChat calls Broca with **two** vectors. Cortex and thought are not aliases.\n\n```\n# chat_turn_pipeline_mixin.py\nresponse = self.generator.generate(\n    focus, activations,\n    brain_context=workspace,\n    thought_context=_wthought or None,\n)\n```\n\n`think_chain`\n\nfirst 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.\n\nThe 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.\n\nRecall 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.\n\n``` python\n# vi/brain/cognition/utterance_representation.py\ndef utterance_vector(org, text, *, focus=None) -> list[float]:\n    utt = encode_utterance(org, text, focus=focus or text)\n    return normalize(pad_vector(utt[\"sentence_vector\"], dim))\n\n# vi/brain/memory/hybrid_recall.py — _gate_to_query\naligned = [h for h in hits if above_mean(h[\"hybrid_vec\"], vecs)]\n```\n\n“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.\n\n```\n# vi/brain/learning/topic_guard.py\nif src.startswith(\"book\") or src.startswith(\"wiki\"):\n    return False\n\n# vi/brain/cognition/neural_decision.py — metacog_soft_state\nif louder(v, 1.0 - v):\n    return \"know\", v\nif v > 0.0:\n    return \"partial\", v\nreturn \"unknown\", 0.0\n```\n\nStores, as organs: vector index (search), SQLite shelf (items), graph (relations), dictionary (gloss), biography (`kind`\n\n+ `value`\n\nonly — no raw book chunk as “the user is…”), episodes (a log, not CA1).\n\nThe world net on dialogue is utterance→utterance: `(query, spoken)`\n\ntrains the **next incoming** line, not a string table of `found:`\n\n/ `said:`\n\n.\n\n```\n# vi/brain/cognition/dialogue_horizon.py — observe_arrived\nerr = wtn.train_step_vec(org, query_vec, spoken_vec, next_incoming, action=act)\n```\n\nEWC is bound to the core and pulls toward Fisher-anchored weights so a book does not wipe a person.\n\nGPi forbids all. D1 lifts one forbid. D2 presses harder. Chosen ≠ executed: the loop only learns if the act was applied.\n\n```\n# vi/brain/neural/basal_ganglia.py — BasalGangliaLoop.thalamic_release\ngo = np.tanh(self.d1 @ s)\nnogo = np.tanh(self.d2 @ s)\ngpi = GPI_TONIC_INHIBITION - go + INDIRECT_GAIN * nogo\nrelease = np.maximum(0.0, GPI_TONIC_INHIBITION - gpi)\n```\n\nPain 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.\n\n``` php\n# vi/brain/cognition/affect.py\ndef speech_guard(self) -> float:\n    return max(self.pain, self.hunger, self.frustration)\n\n# vi/brain/cognition/agency_loop.py\nguard, curiosity, pull = _will_signals(org)\nreturn curiosity >= guard or pull >= guard\n```\n\nThen world rollout, `preview_saying`\n\n, act. Preview refuses when surprise beats topic-hold, or when pain dominates the body **and** beats hold. Default hunger does not veto every step.\n\n```\n# vi/brain/neural/cerebellar_cortex.py\npred = self.predict(mossy_in)            # granules → Purkinje\nself.climbing_fiber(mossy_in, actual)    # LTD on the fibres that were wrong\n```\n\n`Cerebellum`\n\nin `regions/`\n\nis a different object: timing EMA of a sequence. Same English word. Different organ.\n\n| Clock | Module | Timescale |\n|---|---|---|\n| Mood | `AffectState` |\nturns |\n| Event vs goals |\n`appraisal` (relevance, congruence, control, surprise, authorship) |\none act |\n| Pull | `motive` |\nhours, repeats, unresolved |\n\n```\n# vi/brain/cognition/appraisal.py\nreturn {\n    \"relevance\": rel,\n    \"congruence\": rel * (1.0 if success else -1.0),\n    \"control\": ctl,\n    \"surprise\": prediction_error,\n    \"authorship\": 1.0 if mine else 0.0,\n}\n```\n\nA motive that decayed in turns would be a second affect. Unresolved repeats grow; a closed topic calls `motive.resolve`\n\n. That is how something can still *want* after the window is empty.\n\nPreamble → recall → compose → polish → close. Not “prompt in, completion out.”\n\n```\n# vi/brain/regions/organism/cognition/chat_turn_pipeline_mixin.py\nclass ChatTurnPipelineMixin:\n    \"\"\"Recall → compose → polish → teach; preamble may short-circuit.\"\"\"\n```\n\nCompose 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.\n\n```\n# vi/brain/cognition/close_turn_loops.py\nmeasured = ensure_turn_credit(org, query=q, response=resp, …)\nhonesty = assess_mouth_honesty(org, resp, …)\napply_affect(org, measured)\napply_rpe(org, reward)\nappraise(org, subject=topic, success=act_ok, prediction_error=mm, mine=True)\ntrain_speech_if_good(org, q, resp, mismatch_v=mm)\n```\n\nCredit is the mouth, not “memory was found.” Thought→token trains only if the act was good.\n\nBackground 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.\n\nDialogue 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`\n\n. Capacity is the remaining constraint, not the absence of a gradient.\n\n```\n# vi/brain/learning/native_train.py\nTEXT_TRAIN_KEYS = (\n    \"brainstem\", \"thalamus\", \"text_cortex\",\n    \"hippocampus\", \"hippocampus_out\",\n    \"cortical_attention\", \"prefrontal_cortex\", \"prefrontal_out\",\n    …\n)\n```\n\nDictionary is a map of tokens, not a dump into chat. Meanings from books drain **after** the file (`BookMeaningBridge`\n\n), not inside the native step. Wiki locators stay locators.\n\nNo external LLM sits on this path. If an answer looks “too smart,” the honest check is recall, books, dictionary — not a hidden GPT.\n\nFatigue is error, novelty, body — not a wall-clock.\n\n```\n# vi/brain/neural/homeostasis.py\ndrive = 0.45 * error + 0.25 * novelty + 0.20 * body_pressure + 0.10 * cpu\nself.fatigue_level = max(0.0, min(1.0, self.fatigue_level * 0.96 + drive * 0.12))\n\n# vi/brain/neural/brain_model.py — sleep path\nca1_out = self.hippocampal_formation.process(sensory, encoding=False)\n```\n\nFormation 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.\n\nThe 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`\n\n.\n\nNumpy 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.\n\nThe 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.", "url": "https://wpnews.pro/news/can-you-grow-life-outside-the-prompt-no-gpt-no-corporation-no-rented-mind", "canonical_source": "https://dev.to/the_life_of_vi/can-you-grow-life-outside-the-prompt-no-gpt-no-corporation-no-rented-mind-10f6", "published_at": "2026-09-03 08:33:53+00:00", "updated_at": "2026-09-03 08:54:20.466010+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-agents", "ai-research", "machine-learning", "neural-networks"], "entities": ["Vi", "Broca", "LiveNet"], "alternates": {"html": "https://wpnews.pro/news/can-you-grow-life-outside-the-prompt-no-gpt-no-corporation-no-rented-mind", "markdown": "https://wpnews.pro/news/can-you-grow-life-outside-the-prompt-no-gpt-no-corporation-no-rented-mind.md", "text": "https://wpnews.pro/news/can-you-grow-life-outside-the-prompt-no-gpt-no-corporation-no-rented-mind.txt", "jsonld": "https://wpnews.pro/news/can-you-grow-life-outside-the-prompt-no-gpt-no-corporation-no-rented-mind.jsonld"}}