github Python re-analysis due

FailEcho/failecho

v0.1.1
github

Live cross-agent failure and recovery intelligence for AI agents and autonomous software.

maintainer
FailEcho
licence
MIT
first seen
2026-09-10
last seen
2026-09-19
releases · 30d
3
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 0 tools
transport stdio · streamable-http · http counts 0 tools · 0 res · 0 prompts permission surface via code analysis

No tools enumerated yet for this server.

skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit 4df64f6 · analyzer v33 · 2h ago

skills & prompt files 1

danger signals1

code evidence v0.1.1 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 144

filesystem 50

  • fs FailEcho-failecho-4df64f6/app/main.py :23 from pathlib import Path
  • fs FailEcho-failecho-4df64f6/client/example_agent.py :9 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/examples/live_agent/agents.py :23 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/examples/live_agent/run_demo.py :35 from pathlib import Path
  • fs FailEcho-failecho-4df64f6/failecho_agent/__init__.py :314 with open(path, encoding="utf-8") as fh:
  • fs FailEcho-failecho-4df64f6/failecho_fleet/__init__.py :629 with open(self._etag_path, encoding="utf-8") as fh:
  • fs FailEcho-failecho-4df64f6/failecho_fleet/builder.py :212 with open(PROXY_STATS, encoding="utf-8") as fh:
  • fs FailEcho-failecho-4df64f6/failecho_fleet/onboard.py :392 with open(path, encoding="utf-8") as fh:
  • fs FailEcho-failecho-4df64f6/failecho_sandbox/__init__.py :43 import shutil
  • fs FailEcho-failecho-4df64f6/failecho_sandbox/__main__.py :24 "try:\n open('/usr/bin/marker', 'w').write('x'); print('WROTE')\n"
  • fs FailEcho-failecho-4df64f6/failecho_sandbox/canary.py :288 with open(tmp, "w", encoding="utf-8") as fh:
  • fs FailEcho-failecho-4df64f6/failecho_sandbox/guest_init.py :132 with open(path, "w", encoding="utf-8") as fh:
show 28 more
  • fs FailEcho-failecho-4df64f6/failecho_sandbox/proxy.py :87 with open(path, encoding="utf-8") as fh:
  • fs FailEcho-failecho-4df64f6/failecho_scan/__init__.py :55 with open("/proc/version", encoding="utf-8", errors="ignore") as fh:
  • fs FailEcho-failecho-4df64f6/plugin/hooks/failecho_hook.py :56 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/scripts/build_autoreport_package.py :17 import shutil
  • fs (weak) FailEcho-failecho-4df64f6/scripts/build_brand_assets.py :17 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/scripts/build_relay_package.py :17 import shutil
  • fs (weak) FailEcho-failecho-4df64f6/scripts/migrate_canonical_services.py :18 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/scripts/prune.py :22 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/scripts/redact_logs.py :38 import pathlib
  • fs (weak) FailEcho-failecho-4df64f6/scripts/seed_demo.py :27 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/scripts/usage_report.py :22 import pathlib
  • fs (weak) FailEcho-failecho-4df64f6/tests/conftest.py :15 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/live_server.py :14 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_about_page.py :12 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_ask_vs_blind.py :10 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_autoreport.py :58 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_branding.py :10 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_claude_code_hook.py :17 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_claude_plugin.py :11 import shutil
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_client.py :7 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_client_failecho.py :12 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_demo_page.py :10 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_deploy_config.py :10 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_error_types.py :102 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_first_party.py :11 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_fleet_recovery.py :416 doc = open(ROOT_DOC).read()
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_frontend.py :14 from pathlib import Path
  • fs (weak) FailEcho-failecho-4df64f6/tests/test_mcp_bridge.py :16 from pathlib import Path

10 more not shown — this panel samples each group; the count above is the real total.

