diff --git a/docs/getting-started/baremetal-ubuntu.mdx b/docs/getting-started/baremetal-ubuntu.mdx
index 2753ede9..cc15a3ef 100644
--- a/docs/getting-started/baremetal-ubuntu.mdx
+++ b/docs/getting-started/baremetal-ubuntu.mdx
@@ -64,9 +64,13 @@ targets a 128 GB box and leaves only ~4 GB for the host — scale it down to
reserve more host RAM. After rebooting, confirm with `cat /proc/cmdline`.
## 3. Install hal0
diff --git a/docs/getting-started/first-model.mdx b/docs/getting-started/first-model.mdx
index 06591584..b70f4806 100644
--- a/docs/getting-started/first-model.mdx
+++ b/docs/getting-started/first-model.mdx
@@ -25,8 +25,14 @@ shows up in a few places:
- The **Models** view has an empty registry (the Inference tab reads "the
catalog is empty"), and the Downloads panel prompts you to add a model
from the catalog or via **Add by HF coords**.
-- The **Slots** view shows a **no slots configured** hint if no capability
- slots exist yet.
+- **OpenWebUI** (`:3001`) is reachable, but its model selector is empty — it
+ reads the same empty `/v1/models` list below.
+- The **Slots** view, `hal0 status`, and `hal0 slot list` show the
+ capability slots the installer scaffolded (structure only — device,
+ profile, port) with no model assigned, rather than an empty list: the
+ installer creates slot *shape*, never model picks. The one case where
+ these are truly empty is an install that skipped slot scaffolding
+ entirely with `hal0 setup --no-slots`.
- `GET /v1/models` returns an empty list, and a chat request against an
unconfigured slot has nothing to dispatch to.
@@ -51,6 +57,17 @@ hal0 model run qwen3-4b # assign to a slot, load, wait until serving
polls until the server answers, and prints a copy-paste `curl` smoke test
against the slot port. That's a working chat endpoint.
+
+
## Already have the files on disk?
Many installs start from a disk full of GGUFs, not a download. Point hal0
diff --git a/docs/getting-started/proxmox-lxc.mdx b/docs/getting-started/proxmox-lxc.mdx
index 86e2b8ee..71284d2e 100644
--- a/docs/getting-started/proxmox-lxc.mdx
+++ b/docs/getting-started/proxmox-lxc.mdx
@@ -96,9 +96,13 @@ other tenants. Scale it down to reserve more host RAM. After rebooting,
## 2. Create the container
diff --git a/docs/guides/configure.mdx b/docs/guides/configure.mdx
index 1a4ed04b..d28377e1 100644
--- a/docs/guides/configure.mdx
+++ b/docs/guides/configure.mdx
@@ -120,8 +120,8 @@ Advanced, About.
`[memory]`, and `[activity]` key that previously required `hal0 config
edit` (including `slots.evict_pressure_mb`, the pressure-eviction floor;
the `memory.engine` picker only offers `hindsight`/`pgvector` even though
- the schema also accepts `cognee`/`mem0`, since those two are silently
- remapped to hindsight), plus a dedicated **memory graph** panel for
+ the schema also accepts `mem0`, since it's silently remapped to
+ hindsight), plus a dedicated **memory graph** panel for
`[memory.graph]` (`extraction_slot`, `llm_timeout_s`) and a **Restart
hal0-api** button — a one-click restart-and-health-poll for
`hal0-api.service`, handy after any change flagged "restart required".
diff --git a/docs/guides/enable-memory.mdx b/docs/guides/enable-memory.mdx
index 0758f5b4..f29fe4df 100644
--- a/docs/guides/enable-memory.mdx
+++ b/docs/guides/enable-memory.mdx
@@ -1,6 +1,6 @@
---
title: Enable memory
-description: hal0's memory subsystem is gated by [memory].enabled in hal0.toml (on by default). Toggle it with hal0 memory enable/disable, control graph extraction with hal0 memory graph --slot, and migrate any legacy store.
+description: hal0's memory subsystem is gated by [memory].enabled in hal0.toml (on by default). Toggle it with hal0 memory enable/disable and control graph extraction with hal0 memory graph --slot.
sidebar:
order: 50
---
@@ -132,23 +132,6 @@ unaffected either way — this gate only controls the graph layer.
-## Migrate a legacy store
-
-If you previously ran the Cognee-backed memory store, preview a migration
-into Hindsight banks:
-
-```sh
-hal0 memory migrate --dry-run
-hal0 memory migrate --dry-run --cognee-dir /var/lib/hal0/memory/cognee
-```
-
-The report shows rows total / mapped / unmapped and whether it's a no-op.
-
-
-
## Destructive ops are audited
Every destructive call under `/api/memory/*` — bank delete, and the
@@ -167,3 +150,6 @@ confirmation is rejected with `memory.confirm_required`.
the memory store.
- [MCP tools](/docs/reference/mcp-tools) — the `memory_*` tool tiers and
the `/mcp/memory` server this guide's flag gates.
+- [Honcho memory](/docs/guides/honcho-memory) — `hal0 memory migrate --from
+ --to ` moves an agent's memories between Hindsight and
+ Honcho.
diff --git a/docs/reference/config-schema.mdx b/docs/reference/config-schema.mdx
index 46ed5722..22140271 100644
--- a/docs/reference/config-schema.mdx
+++ b/docs/reference/config-schema.mdx
@@ -116,14 +116,16 @@ NPU weights off the root filesystem too.
| Key | Type | Default | Notes |
|---|---|---|---|
-| `engine` | str | `"hindsight"` | Active memory engine: `hindsight` (default) \| `mem0` \| `pgvector`. `cognee` is **deprecated** — accepted for back-compat but resolves to `hindsight`. |
+| `engine` | str | `"hindsight"` | Active memory engine: `hindsight` (default) \| `mem0` \| `pgvector`. `cognee` was **retired in v1.0.0** — the schema now rejects it (the Cognee store has been dark since v0.4). |
### `[memory.embedding]` — reranker knobs (Hindsight era)
diff --git a/installer/agents/hermes/plugins/hal0-provider/profile.py b/installer/agents/hermes/plugins/hal0-provider/profile.py
index 633ba740..31402c14 100644
--- a/installer/agents/hermes/plugins/hal0-provider/profile.py
+++ b/installer/agents/hermes/plugins/hal0-provider/profile.py
@@ -8,8 +8,9 @@
purely *declarative*: it advertises the endpoint, capabilities, and a live
model inventory; it does not itself stream tokens.
* ``base_url = "http://127.0.0.1:8080/v1"`` — loopback hal0-api (never a slot
- port). No Bearer on the hal0 LAN (post-ADR-0012 identity model); identity is
- carried by ``X-hal0-Agent`` when we make our own discovery call.
+ port). No Bearer on the hal0 LAN — hal0 ships with no built-in auth on the
+ trusted local network; identity is carried by ``X-hal0-Agent`` when we make
+ our own discovery call.
* ``default_aux_model = "hal0/agent"`` — pins compression / vision /
summarization / web_extract aux calls at the local agent slot. ``hal0/agent``
is a *virtual* name hal0 resolves per-request via its LiveSlotResolver, so
diff --git a/src/hal0/agents/hermes/plugins/provider_hal0/profile.py b/src/hal0/agents/hermes/plugins/provider_hal0/profile.py
index 633ba740..31402c14 100644
--- a/src/hal0/agents/hermes/plugins/provider_hal0/profile.py
+++ b/src/hal0/agents/hermes/plugins/provider_hal0/profile.py
@@ -8,8 +8,9 @@
purely *declarative*: it advertises the endpoint, capabilities, and a live
model inventory; it does not itself stream tokens.
* ``base_url = "http://127.0.0.1:8080/v1"`` — loopback hal0-api (never a slot
- port). No Bearer on the hal0 LAN (post-ADR-0012 identity model); identity is
- carried by ``X-hal0-Agent`` when we make our own discovery call.
+ port). No Bearer on the hal0 LAN — hal0 ships with no built-in auth on the
+ trusted local network; identity is carried by ``X-hal0-Agent`` when we make
+ our own discovery call.
* ``default_aux_model = "hal0/agent"`` — pins compression / vision /
summarization / web_extract aux calls at the local agent slot. ``hal0/agent``
is a *virtual* name hal0 resolves per-request via its LiveSlotResolver, so
diff --git a/src/hal0/agents/manager.py b/src/hal0/agents/manager.py
index c1a0870b..710c0082 100644
--- a/src/hal0/agents/manager.py
+++ b/src/hal0/agents/manager.py
@@ -315,9 +315,9 @@ def install(
# Already installed — return the existing record. Idempotent.
return self._read_record(name)
- # Single-pick (ADR-0004 §2): only one bundled agent may be installed
- # at a time. ``blocking`` == ``current`` — anything already
- # installed conflicts with a fresh install.
+ # Single-pick: only one bundled agent may be installed at a time.
+ # ``blocking`` == ``current`` — anything already installed conflicts
+ # with a fresh install.
blocking = current
if not blocking:
diff --git a/src/hal0/config/schema.py b/src/hal0/config/schema.py
index 82e67ff0..00d5a3b5 100644
--- a/src/hal0/config/schema.py
+++ b/src/hal0/config/schema.py
@@ -2446,16 +2446,22 @@ class MemoryConfig(BaseModel):
"(private: / project: banks + fan-out recall)."
),
)
- # HAL0-SUNSET: v1.0.0 — 'cognee' engine value resolves to hindsight at runtime; drop the alias.
+ # HAL0-SUNSET: v1.0.0 — 'cognee' engine literal retired here. It is no
+ # longer an accepted config value (was previously a back-compat alias
+ # that resolved to hindsight at runtime). provider_from_config's runtime
+ # resolution still treats any *unrecognized* engine as Hindsight as a
+ # defense-in-depth fallback for callers that bypass this validator
+ # (e.g. duck-typed namespaces), but a hal0.toml with engine = "cognee"
+ # now fails config validation outright — the Cognee store has been dark
+ # since v0.4.
engine: str = Field(
default="hindsight",
description=(
"Active memory engine. 'hindsight' (default) is the platform "
- "engine; 'mem0' and 'pgvector' are alternates. 'cognee' is "
- "DEPRECATED — the legacy Cognee store has been dark since v0.4 and "
- "its wrapper was removed; the value is still accepted for "
- "back-compat but resolves to 'hindsight' at runtime. Use "
- "'hindsight'."
+ "engine; 'mem0' and 'pgvector' are alternates. The legacy "
+ "'cognee' value was retired in v1.0.0 (the Cognee store has been "
+ "dark since v0.4 and its wrapper was removed) — a hal0.toml "
+ "still carrying it must be updated to 'hindsight'."
),
)
agent_providers: dict[str, str] = Field(
@@ -2482,8 +2488,8 @@ class MemoryConfig(BaseModel):
@field_validator("engine")
@classmethod
def _engine_is_known(cls, v: str) -> str:
- known = {"cognee", "hindsight", "mem0", "pgvector"}
- s = str(v or "cognee").strip().lower()
+ known = {"hindsight", "mem0", "pgvector"}
+ s = str(v or "hindsight").strip().lower()
if s not in known:
raise ValueError(f"memory.engine {v!r} must be one of {sorted(known)}")
return s
diff --git a/tests/config/test_memory_engine_field.py b/tests/config/test_memory_engine_field.py
index 1d8a11a2..4e0d33c8 100644
--- a/tests/config/test_memory_engine_field.py
+++ b/tests/config/test_memory_engine_field.py
@@ -13,10 +13,18 @@ def test_engine_defaults_to_hindsight():
def test_engine_accepts_known_engines():
- for e in ("cognee", "hindsight", "mem0", "pgvector"):
+ for e in ("hindsight", "mem0", "pgvector"):
assert MemoryConfig(engine=e).engine == e
def test_engine_rejects_unknown():
with pytest.raises(ValidationError):
MemoryConfig(engine="weaviate")
+
+
+def test_engine_rejects_retired_cognee_literal():
+ # HAL0-SUNSET: v1.0.0 — 'cognee' was a back-compat alias that resolved to
+ # hindsight at runtime; it is now retired and fails validation like any
+ # other unknown engine. The Cognee store has been dark since v0.4.
+ with pytest.raises(ValidationError):
+ MemoryConfig(engine="cognee")
diff --git a/ui/src/dash/memory-map.jsx b/ui/src/dash/memory-map.jsx
index a6d1c52a..b09db051 100644
--- a/ui/src/dash/memory-map.jsx
+++ b/ui/src/dash/memory-map.jsx
@@ -121,7 +121,7 @@ export function useMemoryMapModel() {
const slots = slotsQ.data || []
// Pool total = the real ceiling for GPU model loads. On UMA (Strix Halo)
- // that is the GTT cap (amdgpu.gttsize, ~80 GiB — live as
+ // that is the GTT cap (ttm.pages_limit, ~80 GiB — live as
// stats.gpu_vram_total_mb), NOT the full unified RAM (128 GiB): models can't
// actually allocate past the GTT window, so headroom must be measured
// against it. Prefer the live GTT cap; fall back to the static unified/ram