Self-healing Python — catches runtime errors, fixes code & dependencies via LLM + MCP
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · sse counts 7 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
pfix_analyze
-
pfix_deps_generate
-
pfix_deps_install
-
pfix_deps_scan
-
pfix_diagnose
-
pfix_edit_file
-
pfix_fix
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit b24431f · analyzer v33 · 3d ago
skills & prompt files 1
- agent-rules semcod-pfix-b24431f/AGENTS.md
danger signals12
- dynamic code execution eval()/exec() semcod-pfix-b24431f/examples/concurrency/main.py :15
exec(open("async_mistakes.py").read(), {"__name__": "__main__", "pfix": pfix}) - dynamic code execution eval()/exec() semcod-pfix-b24431f/examples/data/main.py :15
exec(open("numeric_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - dynamic code execution eval()/exec() semcod-pfix-b24431f/examples/deps/main.py :15
exec(open("package_traps.py").read(), {"__name__": "__main__", "pfix": pfix}) - dynamic code execution eval()/exec() semcod-pfix-b24431f/examples/edge_cases/main.py :15
exec(open("class_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - dynamic code execution eval()/exec() semcod-pfix-b24431f/examples/encoding/main.py :15
exec(open("codec_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - dynamic code execution eval()/exec() semcod-pfix-b24431f/examples/environment/main.py :15
exec(open("env_var_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - dynamic code execution eval()/exec() semcod-pfix-b24431f/examples/filesystem/main.py :15
exec(open("file_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - dynamic code execution eval()/exec() semcod-pfix-b24431f/examples/imports/main.py :15
exec(open("missing_module.py").read(), {"__name__": "__main__", "pfix": pfix}) - dynamic code execution eval()/exec() semcod-pfix-b24431f/examples/production/main.py :15
exec(open("api_patterns.py").read(), {"__name__": "__main__", "pfix": pfix}) - dynamic code execution __import__() semcod-pfix-b24431f/src/pfix/_auto_activate.py :70
return builtins.__import__(name, *args, **kwargs) - dynamic code execution __import__() semcod-pfix-b24431f/src/pfix/decorator.py :264
__import__(pkg) - dynamic code execution __import__() semcod-pfix-b24431f/src/pfix/integrations/precommit.py :59
__import__(module)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 148
filesystem 82
- fs (weak) semcod-pfix-b24431f/examples/concurrency/main.py :15
exec(open("async_mistakes.py").read(), {"__name__": "__main__", "pfix": pfix}) - fs (weak) semcod-pfix-b24431f/examples/data/main.py :15
exec(open("numeric_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - fs (weak) semcod-pfix-b24431f/examples/deps/main.py :15
exec(open("package_traps.py").read(), {"__name__": "__main__", "pfix": pfix}) - fs (weak) semcod-pfix-b24431f/examples/edge_cases/main.py :15
exec(open("class_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - fs (weak) semcod-pfix-b24431f/examples/edge_cases/python_gotchas.py :10
f = open(path) # No 'with' — resource leak - fs (weak) semcod-pfix-b24431f/examples/encoding/main.py :15
exec(open("codec_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - fs (weak) semcod-pfix-b24431f/examples/encoding/unicode_errors.py :14
with open(path, "wb") as f: - fs (weak) semcod-pfix-b24431f/examples/environment/env_var_errors.py :37
with open(config_path) as f: - fs (weak) semcod-pfix-b24431f/examples/environment/main.py :15
exec(open("env_var_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - fs (weak) semcod-pfix-b24431f/examples/filesystem/file_errors.py :11
with open("config.json") as f: # FileNotFoundError: config.json doesn't exist - fs (weak) semcod-pfix-b24431f/examples/filesystem/main.py :15
exec(open("file_errors.py").read(), {"__name__": "__main__", "pfix": pfix}) - fs (weak) semcod-pfix-b24431f/examples/imports/main.py :15
exec(open("missing_module.py").read(), {"__name__": "__main__", "pfix": pfix})
show 28 more
- fs (weak) semcod-pfix-b24431f/examples/imports/missing_module.py :20
with open(path) as f: - fs (weak) semcod-pfix-b24431f/examples/imports/platform_specific.py :11
with open(path, "rb") as f: - fs (weak) semcod-pfix-b24431f/examples/memory/main.py :9
content = open(path).read() # Loads entire file — OOM on large files - fs (weak) semcod-pfix-b24431f/examples/production/api_patterns.py :87
with open(config_path) as f: - fs (weak) semcod-pfix-b24431f/examples/production/cascading_errors.py :19
with open("/etc/myapp/database.json") as f: - fs (weak) semcod-pfix-b24431f/examples/production/main.py :15
exec(open("api_patterns.py").read(), {"__name__": "__main__", "pfix": pfix}) - fs (weak) semcod-pfix-b24431f/examples/reset.py :11
from pathlib import Path - fs (weak) semcod-pfix-b24431f/examples/run_all.py :13
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/__init__.py :91
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/_auto_activate.py :10
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/analyzer.py :14
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/audit.py :13
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/cache.py :15
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/commands/activation.py :3
import shutil - fs semcod-pfix-b24431f/src/pfix/commands/config.py :4
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/commands/diagnose.py :3
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/commands/run.py :6
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/config.py :10
import shutil - fs semcod-pfix-b24431f/src/pfix/dashboard.py :14
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/dependency.py :17
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/diff_fixer.py :11
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/env_diagnostics/__init__.py :22
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/env_diagnostics/auto_fix.py :10
import shutil - fs semcod-pfix-b24431f/src/pfix/env_diagnostics/base.py :10
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/env_diagnostics/concurrency.py :8
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/env_diagnostics/config_env.py :8
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/env_diagnostics/encoding.py :8
from pathlib import Path - fs semcod-pfix-b24431f/src/pfix/env_diagnostics/filesystem.py :8
import shutil
42 more not shown — this panel samples each group; the count above is the real total.
shell / exec 9
- shell (weak) semcod-pfix-b24431f/examples/encoding/codec_errors.py :9
import subprocess - shell (weak) semcod-pfix-b24431f/examples/reset.py :9
import subprocess - shell (weak) semcod-pfix-b24431f/examples/run_all.py :11
import subprocess - shell semcod-pfix-b24431f/src/pfix/dependency.py :15
import subprocess - shell semcod-pfix-b24431f/src/pfix/env_diagnostics/imports/checks.py :9
import subprocess - shell semcod-pfix-b24431f/src/pfix/env_diagnostics/venv.py :201
import subprocess - shell semcod-pfix-b24431f/src/pfix/pfix_python.py :14
import subprocess - shell semcod-pfix-b24431f/src/pfix/validation.py :17
import subprocess - shell (weak) semcod-pfix-b24431f/tests/test_mcp_server.py :5
import subprocess
network 8
- net (weak) semcod-pfix-b24431f/examples/deps/package_traps.py :19
import requests - net (weak) semcod-pfix-b24431f/examples/imports/missing_module.py :9
import httpx # not installed by default - net (weak) semcod-pfix-b24431f/examples/network/main.py :9
import socket - net (weak) semcod-pfix-b24431f/examples/shared.py :13
import requests - net semcod-pfix-b24431f/src/pfix/env_diagnostics/network.py :7
import socket - net semcod-pfix-b24431f/src/pfix/mcp_client.py :36
import httpx - net semcod-pfix-b24431f/src/pfix/production.py :284
import urllib.request - net semcod-pfix-b24431f/src/pfix/telemetry.py :106
import urllib.request
secrets 1
- secrets semcod-pfix-b24431f/src/pfix/config.py :159
"llm_api_key": os.getenv("OPENROUTER_API_KEY", os.getenv("PFIX_API_KEY", "")),
database 3
- db semcod-pfix-b24431f/src/pfix/cache.py :13
import sqlite3 - db semcod-pfix-b24431f/src/pfix/dashboard.py :110
import sqlite3 - db semcod-pfix-b24431f/src/pfix/logging.py :11
import sqlite3
tool registrations 7
- pfix_analyze semcod-pfix-b24431f/src/pfix/mcp_server.py :99
- pfix_fix semcod-pfix-b24431f/src/pfix/mcp_server.py :139
- pfix_deps_scan semcod-pfix-b24431f/src/pfix/mcp_server.py :252
- pfix_deps_install semcod-pfix-b24431f/src/pfix/mcp_server.py :264
- pfix_deps_generate semcod-pfix-b24431f/src/pfix/mcp_server.py :300
- pfix_diagnose semcod-pfix-b24431f/src/pfix/mcp_server.py :345
- pfix_edit_file semcod-pfix-b24431f/src/pfix/mcp_server.py :410
declared dependencies 21
- mcp@>=1.0.0
- litellm@>=1.40.0
- python-dotenv@>=1.0.0
- rich@>=13.0.0
- pipreqs@>=0.4.0
- pathspec@>=0.12.0
- httpx@>=0.27.0
- uvicorn@>=0.30.0
- gitpython@>=3.1.0
- watchdog@>=4.0.0
- structlog@>=24.0.0
- tenacity@>=8.0.0
show 9 more
- diskcache@>=5.6.0
- sentry-sdk@>=2.0
- textual@>=0.50
- pytest@>=8.0
- pytest-cov@>=5.0
- ruff@>=0.4.0
- costs@>=0.1.20
- psutil@>=5.9.0
- pfix@*
perm:untrusted 1
- untrusted (weak) semcod-pfix-b24431f/examples/shared.py :15
return requests.get(url).json()