shell / exec 16

  • shell FailEcho-failecho-4df64f6/failecho_sandbox/__init__.py :47 import subprocess
  • shell FailEcho-failecho-4df64f6/failecho_sandbox/canary.py :68 p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
  • shell FailEcho-failecho-4df64f6/failecho_sandbox/guest_init.py :44 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/scripts/build_autoreport_package.py :18 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/scripts/build_relay_package.py :18 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/tests/conftest.py :11 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/tests/live_server.py :7 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/tests/test_ask_vs_blind.py :8 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/tests/test_claude_code_hook.py :13 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/tests/test_claude_plugin.py :12 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/tests/test_mcp_bridge.py :11 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/tests/test_no_production_reach.py :47 import subprocess
show 4 more
  • shell (weak) FailEcho-failecho-4df64f6/tests/test_npm_relay.py :12 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/tests/test_public_surface.py :5 import subprocess
  • shell (weak) FailEcho-failecho-4df64f6/tests/test_sandbox.py :252 out = b.run_python("import os; os.system('id')")
  • shell (weak) FailEcho-failecho-4df64f6/tests/test_seed_demo.py :6 import subprocess

network 32

  • net FailEcho-failecho-4df64f6/client/failecho/__init__.py :43 import urllib.error
  • net FailEcho-failecho-4df64f6/client/failure_network.py :42 import urllib.error
  • net (weak) FailEcho-failecho-4df64f6/examples/live_agent/run_demo.py :33 import urllib.error
  • net (weak) FailEcho-failecho-4df64f6/examples/live_agent/tool_client.py :15 import urllib.error
  • net FailEcho-failecho-4df64f6/failecho_agent/__init__.py :41 import urllib.error
  • net FailEcho-failecho-4df64f6/failecho_autoreport/__init__.py :79 import urllib.error
  • net FailEcho-failecho-4df64f6/failecho_autoreport/__main__.py :17 import urllib.request
  • net FailEcho-failecho-4df64f6/failecho_autoreport/auto.py :10 TestClient -- an httpx.Client -- into a reporter: 91 rows of test traffic
  • net FailEcho-failecho-4df64f6/failecho_fleet/__init__.py :37 import urllib.error
  • net FailEcho-failecho-4df64f6/failecho_fleet/builder.py :39 import urllib.parse
  • net FailEcho-failecho-4df64f6/failecho_fleet/onboard.py :63 import urllib.error
  • net FailEcho-failecho-4df64f6/failecho_sandbox/__init__.py :45 import socket
