Skip to content

Triangulator Skill Build — March 27, 2026

Overview

Built the LLM triangulator skill from the ground up. Started with "how do I enable the triangulate skill?" and evolved into a fully architected multi-provider system with 7 LLM providers, a shared API key vault, tagged model registry with auto-refresh, credit monitoring, and a smart model-selection UX. Then spent significant time debugging cross-session path resolution issues, ultimately solving it by baking all config into the .skill package itself.

Key Decisions

  • Shared API key vault (api-keys.json) rather than per-skill key duplication — any future skill reads from the same file
  • Tagged model registry (model-registry.json) with capability tags, tier, speed, and cost — drives auto-recommendations
  • 7 providers configured: Anthropic, OpenAI, Google, xAI, DeepSeek, Mistral, Together AI
  • Dynamic model selection: auto-picks the best model per provider based on query type (reasoning/coding/creative/research) and depth (quick/standard/deep)
  • Auto-refresh via scheduled task: weekly model registry update pulls from provider APIs + web search
  • Daily credit monitoring: balance checker runs at 8am, alerts when any provider drops below configurable threshold
  • Together AI added for Llama 4 Maverick + gateway for future image/video critique skill
  • Claude queried via API (not inline) so all models are independent and truly comparable; session Claude acts as neutral synthesizer
  • Self-contained .skill package (v5): API keys, config, model registry, and query script baked directly into the skill. Eliminates dependency on folder selection. This was the final fix after extensive debugging.

Debugging History (Cross-Session Path Resolution)

This consumed a large portion of the conversation. The core problem: new Cowork sessions couldn't find the triangulator config files despite them existing on Brian's Mac.

Root causes identified and fixed: 1. Files in /mnt/.claude/ don't persist between sessions — moved to ~/Documents/Claude/triangulator/ 2. Hardcoded session IDs in query script — replaced with dynamic _discover_paths() function 3. /mnt/ is not a valid absolute path — must be resolved via $(pwd)/mnt/ or /sessions/[id]/mnt/ 4. Two-step discovery in SKILL.md was fragile — new session Claudes didn't always execute the bash discovery before checking for files 5. The old query script copy in .claude/ had stale path discovery while the Documents copy had the updated version

Final solution: Bake everything into the .skill package. Installed skills always persist at .claude/skills/llm-triangulator/ regardless of folder selection. The query script searches its sibling config/ directory first, then falls back to Documents and other locations. Added --diagnose flag for future debugging.

Key lesson: Each Cowork session is fully isolated. Claude cannot iterate across sessions — cross-session testing requires the user to go back and forth. Design for zero-configuration by baking everything into the skill package.

Action Items

  • [pending] Test first live triangulation (must be from a real Cowork session, not sandbox)
  • [pending] Image/video critique skill — scoping as next project
  • [done] All 7 provider API keys configured
  • [done] Weekly model refresh scheduled (Mondays 9am)
  • [done] Daily balance check scheduled (daily 8am)
  • [done] Context manager set up and first session saved
  • [done] Cross-session path resolution fixed (v5 self-contained .skill)
  • [done] Added --diagnose flag to query script for future debugging

Files

  • Installed skill: .claude/skills/llm-triangulator/ (SKILL.md, config/, scripts/)
  • Secondary copy: ~/Documents/Claude/triangulator/ (full set including balance-checker.py, refresh-model-registry.py)
  • Packaging workspace: /sessions/[id]/llm-triangulator/ (used for building .skill files, session-local)

Tags: llm-triangulator, skill-building, api-setup, model-registry, architecture, multi-llm, balance-monitoring, debugging, path-resolution, self-contained-skill