pseudolife-mcp@0.24.0
VERIFIED· not startedPublisher claims: "Pseudolife persistent long-term memory for MCP-compatible coding agents" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Verified here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
PSEUDOLIFE_CODEX_SERVER_TOKENConfiguration, not credentials: CLAUDE_CODE_SESSION_ID, PSEUDOLIFE_AGENT_COORDINATION, PSEUDOLIFE_AGENT_LABEL, PSEUDOLIFE_AGENT_PROJECT, PSEUDOLIFE_AGENT_STATE, PSEUDOLIFE_AGENT_STATE_DIR, PSEUDOLIFE_AGENT_TASK, PSEUDOLIFE_AGENT_WAKE, PSEUDOLIFE_CODEX_BIN, PSEUDOLIFE_CODEX_SERVER_URL, PSEUDOLIFE_HOOK_PROBE_MS, PSEUDOLIFE_MCP_NO_SPAWN, PSEUDOLIFE_MCP_PROXY_TIMEOUT_SECONDS, PSEUDOLIFE_MCP_SHARED_HOST, PSEUDOLIFE_WRITER_ID- Where it talks to
- no vendor host named in the code
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it with a scoped credential, under the guard. It asks for PSEUDOLIFE_CODEX_SERVER_TOKEN and talks to its vendor. Give the credential to the guard, not the server: the value never enters the server's environment and only travels to the host you bind. What the tools do with a real credential was not observed.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-15 and scored it 86/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
proc = subprocess.run([sys.executable, "-m", "pseudolife_memory.cli", "connect", "--help"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run([pwsh, "-NoProfile", "-File", str(driver)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.Popen(argv, **kwargs).pidFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."http://user:[email protected]:8765",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return subprocess.run([bash_exe(), str(script)], input=input, env=env,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run([bash, script.as_posix()], env=env, capture_output=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["icacls", str(path), "/grant", "*S-1-1-0:R"], check=True, capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.widened = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.run([sys.executable, "-X", "utf8=0", *arguments],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.Popen(child_python.cli_argv("serve"), **kwargs)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.run([pwsh, "-NoProfile", *map(str, args)], input=input,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run([bash_exe(), str(ROOT / "plugin/hooks/session-start.sh")],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# after a reboot its stop can kill an unrelated process (pg0 #37).Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.assert "sudo tailscale set --operator=$USER" in errFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.code, _report, out = run_json(capsys, f"http://user:{SECRET}@example.com")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(["icacls", str(folder), "/reset", "/T"], capture_output=True, timeout=60)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert env == {URL_KEY: "http://100.64.0.2:8765", "KEEP": "1", FILE_KEY: str(token), NO_SPAWN: "1"}Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.machine.user_url = f"https://user:{SECRET}@example.com/path"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(["icacls", str(path), "/grant", "*S-1-1-0:R"], check=True,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."permission denied; use 'sudo tailscale serve' or 'tailscale set --operator=$USER'\n",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.code, out = run(capsys, f"http://user:{SECRET}@example.com")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."mcpServers": {"pseudolife-memory": {"type": "http", "url": "http://127.0.0.1:8765/mcp"}},Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.assert fix.endswith(f"chmod 600 {path}")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert env == {URL_KEY: "http://100.64.0.2:8765", "KEEP": "1", FILE_KEY: str(token), NO_SPAWN: "1"}Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.result = codex_connection.replace_connection(fake, home, tmp_path, "http://100.64.0.2:8765",Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.return subprocess.run([sys.executable, "-c", _SDK_CHECK], cwd=cwd, env=env,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.out = _refused(machine, capsys, "http://100.64.0.2:8765", "--yes")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.remote = "http://100.64.0.2:8765"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls."http://100.64.0.2:8765", str(token))Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls."file:///etc/passwd", "http://127.0.0.1:8765/ui/#/settings",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.monkeypatch.setattr("sys.stdin", io.TextIOWrapper(io.BytesIO(("" + GOOD + "\r\n").encode())))Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.remote = "http://100.64.0.2:8765"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.# running after svc exists would kill the shared service's connection.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.proc = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = codex_connection.replace_connection(fake, home, tmp_path, "http://100.64.0.2:8765",Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.@pytest.mark.parametrize("url", ["ftp://example.com", "http://example.com/mcp", "http://u:[email protected]",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.out = subprocess.run([str(whoami), "/user", "/fo", "csv", "/nh"], check=True,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."mcpServers": {"pseudolife-memory": {"type": "http", "url": "http://127.0.0.1:8765/mcp"}}})Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.assert "chmod 600 '/fixture/my dir/token'" in credential_recovery(Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert "sudo tailscale set --operator=$USER" in errFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.monkeypatch.setenv(URL_KEY, f"http://user:{SECRET}@127.0.0.1:1")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."http://100.64.0.2:8765", str(token))Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls."""nan/inf would pass a "<= 0" check and kill the thread at its firstFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.return subprocess.run([sys.executable, "-m", "pseudolife_memory.credentials", "repair",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.windows=False).endswith("chmod 600 /fixture/dir/token")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.listing = subprocess.run(["icacls", str(folder)], capture_output=True, text=True,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.out = _refused(machine, capsys, "http://100.64.0.2:8765", "--yes")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.v1, v2, v3 = ("the api key lives in .env",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."900s", "--replace", "--url", "http://100.64.0.2:8765"]Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.monkeypatch.setattr(invite_cli, "exposed_url", lambda port: "http://100.64.0.2:8765")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.monkeypatch.setattr(invite_cli, "exposed_url", lambda port: "http://100.64.0.2:8765")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.return subprocess.Popen([sys.executable, "-c", "import sys; sys.stdin.readline()"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.if e["text"] == "the api key lives in .env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.template = (REPO / "ops" / ".env.example").read_text(encoding="utf-8")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return subprocess.run([_pwsh_or_skip(), "-NoProfile", "-NonInteractive", "-Command", script],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."http://100.64.0.2:8765"]Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls._write_token_file(token_file, "tok-with-bom")Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.orig_app = mcp_server.mcp.streamable_http_appFix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them."900s", "--replace", "--url", "http://100.64.0.2:8765"]Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.mcp_server.build_streamable_http_app()Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.assert f"pseudolife-mcp pair http://100.64.0.2:8765 {printed}" in outFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls."""The children still running (to assert on), then kill them all so aFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.assert report["pair_command"] == f"pseudolife-mcp pair http://100.64.0.2:8765 {report['code']}"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.self.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""Compose passes an unset ops/.env value as an empty string."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert f"pseudolife-mcp pair http://100.64.0.2:8765 {printed}" in outFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.mcp_server.mcp.streamable_http_app = _captureFix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them."http://100.64.0.2:8765"]Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.mcp_server.mcp.streamable_http_app = orig_appFix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.mcp_server.build_streamable_http_app()Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.# Every shipped rule must kill at least a handful of real rejects —Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell._invoke("memory_store", {"text": "the api key lives in .env", "source": "notes"})Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if e["text"] == "the api key lives in .env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# `kill -INT <lease pid>` reaches only this process: after the grace theFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# `kill <lease pid>`, `timeout`, a service or CI stop: without a handlerFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.TARGET_URL = "http://100.64.0.9:8765"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.assert report["pair_command"] == f"pseudolife-mcp pair http://100.64.0.2:8765 {report['code']}"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls._invoke("memory_supersede", {"old_text": "the api key lives in .env",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run([pwsh, "-NoProfile", "-NonInteractive", "-Command", probe],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.world.env_path_model = f"{world.requested_checkout}/ops/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.TARGET_URL = "http://100.64.0.9:8765"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.for text in (b"http://100.64.0.2:8765", b"100.64.0.10",Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.env_file = tmp_path / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_file = tmp_path / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.proc = subprocess.run(["git", "tag", "-l"], cwd=repo, check=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.if cmd.startswith("rm -f ") and cmd.endswith("ops/.env"):Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# ── Windows: SIGBREAK, and a rollback a second Ctrl-C cannot kill ────────────Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.return c.remote is not None and "&& mv -f" in c.remote and "ops/.env" in c.remoteFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return self.expose_exit, b"", b"expose: run sudo tailscale set --operator=$USER"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.moved = subprocess.run([sys.executable, "-c", code], cwd=root, capture_output=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.code, report, text = run_json(capsys, "http://100.64.0.2:8765", CODE)Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.plain = subprocess.run([sys.executable, "-c", code], cwd=root, env=env,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.assert not rc._mentions("see .env file", "env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.@pytest.mark.parametrize("url", ["ftp://example.com", "http://user:[email protected]:8765",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.code, _out, err = run(capsys, "http://100.64.0.2:8765", CODE)Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.options[options.index("--env-file") + 1] = str(s["repo"] / "ops/.env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.run = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.resolves the ops/.env or compose-default layers."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.proc = subprocess.run(["git", "ls-files"], cwd=repo, check=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.assert made and all("-m 700" in cmd and "chmod 700" in cmd for cmd in made), madeFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.bad = subprocess.run([sys.executable, "-c", code], cwd=root, capture_output=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run([sys.executable, "-m", "pseudolife_memory.cli", "pair", "--help"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.holds move.json, which a daemon refuses to start on; the rollback putsFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.env_file = tmp_path / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_file = tmp_path / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.code, report, text = run_json(capsys, "http://100.64.0.2:8765", CODE)Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.env = f"{CHECKOUT}/ops/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.code, _out, err = run(capsys, "http://100.64.0.2:8765", CODE)Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.proc = subprocess.run(["git", "check-attr", "--stdin", "-z", "text", "diff"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.the shim — the default since the 2026-07-11 cutover, and what ``ops/.env``Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.child = subprocess.Popen([PYTHON, "-c", HOLD])Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.for text in (b"http://100.64.0.2:8765", b"100.64.0.10",Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.return subprocess.run(["git", "-C", str(repo), "-c", "user.name=test", "-c", "[email protected]",Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.cached = shim._load_handshake_cache("http://100.64.0.2:8765")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls."""``ops/.env`` holds the database password and the principal tokens. AFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.proc = subprocess.run([sys.executable, "-m", "pseudolife_memory.cli", "update", "--help"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.shim._store_handshake_cache("http://100.64.0.2:8765", tools=[tool])Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.shim._store_handshake_cache("http://100.64.0.2:8765", instructions="Use it.")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.assert shim.ensure_daemon("http://100.64.0.2:8765") is NoneFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out._EXAMPLE_COPY = "rejects the compose default password, as ops/.env is a copy of ops/.env.example"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Hard-kill the interpreter that holds the lock, by its own pid: underFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.done = subprocess.run(["pwsh", "-NoProfile", "-File", str(driver)], env=env,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.cached = shim._load_handshake_cache("http://100.64.0.2:8765")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.other = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(60)"])Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.shim._store_handshake_cache("http://100.64.0.2:8765", instructions="Use it.")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.return subprocess.run([PWSH, "-NoProfile", "-NonInteractive", "-File", str(path)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.the checkout's ops/.env, this machine's test login file hidden."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.for url in ("http://100.64.0.2:8765", "https://daemon.example.invalid"):Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.ignored — ``.env`` and ``*.bak`` match neither ``.env.bak-<ts>`` shape —Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.shim._store_handshake_cache("http://100.64.0.2:8765", tools=[tool])Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.# own; kill only what does not.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.Every ``ops/.env*`` variant is ignored except the tracked template."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# worktree, whose ops/.env was missing or a copy of ops/.env.example, resolvedFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.proc = subprocess.run([sys.executable, str(ROOT / "ops" / "update.py"), "--help"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.for rel in ("ops/.env", "ops/.env.bak-x", "ops/.env.bak-20990101-000000",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.proc = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["git", "init", "-q", str(root)], check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.fix = "pseudolife_memory.credentials repair" if os.name == "nt" else "chmod 600"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.assert shim.ensure_daemon("http://100.64.0.2:8765") is NoneFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.subprocess.run([sys.executable, "-m", "venv", "--without-pip", str(root)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.for url in ("http://100.64.0.2:8765", "https://daemon.example.invalid"):Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.other = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(60)"])Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.original_env = (root / "ops/.env").read_bytes()Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# (PowerShell: Add-Content "$env:USERPROFILE\.claude\CLAUDE.md" (Get-Content examples\CLAUDE.memory.md -Raw))Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.assert _run(["--daemon-only", "--daemon-url", "http://10.0.0.7:8765"]) == 2Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.Add-Content "$env:USERPROFILE\.claude\CLAUDE.md" (Get-Content examples\CLAUDE.memory.md -Raw)Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.probe = subprocess.run(["git", "-C", str(root), "rev-parse", "HEAD"], capture_output=True, text=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.hooks, append it to Claude's global `~/.claude/CLAUDE.md`, Codex'sFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.assert _run(argv + ["--daemon-url", "http://10.0.0.7:8765"]) == 0, argvFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.default (append to `~/.gemini/GEMINI.md` or `~/AGENTS.md`); useFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.(project / ".env").write_text("PSEUDOLIFE_IMAGE_TAG=0.15.0\n", encoding="utf-8")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.st, _ = call(_app(svc), "GET", "/ui/../../../etc/passwd")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert _run(argv + ["--daemon-url", "http://10.0.0.7:8765"]) == 0, argvFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.append` always writes the block from `examples/CLAUDE.memory.md` intoFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.append` always writes the block from `examples/CLAUDE.memory.md` intoFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.for rel in ("../../etc/passwd", "a/./../../x", "/", "/etc/passwd", "//host/share/x",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert f"--env-file {project / '.env'}" in calls[compose]Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# (PowerShell: Add-Content "$env:USERPROFILE\.claude\CLAUDE.md" (Get-Content examples\CLAUDE.memory.md -Raw))Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.Add-Content "$env:USERPROFILE\.claude\CLAUDE.md" (Get-Content examples\CLAUDE.memory.md -Raw)Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.hooks, append it to Claude's global `~/.claude/CLAUDE.md`, Codex'sFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.assert _run(["--clients-only", "--daemon-url", "http://10.0.0.7:8765"]) == 2, reportedFix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.default (append to `~/.gemini/GEMINI.md` or `~/AGENTS.md`); useFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct._ESCAPING_UI_PATHS = ["/ui/../../../etc/passwd", "/ui///etc/passwd", "/ui/a/../../x",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert _run(["--clients-only", "--daemon-url", "http://10.0.0.7:8765", "--tag", "0.15.1"]) == 0Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.assert (root / "ops/.env").read_bytes() == original_envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.escaping = ["../x", "a/../../x", "/etc/passwd", "//host/share/x",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_file = ops / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
Not checked against OSV yet; the weekly check has not reached this version.