github Python analyzed a5efa89

mostlyharmless-ai/watercooler

github

Watercooler: your team's shared reasoning layer for agentic coding. Preserve the "why" around your code.

maintainer
mostlyharmless-ai
license
Apache-2.0
first seen
2026-07-04
last seen
2026-07-22
releases · 30d
4
short id

Drift inferred · capture-to-capture

  1. HIGH code analysis flagged committed secret ×2, dynamic code execution ×2 in mostlyharmless-ai/watercooler
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 a5efa89 · analyzer v28 · 1d ago

skills & prompt files 21

danger signals4

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

code files: 447

filesystem 104

  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/agents.py :8 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/analysis_lib.py :19 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/annotations.py :23 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/export.py :11 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/parser.py :14 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/pipeline/__main__.py :12 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/pipeline/config.py :4 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/pipeline/runner.py :6 import shutil
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/pipeline/state.py :12 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/projector.py :20 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/reader.py :22 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/search.py :22 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/storage.py :24 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/sync.py :50 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/writer.py :21 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/belief_candidate.py :45 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/blessed_projection.py :27 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/cli.py :14 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/commands.py :4 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/commands_graph.py :25 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/config_facade.py :39 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/config_loader.py :26 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/config_schema.py :12 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/credentials.py :22 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/fs.py :4 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/learning_extraction.py :25 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/lock.py :6 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/metrics/orchestration.py :34 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/migration/_orphan.py :13 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/migration/checkpoint.py :10 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/migration/cli.py :7 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/migration/t1.py :16 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/migration/t2.py :31 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/models.py :38 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/path_resolver.py :15 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/project_coordinator_lib.py :20 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/promotion.py :206 # deliberately non-terminal — the candidate stays open (§5.4).
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/pulse_report_lib.py :40 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/pulse_snapshot_lib.py :29 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/role_loader.py :15 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/role_salience_lib.py :33 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/roles_scaffold.py :22 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/slack_cli.py :10 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/stop_hook.py :40 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/sync_common.py :16 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/sync_repair.py :21 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/testing.py :32 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/thread_entries.py :33 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler/write_guard.py :43 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/audit/egress_inventory.py :52 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/auth/scope.py :39 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/config.py :4 import shutil
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/__init__.py :24 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/auditor.py :21 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/committer.py :32 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/daemon_write.py :19 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/decision_detector.py :19 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/decision_extractor.py :18 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/decision_extractor_reset.py :14 import shutil
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/decision_stance.py :22 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/enrich_supersession.py :18 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/findings_source.py :17 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/hosted_coordinator.py :20 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/hosted_worktree.py :24 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/learnings.py :31 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/project_coordinator.py :18 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/role_salience.py :15 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/state.py :24 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/sync_guard.py :20 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/t2_health_probe.py :28 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/deployment_profile.py :30 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/federation/resolver.py :12 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/handoff_receipts.py :25 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/health_probe.py :27 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/helpers.py :14 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/memory.py :12 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/memory_queue/__init__.py :19 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/memory_queue/checkpoint.py :15 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/memory_queue/queue.py :16 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/memory_sync.py :23 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/observability.py :52 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/premium_client.py :19 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/proxy_guard.py :50 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/server.py :15 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/setup_report.py :23 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/slack/mapping.py :17 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/slack/sync.py :20 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/startup.py :14 import shutil
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/sync/__init__.py :13 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/sync/file_lock.py :22 with open(findings_path, "a") as f:
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/sync/primitives.py :22 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/t1_hybrid.py :19 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/daemon.py :16 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/decisions.py :16 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/diagnostic.py :15 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/graph.py :20 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/memory.py :26 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/migration.py :18 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/promotion.py :17 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/roles.py :23 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/setup.py :18 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/thread_query.py :17 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/thread_write.py :16 from pathlib import Path
  • fs mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/validation.py :19 from pathlib import Path

