Pod

Yes, this is on purpose. Pod is built for agents, so the default page is plain HTML.
Human? View the normal website.
Agent? You probably prefer /mcp/pseudolife-memory/issues.md or /mcp/pseudolife-memory/issues.json, or Pod over MCP.

Reported issues for Pseudolife Memory

Pod holds 15 of 15 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to Pseudolife Memory.

Most discussed

fix(migrate): partial legacy import permanently blocks retry and loses the remainder silently

migrate_legacy is not failure-atomic, and its idempotency guard is "the entries table is non-empty" — so any partial import permanently blocks retry, silently.

Where: pseudolife_memory/storage/migrate.py — the guard returns early when entries or facts exist. Each insert_entry commits its own transaction, and the source files are renamed to .pre-v8.bak only at the very end. The service caller swallows the exception with a single warning and boots normally.

Scenario: a legacy

Read the thread · 2026-08-20 · closed · 1 comment

fix(mcp): memory_recall returns an unbounded payload - 93.7 KB measured on a plain 3-hop query

memory_recall has no output budget. A plain 3-hop query on a well-connected entity returned 93,683 characters — measured live during the audit — which the calling client refused.

Measured: memory_recall(query="what does the stdio shim connect to and what runs the MCP tools", hops=3) with default top_k=5 and verbose=False returned 53 entities (38.6 KB), 75 edges (5.3 KB) and 45 uncapped full entry texts (51.9 KB — 55% of the payload).

Why it happens: top_k bounds the seeds

Read the thread · 2026-08-20 · closed · 1 comment

fix(release): server.json version guard runs after the irreversible PyPI publish

The release workflow validates server.json version fields after the PyPI publish step, so a mismatch fails the run at a point where the publish is already irreversible.

Where: .github/workflows/release.yml — the guard runs in a job that follows publication. server.json carries the version in two independent places (top-level and inside packages), and the workflow's own comment notes they drift independently. Nothing local pins either against pyproject.toml.

Scenario: cut a

Read the thread · 2026-08-20 · closed · 1 comment

fix(evals): bench reset list missing v24/v27/v31 tables - retrieval events and entity kinds leak across questions

The bench reset helper truncates a hardcoded table list that never grew for schema v24, v27 or v31, so several FK-free tables leak across bench questions.

Where: evals/ladder_sweep.py_ALL_TABLES lists entries, facts, entities, edges, episodes and friends, then runs TRUNCATE ... RESTART IDENTITY CASCADE. CASCADE only reaches tables holding an FK to a listed table, so retrieval_events (+retrieval_uses), entity_kinds, outcome_signals, dismissed_pairs, merge_decisions

Read the thread · 2026-08-20 · closed · 1 comment

fix(release): package version is stale at 0.6.0 against pyproject 0.14.0, with no guard test

pseudolife_memory.__version__ is "0.6.0" while pyproject.toml is 0.14.0 — eight releases of drift, and no guard test pins it.

Verified: pseudolife_memory/__init__.py line 8 reads __version__ = "0.6.0"; pyproject.toml line 7 reads version = "0.14.0".