show 20 more
  • net FailEcho-failecho-4df64f6/failecho_sandbox/__main__.py :32 "import socket\ns=socket.socket(); s.settimeout(4)\n"
  • net FailEcho-failecho-4df64f6/failecho_sandbox/canary.py :57 RUN_SCRIPT = """import urllib.request
  • net FailEcho-failecho-4df64f6/failecho_sandbox/guest_init.py :42 import socket
  • net FailEcho-failecho-4df64f6/plugin/hooks/failecho_hook.py :53 import urllib.error
  • net (weak) FailEcho-failecho-4df64f6/scripts/ask_vs_blind.py :39 import urllib.error
  • net (weak) FailEcho-failecho-4df64f6/scripts/check_seo.py :20 import urllib.error
  • net (weak) FailEcho-failecho-4df64f6/scripts/loadtest.py :23 import httpx
  • net (weak) FailEcho-failecho-4df64f6/scripts/scale_test.py :20 import urllib.error
  • net (weak) FailEcho-failecho-4df64f6/scripts/usage_report.py :23 import urllib.request
  • net (weak) FailEcho-failecho-4df64f6/tests/conftest.py :43 import socket as _socket # noqa: E402
  • net (weak) FailEcho-failecho-4df64f6/tests/live_server.py :6 import socket
  • net (weak) FailEcho-failecho-4df64f6/tests/test_auto.py :68 import requests
  • net (weak) FailEcho-failecho-4df64f6/tests/test_autoreport.py :508 monkeypatch.setattr(mod.urllib.request, "urlopen", fake_urlopen)
  • net (weak) FailEcho-failecho-4df64f6/tests/test_claude_code_hook.py :16 import urllib.request
  • net (weak) FailEcho-failecho-4df64f6/tests/test_client.py :43 with patch("urllib.request.urlopen", _Bridge(client)):
  • net (weak) FailEcho-failecho-4df64f6/tests/test_client_failecho.py :75 with patch("urllib.request.urlopen", bridge):
  • net (weak) FailEcho-failecho-4df64f6/tests/test_fleet_recovery.py :14 import urllib.error
  • net (weak) FailEcho-failecho-4df64f6/tests/test_mcp_bridge.py :15 import urllib.request
  • net (weak) FailEcho-failecho-4df64f6/tests/test_no_production_reach.py :9 import socket
  • net (weak) FailEcho-failecho-4df64f6/tests/test_sandbox.py :15 import socket

secrets 6

  • secrets FailEcho-failecho-4df64f6/client/failecho/__init__.py :128 self.operator_token = operator_token or os.environ.get("FAILECHO_OPERATOR_TOKEN") or None
  • secrets FailEcho-failecho-4df64f6/failecho_agent/__init__.py :58 OPERATOR_TOKEN = os.environ.get("FIN_FIRST_PARTY_TOKEN") or os.environ.get("FAILECHO_OPERATOR_TOKEN")
  • secrets FailEcho-failecho-4df64f6/failecho_autoreport/__init__.py :199 self.operator_token = operator_token or os.environ.get("FAILECHO_OPERATOR_TOKEN") or None
  • secrets FailEcho-failecho-4df64f6/failecho_fleet/__init__.py :79 "key": os.environ.get("GROQ_API_KEY"), "models": ["openai/gpt-oss-20b"], "daily_cap": 3000,
  • secrets FailEcho-failecho-4df64f6/failecho_mcp/__init__.py :212 operator_token = os.environ.get("FAILECHO_OPERATOR_TOKEN") or None
  • secrets FailEcho-failecho-4df64f6/plugin/hooks/failecho_hook.py :440 if os.environ.get("FAILECHO_OPERATOR_TOKEN"):

database 16

  • db FailEcho-failecho-4df64f6/app/api/deps.py :8 from sqlalchemy.ext.asyncio import AsyncSession
  • db FailEcho-failecho-4df64f6/app/api/services.py :6 from sqlalchemy import case, false, func, select
  • db FailEcho-failecho-4df64f6/app/core/adoption.py :22 from sqlalchemy import func, select
  • db FailEcho-failecho-4df64f6/app/core/intelligence.py :22 from sqlalchemy import Select, case, func, select
  • db FailEcho-failecho-4df64f6/app/core/retention.py :26 from sqlalchemy import case, delete, false, func, select
  • db FailEcho-failecho-4df64f6/app/core/service.py :14 from sqlalchemy import func, select, union
  • db FailEcho-failecho-4df64f6/app/db/database.py :13 from sqlalchemy import event
  • db FailEcho-failecho-4df64f6/app/db/models.py :13 from sqlalchemy import Boolean, DateTime, Index, Integer, String
  • db FailEcho-failecho-4df64f6/app/main.py :41 from sqlalchemy import text
  • db FailEcho-failecho-4df64f6/failecho_fleet/__init__.py :34 import sqlite3
  • db (weak) FailEcho-failecho-4df64f6/scripts/migrate_canonical_services.py :16 import sqlite3
  • db (weak) FailEcho-failecho-4df64f6/scripts/prune.py :26 from sqlalchemy import text # noqa: E402
show 4 more
  • db (weak) FailEcho-failecho-4df64f6/scripts/purge_demo_agent.py :20 import sqlite3
  • db (weak) FailEcho-failecho-4df64f6/scripts/seed_demo.py :31 from sqlalchemy import delete, func, insert, select # noqa: E402
  • db (weak) FailEcho-failecho-4df64f6/tests/conftest.py :10 import sqlite3
  • db (weak) FailEcho-failecho-4df64f6/tests/test_decay_and_verification.py :200 import sqlite3

declared dependencies 9

  • mcp@>=2.0
  • fastapi@>=0.111
  • pydantic@>=2.7
  • sqlalchemy@>=2.0
  • aiosqlite@>=0.20
  • uvicorn@>=0.30
  • opentelemetry-proto@>=1.20
  • pytest@>=8.0
  • httpx@>=0.27