HIPAA compliant email triage
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit cdc278e · analyzer v33 · 2w ago
skills & prompt files 1
danger signals5
- dynamic code execution __import__() Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/ui/profile.py :3083
lambda db, u: __import__( - dynamic code execution __import__() Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_privacy_invariants_m7_hipaa.py :766
__import__( - dynamic code execution __import__ sink Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_web/test_log_chain.py :862
not hasattr(__import__("os"), "geteuid"), - over-broad OAuth scope gmail.modify Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/gmail_api.py :41
"https://www.googleapis.com/auth/gmail.modify", - over-broad OAuth scope gmail.modify Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_privacy_invariants_oauth.py :798
"scope": "gmail.modify gmail.labels", # kept
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 517
filesystem 92
- fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/openclaw/skills/email-triage-api/scripts/email-triage-api.py :68
with open(path, encoding="utf-8") as f: - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/openclaw/skills/email-triage-api/tests/test_multiuser.py :14
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/scripts/build-embedding-bits-manifest.py :59
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/scripts/gen-pwa-icons.py :34
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/scripts/verify-draft-headers.py :10
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/backup.py :45
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/backup_snapshot_cleanup.py :41
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/cli.py :33
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/config.py :14
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/_engine.py :52
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/_migrate.py :43
import shutil - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/embedding_bits/__init__.py :68
import shutil
show 28 more
- fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/engine/store.py :35
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/imap.py :1957
# means the TCP socket is half-open (NAT/firewall idle - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/office365.py :26
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/secrets.py :34
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/tls.py :20
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/tls_csr.py :28
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/version.py :39
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/acme_renewer.py :48
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/app.py :18
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/daily_health.py :840
from pathlib import Path as _Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/db.py :12
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/db_writelock.py :46
when a transaction is actually open (``conn.in_transaction``) and only - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/migrations.py :2941
are skipped while the LLM circuit breaker is open (re-running classify - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/auth_keys.py :1646
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/backup.py :24
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/tls_csr.py :23
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/ui/_shared.py :5656
from pathlib import Path - fs Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/ui/embedding_install.py :55
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_acme_renewer.py :16
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_actions/test_add_label.py :369
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_alembic_baseline.py :40
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_backup.py :22
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_backup_snapshot_cleanup.py :21
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_cache/test_classification.py :1083
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_cache/test_classification_async.py :486
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_cli.py :4
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_cli_audit.py :14
from pathlib import Path - fs (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_cli_restore.py :9
from pathlib import Path
52 more not shown — this panel samples each group; the count above is the real total.
shell / exec 6
- shell (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/openclaw/skills/email-triage-api/tests/test_multiuser.py :12
import subprocess - shell Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/embedding_bits/__init__.py :70
import subprocess - shell Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/tls.py :178
import subprocess - shell (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_alembic_baseline.py :38
import subprocess - shell (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_embedding_bits/test_runtime_ready_check.py :6
import subprocess - shell (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_tls.py :4
import subprocess
network 51
- net (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/openclaw/skills/email-triage-api/scripts/email-triage-api.py :46
import urllib.error - net (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/scripts/build-embedding-bits-manifest.py :17
* Pure stdlib (argparse + urllib.request). No new install-time dep. - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/_http_client.py :1
"""Lazy-init / lock-protected ``httpx.AsyncClient`` holder. - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/ai_backends/azure_openai.py :57
from urllib.parse import urlsplit - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/ai_backends/gemini_adapter.py :58
from urllib.parse import urlsplit - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/ai_backends/openai_direct.py :65
from urllib.parse import urlsplit - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/classify/baa_gate.py :30
from urllib.parse import urlparse - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/classify/base.py :52
from urllib.parse import urlparse - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/classify/gemini.py :4
via httpx. Requires an API key from Google AI Studio or Vertex AI. - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/classify/ollama.py :3
Uses the Ollama REST API (``/api/chat``) via httpx. This is the default - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/cli.py :2553
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/embedding_bits/__init__.py :75
import urllib.error
show 28 more
- net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/engine/embedding_backend.py :44
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/llm_health.py :64
Wraps the underlying ``httpx.ConnectError`` / - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/_oauth_http.py :70
client: ``httpx.AsyncClient`` to issue the request on. - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/calendar_base.py :20
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/dispatcher.py :180
import socket - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/gmail_api.py :28
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/gmail_calendar.py :23
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/office365.py :29
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/office365_calendar.py :16
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/acme_renewer.py :1624
import requests - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/csrf.py :53
from urllib.parse import parse_qs - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/daily_health.py :45
import urllib.error - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/events.py :32
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/gmail_push_auth.py :20
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/ingestion_push.py :113
import httpx - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/auth_keys.py :137
from urllib.parse import urlparse - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/backup.py :176
import socket - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/ui/accounts.py :318
from urllib.parse import urlencode - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/ui/admin.py :1162
from urllib.parse import urlencode - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/ui/retry_queue.py :192
# qualname prefix ("httpx.ReadTimeout" → "ReadTimeout"). - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/routers/ui/wizard.py :725
from urllib.parse import quote - net Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/watch_runner.py :28
import httpx - net (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_ai_backends/test_breaker_integration.py :10
* a connect-class failure (``httpx.ConnectError``) on the pooled - net (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_classify/test_gemini.py :62
httpx.AsyncClient(...)`` per call. The stub returns ``mock_resp`` - net (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_classify/test_ollama.py :123
with patch("email_triage.classify.ollama.httpx.AsyncClient") as mock_client_cls: - net (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_classify/test_openai_compat.py :57
httpx.AsyncClient(...)`` per call. The stub returns ``mock_resp`` - net (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_http_client_long_lived.py :1
"""Bundle J / — long-lived ``httpx.AsyncClient`` invariants. - net (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_llm_health.py :10
import httpx
11 more not shown — this panel samples each group; the count above is the real total.
secrets 4
- secrets (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/openclaw/skills/email-triage-api/scripts/email-triage-api.py :138
return os.environ.get("EMAIL_TRIAGE_TOKEN", "") or "" - secrets Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/cli.py :742
import getpass - secrets Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/secrets.py :312
import keyring as kr - secrets (weak) Unlimited-Data-Works-LLC-Email-Triage-cdc278e/tests/test_secrets.py :188
os.environ["TEST_MASTER_KEY"] = master_key
database 143
- db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/actions/hipaa_sent_counter.py :79
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/actions/hipaa_style_distill.py :81
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/actions/sent_mail_capture.py :68
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/actions/sent_mail_index.py :55
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/ai_backends/loader.py :40
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/baa_expiry.py :67
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/backup.py :40
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/cache/classification.py :630
import redis # type: ignore[import-not-found] - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/classify/baa_gate.py :28
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/cli.py :1865
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/_engine.py :51
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/_helpers.py :30
import sqlite3
show 28 more
- db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/_migrate.py :44
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/accounts.py :51
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/audit.py :38
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/reconciliation.py :57
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/style.py :86
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/db/users.py :18
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/embedding_bits/__init__.py :69
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/engine/persistent_counters.py :92
import redis # type: ignore[import-not-found] - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/engine/store.py :33
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/jobs/embedding_reindex.py :53
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/dispatcher.py :149
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/providers/provider_labels.py :47
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/single_flight.py :48
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/style_learning/distill_hipaa.py :51
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/style_learning/per_contact_hipaa.py :83
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/style_learning/trigger_watcher.py :88
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/triage_logging.py :27
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/version.py :37
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/acme_job_state.py :39
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/acme_renewer.py :43
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/app.py :14
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/auth.py :18
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/background_sweepers.py :43
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/daily_health.py :43
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/db.py :10
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/db_writelock.py :57
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/dependencies.py :47
import sqlite3 - db Unlimited-Data-Works-LLC-Email-Triage-cdc278e/src/email_triage/web/email_watches.py :56
import sqlite3
103 more not shown — this panel samples each group; the count above is the real total.
declared dependencies 25
- mcp@>=1.0.0
- pyyaml@>=6.0
- httpx@>=0.27.0
- fastapi@>=0.115.0
- uvicorn@>=0.30.0
- jinja2@>=3.1.0
- python-multipart@>=0.0.9
- itsdangerous@>=2.2.0
- pyjwt@>=2.8.0
- icalendar@>=5.0
- cryptography@>=43.0.0
- s@library, BSD).
show 13 more
- acme@>=2.10
- josepy@>=1.14
- keyring@>=25.0.0
- sqlcipher3-binary@>=0.5.4,<0.6
- aioimaplib@>=1.1.0
- msal@>=1.30.0
- openai@>=1.0.0
- google-generativeai@>=0.8.0
- redis@>=5.0
- sentence-transformers@>=3.0
- pytest@>=8.0
- pytest-asyncio@>=0.24
- pytest-xdist@>=3.5