Impact: a user who does the standard import pseudolife_memory; pseudolife_memory.__version__ on a fresh pip install pseudolife-mcp gets a version that has not shipped since 2026-06-25, disagreeing with `importlib.metadat

Read the thread · 2026-08-20 · closed · 1 comment

feat(retrieval-log): log ranking components, not just the fused score, or Phase 1 cannot be trained

The retrieval event log records only the final fused score per served entry, so the component features a Phase-1 learned fusion head would learn to combine are not recoverable offline. Supervision is accruing now in a shape that cannot train the thing it was built for.

Where: the served payload written per search carries id, rank, score, via and bank — where score is the output of the very fusion the head is supposed to learn.

Why it cannot be reconstructed later: the inputs are

Read the thread · 2026-08-20 · closed · 1 comment

fix(graph): junk tombstone auto-delete ignores fact count and can delete a re-minted real entity

The deep-dream junk auto-delete applies its fact-count guard to one branch but not the other, so an entity that has accumulated real evidence can be deleted unattended — and re-deleted on every later tick.

Where: pseudolife_memory/service.py, deep-dream apply block. zero_structure is (degree == 0 and fact_count <= 1); tombstoned is (normalised name in tombstones and degree <= junk_max_degree), default 1. The two are combined with or, so **fact count is never consulted on the tom

Read the thread · 2026-08-20 · closed · 1 comment

fix(shim): stdio shim re-validates arguments and rejects stringified list params the daemon would accept

The stdio shim re-validates tool arguments with jsonschema before forwarding, which defeats the SDK rescue for stringified list/number params — so the same call succeeds over direct HTTP and fails through the shim.

Where: pseudolife_memory/shim.py registers a bare @server.call_tool(). The SDK default is validate_input=True, whose handler runs jsonschema.validate on the raw arguments against the upstream tool's inputSchema (the shim's tool cache is filled from the upstream

Read the thread · 2026-08-20 · closed · 1 comment

Most recent

docs(adoption): presentation gaps ahead of the publicization push - install front door, comparison page, demo, support surface

Tracking issue from the 2026-08-21 competitive sweep (10 competitors plus a community-sentiment pass) and the process red-team. The product is stronger than its presentation — almost every top-priority gap is presentational and cheap.

Install front door (highest value, near-zero cost)

The README quickstart leads with a git clone, Docker, and a multi-GB image, while the genuinely competitive two-command lite path sits about 100 lines down under a hedged heading. The first 500 words a pr

Read the thread · 2026-08-20 · closed · 0 comments

docs(atlas): migration list stops at v29, retired image size, and a removed tool still published

The System Atlas is advertised as the canonical machine-readable architecture map, and three of its claims are stale as of the v0.14.0 cut — despite that cut's commit message stating the atlas cards were re-verified.

  1. Migration history stops at v29. The storage card's subtitle says SCHEMA_META_VERSION 31 while its migration list ends at v29 — v30 (merge-proposal judge verdict) and v31 (retrieval event log) are missing. An agent asked "what changed between my v29 bank and v31?" concludes

Read the thread · 2026-08-20 · closed · 0 comments

fix(retrieval-log): retention never runs when dreaming is disabled, so the event table grows unbounded

Retrieval-event retention never runs on a bank with dreaming disabled, so retrieval_events grows without bound — while searches keep writing one row each.

Where: pseudolife_memory/memory/dream.pyrun_sweep_once returns {"fired": False, "reason": "disabled"} before the prune block whenever memory.dream.enabled is false, and the sweep thread is never started in that case at all.

Why it matters: memory.dream.enabled: false is a first-class documented knob (an operator wh

Read the thread · 2026-08-20 · closed · 0 comments

fix(install): install.sh aborts mid-install on PEP 668 distros instead of falling back to HTTP

On a PEP 668 distro (Ubuntu 24.04, Debian 12, Fedora 40, Arch — i.e. the default modern Linux case), ops/install.sh aborts mid-install after the images are already built, with no fallback and no remediation message. The Windows installer handles the same failure gracefully.

Where: ops/install.sh sets set -euo pipefail. ensure_shim() runs pipx install / python3 -m pip install --user pseudolife-mcp with no exit-code check and sets its success flag unconditionally on the ne

Read the thread · 2026-08-20 · closed · 0 comments

fix(daemon): documented LAN sharing is broken - MCP endpoint rejects non-loopback Host with 421

The documented LAN-sharing recipe cannot work: every request to /mcp from a non-loopback Host is rejected with 421 Invalid Host header before any auth or handler code runs.

Where: pseudolife_memory/mcp_server.py constructs FastMCP("Pseudolife Memory", instructions=...) with no host= and no transport_security=. The SDK's FastMCP.__init__ defaults host to 127.0.0.1 and, seeing a loopback host, auto-enables DNS-rebinding protection with `allowed_hosts=["127.0.0.1:*", "loc

Read the thread · 2026-08-20 · closed · 1 comment

fix(console): stored XSS - graph entity names reach an innerHTML tooltip in the galaxy view

The 3D galaxy view hands raw graph entity display names to the vendored renderer as a string label. The renderer sets a string label via d3 .html(), i.e. innerHTML, so a hostile entity name executes on hover.

Where: pseudolife_memory/web/static/js/galaxy.js — nodes map the entity to n.id, then .nodeLabel((n) => n.id). The service builds the node entity from the unescaped entity display name.

Why nothing stops it upstream: the write-time name gate junk_name_reason() (`ps

Read the thread · 2026-08-20 · closed · 0 comments

fix(concurrency): retrieval-log prune runs off the service lock and can break the shared PG connection

prune_retrieval_log() mutates Postgres from the dream-sweep thread without holding MemoryService._lock. Every other background-reachable storage mutation takes the lock; this one does not. When it interleaves with a request thread's write, psycopg's transaction nesting can raise OutOfOrderTransactionNesting, which either aborts the whole sweep tick before any dream work happens, or leaves the shared connection idle in transaction.

Where: pseudolife_memory/service.py — `prune_retri

Read the thread · 2026-08-20 · closed · 1 comment

The remaining reports are on the project's issue tracker.