Eyes for AI coding agents 👁️ — render → perceive → report → fix → re-render. A machine-graded visual feedback loop (DOM/contrast/OCR-grounded + optional vision LLM) agents consume to self-correct before claiming done.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 14 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
analyze_artifact
-
capture_screen
-
check_artifact
-
conform_artifact
-
contact_sheet
-
doctor
-
loop_iterate
-
manage_baseline
-
ocr_artifact
-
perceive_handoff
-
render_artifact
-
start_loop
-
visual_diff
-
watch_artifact
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 0e359f8 · analyzer v33 · 5d ago
skills & prompt files 1
danger signals4
- suspicious endpoint 169.254.169.254 (cloud metadata) amitpatole-agent-vision-0e359f8/tests/integration/test_motion_security.py :27
"http://169.254.169.254/latest/meta-data/iam/security-credentials/\n#EXT-X-ENDLIST\n" - suspicious endpoint 169.254.169.254 (cloud metadata) amitpatole-agent-vision-0e359f8/tests/unit/test_security_rest.py :77
r = c.post("/analyze", json={"source": "http://169.254.169.254/latest/meta-data/"}) - suspicious endpoint 169.254.169.254 (cloud metadata) amitpatole-agent-vision-0e359f8/tests/unit/test_security_ssrf.py :54
resolve_source("http://169.254.169.254/latest/meta-data/", settings=load_settings()) - suspicious endpoint 169.254.169.254 (cloud metadata) amitpatole-agent-vision-0e359f8/tests/unit/test_sources.py :28
resolve_source("http://169.254.169.254/latest/meta-data/", settings=settings)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 111
filesystem 38
- fs amitpatole-agent-vision-0e359f8/brand/render_og.py :10
from pathlib import Path - fs (weak) amitpatole-agent-vision-0e359f8/examples/contact_sheet.py :7
from pathlib import Path - fs (weak) amitpatole-agent-vision-0e359f8/examples/fix_loop.py :8
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/adapters/cli.py :11
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/adapters/doctor.py :11
import shutil - fs amitpatole-agent-vision-0e359f8/src/agentvision/backends/_image.py :7
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/config.py :10
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/analyze.py :8
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/baseline.py :11
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/capture.py :6
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/checks/__init__.py :9
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/checks/contrast_ocr.py :20
from pathlib import Path
show 26 more
- fs amitpatole-agent-vision-0e359f8/src/agentvision/core/checks/contrast_pixel.py :18
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/checks/layout.py :6
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/checks/slides.py :95
img = Image.open(img_path) - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/diff.py :10
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/render.py :6
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/tiling.py :17
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/core/watch.py :11
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/imageguard.py :14
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/ocr/tesseract.py :5
import shutil - fs amitpatole-agent-vision-0e359f8/src/agentvision/office.py :29
import shutil - fs amitpatole-agent-vision-0e359f8/src/agentvision/pathsafe.py :18
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/renderers/base.py :5
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/renderers/desktop_renderer.py :20
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/renderers/image_renderer.py :5
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/renderers/motion.py :30
import shutil - fs amitpatole-agent-vision-0e359f8/src/agentvision/renderers/office_renderer.py :10
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/renderers/pdf_renderer.py :11
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/renderers/playwright_renderer.py :16
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/sources.py :12
from pathlib import Path - fs amitpatole-agent-vision-0e359f8/src/agentvision/workspace.py :20
import shutil - fs (weak) amitpatole-agent-vision-0e359f8/tests/unit/test_clipped_text.py :9
from pathlib import Path - fs (weak) amitpatole-agent-vision-0e359f8/tests/unit/test_desktop_capture.py :5
from pathlib import Path - fs (weak) amitpatole-agent-vision-0e359f8/tests/unit/test_ephemeral.py :3
from pathlib import Path - fs (weak) amitpatole-agent-vision-0e359f8/tests/unit/test_field_report_fixes.py :126
assert Image.open(c).size[0] >= 32 - fs (weak) amitpatole-agent-vision-0e359f8/tests/unit/test_office.py :10
from pathlib import Path - fs (weak) amitpatole-agent-vision-0e359f8/tests/unit/test_tiling.py :26
w, h = Image.open(t).size
shell / exec 3
- shell amitpatole-agent-vision-0e359f8/src/agentvision/adapters/doctor.py :12
import subprocess - shell (weak) amitpatole-agent-vision-0e359f8/tests/integration/test_motion_end_to_end.py :7
import subprocess - shell (weak) amitpatole-agent-vision-0e359f8/tests/integration/test_motion_security.py :9
import subprocess
network 7
- net amitpatole-agent-vision-0e359f8/src/agentvision/netguard.py :20
import socket - net amitpatole-agent-vision-0e359f8/src/agentvision/proxy.py :17
from urllib.parse import urlsplit - net amitpatole-agent-vision-0e359f8/src/agentvision/renderers/desktop_renderer.py :21
from urllib.parse import unquote, urlparse - net amitpatole-agent-vision-0e359f8/src/agentvision/renderers/playwright_renderer.py :17
from urllib.parse import urlparse - net amitpatole-agent-vision-0e359f8/src/agentvision/sources.py :13
from urllib.parse import urlparse - net (weak) amitpatole-agent-vision-0e359f8/tests/integration/test_motion_end_to_end.py :78
import socket - net (weak) amitpatole-agent-vision-0e359f8/tests/unit/test_security_ssrf.py :80
import socket
tool registrations 14
- analyze_artifact amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :50
- capture_screen amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :70
- conform_artifact amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :98
- perceive_handoff amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :118
- watch_artifact amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :136
- check_artifact amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :153
- render_artifact amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :161
- contact_sheet amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :176
- visual_diff amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :185
- ocr_artifact amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :192
- start_loop amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :202
- loop_iterate amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :221
show 2 more
- manage_baseline amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :231
- doctor amitpatole-agent-vision-0e359f8/src/agentvision/adapters/mcp_server.py :241
declared dependencies 26
- mcp@>=1.2
- agentsensory@>=0.1
- pydantic@>=2.6
- pydantic-settings@>=2.2
- pillow@>=10.0
- numpy@>=1.26
- scikit-image@>=0.22
- typer@>=0.12
- platformdirs@>=4.0
- filelock@>=3.13
- playwright@>=1.44
- pdf2image@>=1.17
show 14 more
- pytesseract@>=0.3.10
- pyspellchecker@>=0.8
- imageio-ffmpeg@>=0.4
- jeepney@>=0.8
- anthropic@>=0.40
- openai@>=1.40
- google-genai@>=0.3
- fastapi@>=0.110
- uvicorn@>=0.29
- python-multipart@>=0.0.9
- pytest@>=8.0
- pytest-asyncio@>=0.23
- ruff@>=0.5
- mypy@>=1.10
transport_posture 1
- binds all interfaces (0.0.0.0) amitpatole-agent-vision-0e359f8/tests/unit/test_security_rest.py :94
rest.serve(host="0.0.0.0", port=0)