{"id":49504322,"url":"https://github.com/balfiky/nur","last_synced_at":"2026-05-16T14:01:37.898Z","repository":{"id":353801561,"uuid":"1198483283","full_name":"balfiky/nur","owner":"balfiky","description":"A cognitive runtime that gives LLM agents persistent state, identity, and learning across turns. Memory, beliefs, drives, self-evolution, skills, and affective state — engineered scaffolding outside the model.","archived":false,"fork":false,"pushed_at":"2026-05-09T19:31:33.000Z","size":11228,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-09T20:37:50.027Z","etag":null,"topics":["agent-memory","agent-runtime","ai-agent","cognitive-architecture","cognitive-runtime","fastapi","llm","llm-agent","memory","open-source","python","stateful-agents"],"latest_commit_sha":null,"homepage":"https://github.com/balfiky/nur","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/balfiky.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-01T13:18:03.000Z","updated_at":"2026-05-09T19:31:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/balfiky/nur","commit_stats":null,"previous_names":["balfiky/nur"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/balfiky/nur","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/balfiky%2Fnur","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/balfiky%2Fnur/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/balfiky%2Fnur/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/balfiky%2Fnur/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/balfiky","download_url":"https://codeload.github.com/balfiky/nur/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/balfiky%2Fnur/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33105712,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-memory","agent-runtime","ai-agent","cognitive-architecture","cognitive-runtime","fastapi","llm","llm-agent","memory","open-source","python","stateful-agents"],"created_at":"2026-05-01T14:02:05.770Z","updated_at":"2026-05-16T14:01:37.893Z","avatar_url":"https://github.com/balfiky.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/diagrams/wordmark-dark.svg\"\u003e\n    \u003cimg src=\"docs/diagrams/wordmark-light.svg\" alt=\"Nūr\" width=\"420\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003ePersistent state, evolving identity, accumulated learning — for any LLM.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/balfiky/nur/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/balfiky/nur/ci.yml?branch=main\u0026style=for-the-badge\u0026label=CI\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-F5A65B?style=for-the-badge\" alt=\"MIT License\"\u003e\u003c/a\u003e\n  \u003ca href=\"pyproject.toml\"\u003e\u003cimg src=\"https://img.shields.io/badge/python-3.10%2B-7A4A8C?style=for-the-badge\" alt=\"Python 3.10+\"\u003e\u003c/a\u003e\n  \u003ca href=\"CHANGELOG.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/version-0.30.2-1A1428?style=for-the-badge\" alt=\"Version\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"docs/UAT.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/tests-2000%2B%20unit%20%2B%20UAT%20%2B%20evals-2A8F6E?style=for-the-badge\" alt=\"Tests\"\u003e\u003c/a\u003e\n  \u003ca href=\"docs/ARCHITECTURE.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/architecture-deterministic%20metabolism-D08A4E?style=for-the-badge\" alt=\"Architecture — belief decay, theme→belief promotion, drive-gap detection\"\u003e\u003c/a\u003e\n  \u003ca href=\"docs/OVERVIEW.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/scope-research%20prototype-7A4A8C?style=for-the-badge\" alt=\"Scope\"\u003e\u003c/a\u003e\n  \u003ca href=\"#configure-an-llm\"\u003e\u003cimg src=\"https://img.shields.io/badge/llm-ollama%20%E2%80%A2%20codex%20%E2%80%A2%20openai-1A1428?style=for-the-badge\" alt=\"LLM backends\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nMost LLM agents reset to zero every turn. **Nūr keeps the room lit.**\n\nMemory, beliefs, drives, mood, learned skills, and the long arc of a relationship live as runtime state — inspectable, persistent, decaying, testable. The LLM still writes the words. Nūr changes the state those words come from.\n\nIn the agent-memory reference class (MemGPT, Letta, mem0, LangGraph state), Nūr is the one that also tracks **identity continuity** (constitution, beliefs, drives, self-traits) and **relational continuity** (rupture, repair, open commitments) alongside conventional memory.\n\n[Quickstart](#quickstart) · [Overview](docs/OVERVIEW.md) · [Architecture](docs/ARCHITECTURE.md) · [Admin \u0026 Deploy](docs/DEPLOYMENT_AND_ADMIN.md) · [Privacy](PRIVACY.md) · [Changelog](CHANGELOG.md)\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/diagrams/hero-illustration.png\" alt=\"Nūr cognitive runtime — illustrated scene: a user at a laptop on the left exchanges messages with Nūr (a friendly stylized robot with a wordmark on its chassis) on the right. Six feature callout tags are attached to Nūr via schematic leader lines: M·01 Memory (5 layers), E·02 Emotion (6 modulators), T·03 Thought (fast + slow), S·04 Skills (learned), X·05 Tools (gated), and L·01 Learning (evolves) prominently above. Header: 'Nūr — a cognitive runtime · AN AI WITH MEMORY, EMOTION, AND SKILLS THAT GROW'. Footer: works with any LLM · runs locally · keeps state between turns.\" width=\"1100\"\u003e\n\u003c/p\u003e\n\n\u003e **Honest scope.** Nūr is an experimental runtime — not a therapist, not an AGI claim, not a consciousness claim. It is engineered scaffolding that holds *the state behind* an LLM's words across turns, sessions, and time. Memory and identity state live under `data/` — use it with consent when other people are involved. See [PRIVACY.md](PRIVACY.md) for inspection, export, and deletion.\n\n## What State Looks Like Across Turns\n\nSame runtime, two different continuity arcs:\n\n```text\n─── Relational arc (relationship memory + arc tracking) ───\nDay 1\nYou:  You completely misunderstood me.\nNūr:  You're right. I missed what mattered there.\n                                  # rupture recorded · trust drops · open loop created\n\nDay 3\nYou:  I think I was too harsh earlier.\nNūr:  I remember that moment. We don't have to ignore it.\n                                  # repair detected · loop begins to close\n\nDay 10\nYou:  This feels easier now.\nNūr:  It does. There was tension here before, and it softened.\n                                  # relationship arc persists across sessions\n\n─── Identity arc (life-history ingest + belief revision + drive drift) ───\nMon\nYou:  Learn from this paper: \u003curl\u003e\nNūr:  Recorded. Three beliefs shifted, one drive intensified.\n                                  # life-history event written · evolution trace emitted\n\nWed (no further input)\n                                  # metabolism tick: weak beliefs decayed\n                                  #                  recurring theme promoted to belief\n                                  #                  drive-gap question opened\n\nFri\nYou:  Why did you push back on that?\nNūr:  A belief I formed Monday is shaping how I read this. Want to see it?\n                                  # constitution + current beliefs surfaced for \"why\"\n```\n\nThe LLM writes language. Deterministic state — memory retrieval, belief revision, decay, safety gates — lives *outside* the model. The assistant's stance accumulates instead of resetting.\n\n## Runtime Layers\n\n| Layer | What it does | Where it lives |\n|---|---|---|\n| **Short-term memory** | Hot turn-level memory inside the running session | in-process |\n| **Long-term memory** | Distilled summaries with valence + spike flags; retrieval is valence-weighted | `data/\u003cuser\u003e/nur.db` |\n| **Relationship arc** | Rupture, repair, recurring tension, commitments, open loops; cross-session | `data/\u003cuser\u003e/nur.db` |\n| **Semantic memory** | Preferences, decisions, facts; topic-scoped retrieval | `data/\u003cuser\u003e/nur.db` |\n| **Life History** | Identity-level experience ledger; beliefs, drives, evolution events, themes | `data/shared/life_history.db` |\n| **Constitution** | Operator-set stable orientation rendered above evolving beliefs every prompt | `data/shared/life_history.db` |\n| **Self-evolution** | Wall-clock metabolism: belief decay, theme→belief promotion, drive-gap detection | `runtime/life_history.py` |\n| **Open questions** | Reflection-emitted queue (contradiction / low-confidence / drive-gap) with operator lifecycle | `data/shared/life_history.db` |\n| **Ask-user surfacing** | Drive-gated mid-conversation question with daily budget (LearningBudget) | `runtime/learning/surface.py` |\n| **Trigger-time skills** | `applies_when`-filtered skill loading by chat hint | `runtime/skills.py` |\n| **Modulators** | Six-dim affective state (arousal, valence, certainty, bonding, energy, resolution); decay over time, shift on events | `core/emotion`, session state file |\n| **Tool gates** | Read-only by default; assisted autonomy needs confirmation; shell is a separate opt-in | `core/dual_process/tool_loop.py` |\n\nEvery layer above is inspectable through `/settings#observability` and the OpenAPI surface at `/docs`.\n\n## Where Nūr Sits\n\nNūr is in the **cognitive runtime / agent memory** reference class, not the conversational-AI / companion class. The LLM still writes language; Nūr is the engineered layer that holds *what to write against*.\n\n| Reference class | What they store | Nūr also stores |\n|---|---|---|\n| Vector RAG | document chunks · embeddings | — |\n| MemGPT / Letta / mem0 | conversation summaries · facts · preferences | ✓ via long-term + semantic memory |\n| LangGraph (with persistence) | turn-graph state · scratchpad | ✓ via session state + per-turn debug trace |\n| **Nūr — the additional layers** | | |\n| Relational continuity | | rupture · repair · commitments · open loops |\n| Identity continuity | | constitution · beliefs · drives · self-traits |\n| Self-evolution | | wall-clock decay · theme→belief promotion · drive-gap detection |\n| Affective state | | six modulators with deterministic decay · valence-weighted retrieval |\n| Open-question lifecycle | | epistemic gaps surfaced for operator review |\n\nEvery layer above is inspectable, decayable, and testable. None of them require the LLM to \"feel\" anything.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eLife History and identity continuity\u003c/strong\u003e — formative experiences that bias future behavior\u003c/summary\u003e\n\nNūr has an early **Life History** layer for formative material: pasted texts, notes, essays, browser-uploaded text/Markdown files, and explicit chat requests like \"learn from this project: \u003curl\u003e\". This is not just a summarizer. It records an experience, then writes an inspectable evolution trace: belief shifts, drive changes, self-trait observations, and future behavior tendencies.\n\nThat means the project has two distinct continuity layers:\n\n- **Relational continuity** — how Nūr remembers people, tension, repair, and unfinished business.\n- **Identity continuity** — how Nūr records experiences that may change its worldview, motivations, and self-model over time.\n\nIt is observable in `/settings` → **Life History** and stored under `data/shared/life_history.db`. The settings workspace includes an evolution snapshot: first/latest experience, strongest drive drift, dominant drive pressure, and change-type mix. Runtime sessions load a compact slice of current beliefs, shifted drives, and recent evolution into generation, so formative experiences can bias Nūr's perspective without dumping raw source material into every prompt.\n\nWhen a user explicitly asks Nūr to learn from a URL, the runtime fetches readable text, preserves the source reference, writes the Life History event, and appends a short learning receipt. Ordinary search, browsing, and casual conversation do not mutate identity-level Life History.\n\n\u003c/details\u003e\n\n## Quickstart\n\nNūr is not published on PyPI yet. Install from the GitHub repository:\n\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npython3 -m pip install --upgrade pip\npython3 -m pip install \"git+https://github.com/balfiky/nur.git\"\nnur-setup\n```\n\n`nur-setup` is terminal-native by default. It prompts for model backend,\nidentity, Telegram, and tool settings, then creates `runtime_config.yaml`,\nlocal data/workspace folders, and marks setup complete. It does **not** launch a\nbrowser.\n\nStart the browser UI only when you ask for it:\n\n```bash\nnur-web --config runtime_config.yaml\n```\n\nIf you prefer the browser wizard instead of terminal prompts, run it explicitly:\n\n```bash\nnur-setup --web --config runtime_config.yaml\n```\n\nFor a LAN/public bind, run the same command with a public host:\n\n```bash\nnur-web --host 0.0.0.0 --port 8000 --config runtime_config.yaml\n```\n\nNo API token is required by default. If you later set `api_key` in `/settings`,\nthe browser settings workspace has an **API Token** button for that hardened\nmode.\n\nTo remove a local Nūr workspace:\n\n```bash\nnur-uninstall --dry-run\nnur-uninstall\npython3 -m pip uninstall project-nur\n```\n\n`nur-uninstall` removes the runtime config and local data directory after a\nconfirmation prompt. It keeps external tool workspaces and `$NUR_CONFIG_DIR`\nidentity files unless you explicitly pass the removal flags shown in\n`nur-uninstall --help`.\n\nTo keep your customized agent identity across upgrades:\n\n```bash\nexport NUR_CONFIG_DIR=~/.config/nur\nmkdir -p \"$NUR_CONFIG_DIR\"\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/balfiky/nur.git\ncd nur\npython3 -m pip install -e \".[dev]\"\nnur-web                    # web UI at :8000\nnur-setup                  # terminal setup\nnur-setup --web            # browser setup wizard\nnur-uninstall              # remove local config/data after confirmation\nnur-validate --mode full   # local release-readiness validation\nnur                        # console runtime\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhat's new\u003c/strong\u003e — recent self-evolution work (full notes in \u003ca href=\"CHANGELOG.md\"\u003eCHANGELOG.md\u003c/a\u003e)\u003c/summary\u003e\n\n- **Learning schedule** — `LearningBudget` caps and metabolism min-elapsed-days are now operator-tunable in `/settings`.\n- **Constitution layer** (`/admin/identity/constitution`) — stable operator-set orientation rendered above evolving beliefs every prompt.\n- **Open questions queue** — reflection now emits epistemic gaps (contradiction, low-confidence, drive-gap) for operator review.\n- **Self-evolution metabolism** — wall-clock decay, weak-belief revocation, theme→belief promotion, drive-gap detection.\n- **Ask-user autonomy** (Sprint 5) — Nūr can surface an open question to the user when budget and drives align.\n- **No mock backend** — every LLM call goes to a real model (Ollama, Codex CLI, hosted OpenAI-compatible).\n\n\u003c/details\u003e\n\n## Start Here\n\n| Need | Document |\n|---|---|\n| Product/concept overview | [docs/OVERVIEW.md](docs/OVERVIEW.md) |\n| Reviewer study guide | [docs/STUDY_GUIDE.md](docs/STUDY_GUIDE.md) |\n| Runtime architecture | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) |\n| Install, admin, deployment | [docs/DEPLOYMENT_AND_ADMIN.md](docs/DEPLOYMENT_AND_ADMIN.md) |\n| Security model | [SECURITY.md](SECURITY.md) |\n| Privacy and data deletion | [PRIVACY.md](PRIVACY.md) |\n| Release history | [CHANGELOG.md](CHANGELOG.md) |\n| Contributing | [CONTRIBUTING.md](CONTRIBUTING.md) |\n\n## Validation\n\nUse `nur-validate` before publishing or tagging releases. In a source checkout\nit runs repository checks; in an installed workspace it automatically switches\nto installed-package checks.\n\n```bash\nnur-validate --mode quick    # static metadata/docs/config checks\nnur-validate --mode full     # quick + pytest + wheel/package-data checks\nnur-validate --mode release  # full + tag and install-smoke checks\n```\n\nCI runs `nur-validate --mode ci` plus the full pytest suite on Python 3.10,\n3.11, and 3.12.\n\n## Configure An LLM\n\nThe setup wizard or `/settings` workspace is the preferred path.\n\n| Backend | Use case |\n|---|---|\n| `provider` | Hosted OpenAI-compatible gateways |\n| `openai_compatible` | Local/remote servers (Ollama, LM Studio, vLLM) |\n| `codex` | Local Codex CLI session using your existing Codex login |\n\nNūr always calls a real LLM. There is no mock or offline backend — configure\none of the options above before running.\n\nFor `codex`, install/login to the Codex CLI first. Nūr runs `codex exec` in\nread-only ephemeral mode. In `/settings`, choosing Codex CLI loads the installed\nCodex model catalog into the model dropdown; leave the model blank to use\nCodex's default.\n\nRuntime config is `runtime_config.yaml` in the current working directory. Identity is `config/soul.yaml`, or `$NUR_CONFIG_DIR/soul.yaml` when the override is set.\n\n## Architecture At A Glance\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/diagrams/feature-overview.png\" alt=\"Nūr feature overview — three bands. Top: Channels (Web UI, Telegram, Console, REST API). Middle: Persistent Cognitive Core (Emotions with six modulators, Memory with five layers, Identity with constitution/beliefs/drives/self-traits, Evolution with metabolism/open-questions/skills). Bottom: Capabilities (Skills, Web search, File ops, Shell) — all gated by intent and autonomy level.\" width=\"1000\"\u003e\n\u003c/p\u003e\n\nThree bands: **Channels** speak in (Web UI, Telegram, Console, REST API) → **Persistent Cognitive Core** holds state across turns (Emotions · Memory · Identity · Self-evolution) → **Capabilities** act, each gated by intent and autonomy level (Skills · Web search · File ops · Shell).\n\nA single turn runs five stages internally: deterministic pre-pass → gated deliberation (inner dialogue, tool loop, defense shaping) → master LLM generation → rule + LLM self-check → post-processing (memory writes, energy drain, debug trace). The LLM writes language; deterministic state, memory, safety gates, and retrieval happen around it.\n\nFor the full code-level component map (LLM backends, persistence files, tool executor wiring) and the per-turn cognitive flow diagram, see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).\n\n## API Quick Tour\n\n```bash\n# Health, no auth required\ncurl http://127.0.0.1:8000/v1/health\n\n# Chat, auth optional unless api_key is configured\ncurl -X POST http://127.0.0.1:8000/v1/chat \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"message\":\"hello\",\"user_id\":\"demo\",\"chat_id\":\"main\"}'\n\n# With auth enabled\ncurl -X POST http://127.0.0.1:8000/v1/chat \\\n  -H 'Authorization: Bearer YOUR_TOKEN' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"message\":\"hello\",\"user_id\":\"demo\",\"chat_id\":\"main\"}'\n```\n\nOpenAPI docs at http://127.0.0.1:8000/docs when the server is running.\n\n## Production Posture\n\nBefore exposing Nūr beyond localhost:\n\n- Set `api_key` so admin and chat endpoints require bearer auth\n- Keep `tools_enabled: false` and `shell_tool_enabled: false` unless explicitly needed\n- Use first-class read-only tools for routine host facts; shell is a separate local-command surface\n- Set Telegram allowlists before enabling a bot\n- Treat `data/`, `runtime_config.yaml`, and backups as sensitive\n- Read [docs/DEPLOYMENT_AND_ADMIN.md](docs/DEPLOYMENT_AND_ADMIN.md), [SECURITY.md](SECURITY.md), and [PRIVACY.md](PRIVACY.md)\n\n## Common Commands\n\n```bash\nmake test                                        # 1953 unit/integration tests, ~3 min\nmake uat                                         # 67 UAT tests against a live LLM, ~14 min\nmake uat-comprehensive                           # one PASS/FAIL aggregator over the full UAT suite\npython3 -m pytest tests/test_interface.py -q     # focused interface tests\npython3 -m evals --backend openai_compatible --tag phase11  # behavioral eval pack\npython3 -m build --sdist --wheel                 # build wheel and sdist\n```\n\n`make uat` defaults to the Codex CLI backend. Override with\n`NUR_UAT_BACKEND=openai_compatible NUR_UAT_BASE_URL=... NUR_UAT_MODEL=... make uat`.\nFor backend selection, headed mode, artifact paths, and the comprehensive\naggregator pattern, see [docs/UAT.md](docs/UAT.md).\n\n## Repository Layout\n\n```text\nconfig/     YAML config and prompt templates\ncore/       Cognitive state, appraisal, memory, profiles, dual process\nruntime/    Runtime config, channels, session lifecycle, tool factory\ninterface/  FastAPI app, /v1 API, client, bundled web UI\nevals/      Behavioral scenario and ablation harness\ntests/      Unit, integration, regression, runtime, and API tests\ndocs/       Public docs, design docs, diagrams, research notes\n```\n\n## Current Status\n\nVersion `0.30.2`. Reproducible eval evidence is intentionally narrow: relationship memory remains load-bearing under Phase 11, Life History now has bounded structural influence through LifeInfluence under Phase 13, and semantic memory has a dedicated structural scenario suite. The web and Telegram surfaces expose this state through presentation-only introspection. A 67-test UAT suite covers chat flows, admin surfaces, browser interactions, file uploads, tool calling, skill acquisition, and the self-evolution mechanics; it is **live-LLM by design** and is **not run on every push** — CI runs the unit/integration suite plus a mock-backed UAT collection-and-smoke gate. To exercise the full live UAT suite locally, run `make uat-comprehensive` against a real backend (see [docs/UAT.md](docs/UAT.md)). These are structural/inspectable results, not proof of human-likeness, therapeutic value, consciousness, or psychological validity.\n\n### Known Gaps\n\n- `character_independence` is a runtime config flag with no enforcement code yet — wizard toggles persist correctly but do not freeze identity edits.\n- No skill-from-URL download. Skills are imported via paste, file path, or zip upload only.\n- No automatic conversation→life-history ingestion. Drives and beliefs only shift from operator-curated `/admin/life/experiences/*` ingest, not from chat content.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbalfiky%2Fnur","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbalfiky%2Fnur","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbalfiky%2Fnur/lists"}