Ask all three. Keep what works. A local-first cross-provider council layer for Claude, Codex, and Gemini — one prompt, all three answer, a chairman synthesizes the verdict. No new app, no API key; your transcripts never leave your machine.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio counts 2 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
run_council
-
verify
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 73d491d · analyzer v33 · 4d ago
skills & prompt files 5
- agent-rules keepwhatworks-trinity-73d491d/.codex/agents/ux-designer.toml
- skill keepwhatworks-trinity-73d491d/design-system/SKILL.md
- skill keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/data/skills/trinity/SKILL.md
- skill keepwhatworks-trinity-73d491d/skills/trinity/SKILL.md
- skill keepwhatworks-trinity-73d491d/src/trinity_local/data/skills/trinity/SKILL.md
danger signals4
- dynamic code execution __import__ sink keepwhatworks-trinity-73d491d/tests/test_scripts_embed.py :69
env={**__import__("os").environ, - suspicious endpoint www.google-analytics.com (telemetry) keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/telemetry.py :175
GA4_ENDPOINT = "https://www.google-analytics.com/mp/collect" - suspicious endpoint www.google-analytics.com (telemetry) keepwhatworks-trinity-73d491d/src/trinity_local/telemetry.py :175
GA4_ENDPOINT = "https://www.google-analytics.com/mp/collect" - suspicious endpoint www.google-analytics.com (telemetry) keepwhatworks-trinity-73d491d/tests/test_settings_provider_health_browser.py :548
"https://www.google-analytics.com/mp/collect"
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 1063
filesystem 381
- fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/adapters.py :13
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/agent_emit.py :45
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/ask.py :161
with (d / "exploration_routes.jsonl").open("a", encoding="utf-8") as f: - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/capture_host.py :27
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/cold_start.py :29
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/config_cmd.py :25
import shutil - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/council.py :7
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/dream.py :327
for line in path.open(encoding="utf-8"): - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/eval.py :561
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/eval_import.py :21
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/extension_repair.py :36
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/helpers.py :5
from pathlib import Path
show 28 more
- fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/import_export.py :32
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/install.py :7
import shutil - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/lens_import.py :28
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/me_card.py :14
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/portal.py :17
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/provider_import.py :20
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/update.py :35
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/verify.py :13
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/config.py :6
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/core_gate.py :65
import pathlib - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/council_review.py :5
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/council_runner.py :7
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/council_runtime.py :4
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/council_status.py :91
return False # can't tell when it last updated → fail open (keep running) - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/disagreement_ledger.py :36
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/dispatch_health.py :101
with path.open("r", encoding="utf-8") as f: - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/dispatch_ledger.py :38
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/dissent_outcome.py :47
import pathlib - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/distill.py :23
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/drift.py :19
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/embedder_wizard.py :38
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/embeddings/backend_mlx.py :26
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/embeddings/backend_mlx_native.py :23
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/evals/baseline_floor.py :34
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/evals/builder.py :51
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/evals/judge_alignment.py :37
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/evals/public_datasets.py :44
from pathlib import Path - fs keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/evals/runner.py :17
from pathlib import Path
341 more not shown — this panel samples each group; the count above is the real total.
shell / exec 124
- shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/adapters.py :11
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/capture_host.py :499
dirs. Bare ``subprocess.run(["trinity-local", ...])`` PATH lookup - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/update.py :33
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/council_runner.py :75
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/embedder_wizard.py :35
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/health_checks.py :248
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/local_models.py :27
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/notifications.py :17
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/providers.py :6
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/runtime_env.py :4
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/skill_loop.py :54
import subprocess - shell keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/verify.py :36
import subprocess
show 28 more
- shell (weak) keepwhatworks-trinity-73d491d/scripts/_runtime.py :46
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/scripts/browser_smoke.py :119
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/scripts/check_generated_js.py :30
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/scripts/coverage_disclosure.py :24
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/scripts/inject_ga4_credentials.py :30
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/scripts/render_docs.py :29
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/adapters.py :11
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/capture_host.py :499
dirs. Bare ``subprocess.run(["trinity-local", ...])`` PATH lookup - shell keepwhatworks-trinity-73d491d/src/trinity_local/commands/update.py :33
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/council_runner.py :75
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/embedder_wizard.py :35
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/health_checks.py :248
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/local_models.py :27
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/notifications.py :17
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/providers.py :6
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/runtime_env.py :4
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/skill_loop.py :54
import subprocess - shell keepwhatworks-trinity-73d491d/src/trinity_local/verify.py :36
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/tests/test_antigravity_model_pinned.py :14
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/tests/test_background_capture_store.py :18
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/tests/test_background_provider_thread_url.py :25
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/tests/test_background_sender_gate.py :31
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/tests/test_browser_extension_chatgpt_adapter.py :18
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/tests/test_browser_extension_claude_adapter.py :18
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/tests/test_browser_extension_gemini_adapter.py :23
import subprocess - shell (weak) keepwhatworks-trinity-73d491d/tests/test_capture_host_dispatch_argv_safe.py :10
`["--<arg>", str(value)]` per allowlisted field, then `subprocess.Popen(argv)` / - shell (weak) keepwhatworks-trinity-73d491d/tests/test_capture_host_error_no_leak_browser.py :88
import subprocess as real_subprocess - shell (weak) keepwhatworks-trinity-73d491d/tests/test_capture_host_stdio.py :20
import subprocess
84 more not shown — this panel samples each group; the count above is the real total.
network 16
- net keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/portal.py :18
from urllib.parse import quote - net keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/core_gate.py :382
import urllib.request as _url - net keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/telemetry.py :696
import urllib.error - net (weak) keepwhatworks-trinity-73d491d/scripts/browser_smoke.py :123
import urllib.error - net keepwhatworks-trinity-73d491d/src/trinity_local/commands/portal.py :18
from urllib.parse import quote - net keepwhatworks-trinity-73d491d/src/trinity_local/core_gate.py :382
import urllib.request as _url - net keepwhatworks-trinity-73d491d/src/trinity_local/telemetry.py :696
import urllib.error - net (weak) keepwhatworks-trinity-73d491d/tests/test_browser_extension_gemini_adapter.py :268
import urllib.parse - net (weak) keepwhatworks-trinity-73d491d/tests/test_capture_host_no_network.py :5
If anyone adds ``requests``/``httpx``/``urllib.request`` etc. to that - net (weak) keepwhatworks-trinity-73d491d/tests/test_council_live_heading_outline_browser.py :36
import urllib.parse - net (weak) keepwhatworks-trinity-73d491d/tests/test_gstack_patterns.py :404
"urllib.request.urlopen", - net (weak) keepwhatworks-trinity-73d491d/tests/test_launchpad_evidence_chip_opens_council_browser.py :37
from urllib.parse import urljoin
show 4 more
- net (weak) keepwhatworks-trinity-73d491d/tests/test_live_council_320px_token_overflow_browser.py :361
from urllib.parse import quote - net (weak) keepwhatworks-trinity-73d491d/tests/test_live_council_task_no_double_render_browser.py :35
from urllib.parse import quote - net (weak) keepwhatworks-trinity-73d491d/tests/test_memory_viewer_degraded_trust_label_contrast_browser.py :172
from urllib.parse import unquote, urlparse - net (weak) keepwhatworks-trinity-73d491d/tests/test_serve_no_cache_html.py :14
import socket
secrets 3
- secrets keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/telemetry.py :639
api_secret = os.environ.get("TRINITY_GA4_API_SECRET", "").strip() - secrets (weak) keepwhatworks-trinity-73d491d/scripts/inject_ga4_credentials.py :63
sec = os.environ.get("TRINITY_GA4_API_SECRET", "").strip() - secrets keepwhatworks-trinity-73d491d/src/trinity_local/telemetry.py :639
api_secret = os.environ.get("TRINITY_GA4_API_SECRET", "").strip()
tool registrations 4
- run_council keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/mcp_server.py :144
- verify keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/mcp_server.py :330
- run_council keepwhatworks-trinity-73d491d/src/trinity_local/mcp_server.py :144
- verify keepwhatworks-trinity-73d491d/src/trinity_local/mcp_server.py :330
declared dependencies 9
- mcp@>=1.0
- numpy@>=1.26
- pytest@>=7
- pyflakes@>=3
- Pillow@>=10
- mlx@>=0.20; platform_system ==
- and@platform_machine ==
- Darwin@*
- arm64@*
clipboard 7
- clipboard shell call keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/eval_import.py :60
"`eval-prompt | pbcopy` lands a clean paste." - clipboard shell call keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/commands/lens_import.py :77
"common `lens-prompt | pbcopy` flow lands a clean paste." - clipboard shell call keepwhatworks-trinity-73d491d/plugins/trinity-local/engine/trinity_local/launchpad_template.py :2409
@click.stop="copyText('trinity-local lens-prompt | pbcopy', 'lens-prompt-copy')"> - clipboard shell call keepwhatworks-trinity-73d491d/src/trinity_local/commands/eval_import.py :60
"`eval-prompt | pbcopy` lands a clean paste." - clipboard shell call keepwhatworks-trinity-73d491d/src/trinity_local/commands/lens_import.py :77
"common `lens-prompt | pbcopy` flow lands a clean paste." - clipboard shell call keepwhatworks-trinity-73d491d/src/trinity_local/launchpad_template.py :2409
@click.stop="copyText('trinity-local lens-prompt | pbcopy', 'lens-prompt-copy')"> - clipboard shell call keepwhatworks-trinity-73d491d/tests/test_launchpad_lens_empty_state.py :29
assert "trinity-local lens-prompt | pbcopy" in html