shell / exec 11

  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler/cli.py :9 import subprocess
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler/path_resolver.py :26 """Git repository information from subprocess git calls.
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler/sync_common.py :13 import subprocess
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler/sync_repair.py :18 import subprocess
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler/write_guard.py :42 import subprocess
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/auth/scope.py :313 import subprocess
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/config.py :5 import subprocess
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/hosted_worktree.py :20 import subprocess
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/startup.py :16 import subprocess
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/diagnostic.py :12 import subprocess
  • shell mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/graph.py :2648 import subprocess as _sp

network 23

  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/pipeline/runner.py :440 import httpx
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/summarizer.py :207 import httpx
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/sync.py :361 import httpx
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler/memory_config.py :20 from urllib.parse import urlparse
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler/path_resolver.py :379 from urllib.parse import urlparse as _urlparse
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler/slack_cli.py :56 import urllib.request
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/audit/egress_inventory.py :91 "httpx.get",
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/auth/__init__.py :41 import urllib.parse
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/auth/hmac_resolver.py :110 from urllib.parse import urlsplit
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/cache.py :40 import urllib.request
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/capability_auth.py :18 import urllib.error
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/daemons/llm_client.py :40 from urllib.parse import urlparse
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/github_api.py :39 import urllib.error
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/hosted_ops.py :28 import urllib.error
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/hosted_semantic.py :33 from urllib.parse import urlparse
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/middleware.py :78 import httpx
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/premium_client.py :139 The ``mcp`` SDK raises ``httpx.HTTPStatusError`` (which carries a
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/server_http.py :399 # ``httpx.Client``. A direct call from this ``async def`` would
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/slack/client.py :16 import urllib.request
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/slack/notify.py :12 import urllib.request
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/slack/token_service.py :26 import urllib.request
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/startup.py :15 import socket
  • net mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/tools/diagnostic.py :295 import socket as _socket

secrets 13

  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler/agents.py :4 import getpass
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/pipeline/config.py :33 return os.environ.get("LLM_API_KEY", "")
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler/baseline_graph/summarizer.py :1207 if os.environ.get("BASELINE_GRAPH_API_KEY"):
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler/cli.py :1195 import getpass
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler/credentials.py :547 env_token = os.getenv("GITHUB_TOKEN") or os.getenv("GH_TOKEN")
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler/lock.py :3 import getpass
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler/memory_config.py :473 key = os.getenv("GEMINI_API_KEY")
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler/migration/cli.py :103 env_value = os.environ.get("FALKORDB_PASSWORD", "")
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/auth/__init__.py :670 "token_api_key": os.getenv("WATERCOOLER_TOKEN_API_KEY", ""),
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/cache.py :358 self._api_key = api_key or os.getenv("WATERCOOLER_TOKEN_API_KEY", "")
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/config.py :933 "bot_token": os.getenv("WATERCOOLER_SLACK_BOT_TOKEN", slack.bot_token),
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/hosted_ops.py :1398 return os.getenv("WATERCOOLER_SLACK_SYNC_SECRET", "")
  • secrets mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/slack/token_service.py :63 "token_api_key": os.getenv("WATERCOOLER_TOKEN_API_KEY", ""),

database 2

  • db mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/memory_sync.py :121 from redis.exceptions import (
  • db mostlyharmless-ai-watercooler-a5efa89/src/watercooler_mcp/server_http.py :1566 # connection-failure exceptions from redis/socket libs

declared dependencies 24

  • fastmcp@>=3.0,<4
  • python-ulid@>=2.0
  • GitPython@>=3.1.0
  • pydantic@>=2.0
  • tomli@>=2.0;python_version<
  • pytest@>=7.0
  • mypy@>=1.0
  • jsonschema@>=4.0
  • tqdm@>=4.0
  • setuptools@>=61.0
  • litellm@>=1.0
  • docker@>=7.0
  • datasets@>=2.0
  • swebench@>=1.0,<2
  • jieba@>=0.42.1
  • rapidfuzz@>=3.10.1
  • umap-learn@>=0.5.6
  • openhands-sdk@>=1.0,<2; python_version >=
  • 3.12@*
  • fastapi@>=0.100
  • httpx@>=0.25
  • huggingface_hub@>=0.20
  • pyvis@>=0.3.0
  • networkx@>=3.0

transport_posture 2

  • network-listening, binds all interfaces, no auth detected mostlyharmless-ai-watercooler-a5efa89/tests/integration/test_config_integration.py :23 host = "0.0.0.0"
  • network-listening, binds all interfaces, no auth detected mostlyharmless-ai-watercooler-a5efa89/tests/unit/test_startup_services.py :1689 """Host='::' must probe (AF_INET6, '::'), not (AF_INET, '0.0.0.0').