Claude Drama Triangle Coach
Two hooks, one trigger. During the call, Claude fires a quiet macOS notification with a one-line reframe when you slip into a Karpman Drama Triangle role (Victim, Persecutor, Rescuer). After transcription completes, a separate observer pass writes a per-teammate analysis with concrete strategies for engaging each person going forward.
A Tuple trigger that runs Claude Code against your live call to surface Karpman Drama Triangle dynamics — Victim, Persecutor, Rescuer — and nudge you toward the empowered alternatives: Creator, Challenger, Coach.
Two hooks, one trigger directory:
call-transcription-started— the in-call coach. Listens to your own lines in the live transcript and fires a quiet macOS notification with a one-line reframe when you slip into a drama role. Silent by default; only speaks when confident.call-transcription-complete— the post-call observer. Reads the full transcript after the call ends and produces a wholesale evaluation indrama-evaluation.md: per-teammate drama profiles, hook moments, and concrete playbooks for how to work with each person going forward. Notifies you when the analysis is ready.
The Drama Triangle framework is embedded into both system prompts. You do not need any Claude skill installed for this trigger to work — drop the folder in and go.
What each hook does
In-call coach (started hook)
While you're talking:
- Subscribes to the merged Tuple transcription stream so it wakes on new lines (no polling).
- Maps participant IDs to names once via
tuple state, then watches only the lines attributed to you. - On each new line, checks against the Drama Triangle markers in the system prompt.
- When confidence is high (≥90%) and cooldown has elapsed, fires a macOS notification via
osascript:- Title:
Drama Triangle Coach — Victim/… — Persecutor/… — Rescuer - Body: a one-line reframe you could say next (≤90 chars)
- Title:
- Logs every fired notification to its terminal so you have an audit trail when you alt-tab.
It does not post anywhere external. It does not speak in the call. Its terminal is yours alone.
Post-call observer (complete hook)
When transcription completes and the call is actually over (it skips mid-call toggles):
- Reads every
transcriptions.jsonlandevents.jsonlin the call's artifact directory. - Runs Claude headless (
claude --print) with the observer system prompt. - Writes a markdown evaluation to
drama-evaluation.mdin the call root with:- Per-participant profile — primary roles each person played, hooks they bit on or offered, where they showed up empowered.
- Hook moments — chronological list of the 3–6 most consequential moments where the conversation tipped toward or away from the triangle, with quotes.
- "How to engage
next time" — for each teammate who showed a recurring pattern: strategies, phrases that land, phrases to avoid, what they seem to need under the drama. - What I'd practice before the next call with this group — up to 3 specific reframes in your voice.
- A
SUMMARY:line at the end (≤120 chars) for the notification body.
- Fires a macOS notification when the file is ready. With
terminal-notifierinstalled, the notification is click-to-open; otherwise it shows the path.
The observer is one-shot, headless, no terminal. It runs in the background; you get a notification when it's done.
What stays silent (in-call coach)
- Anything below ~90% confidence.
- Anything inside the cooldown window (default: 3 minutes between notifications).
- More than 5 notifications per call.
- The other party's drama in real time. The in-call coach is a self-coaching tool; teammate dynamics are the observer's job.
- Venting, jokes, quoting someone else, self-aware naming of the pattern.
Prerequisites
- macOS — uses
open/Ghostty.appandosascriptfor notifications. Optionallyterminal-notifierfor click-to-open. - Claude Code:
npm install -g @anthropic-ai/claude-code - The
tupleCLI — ships with Tuple. - A Whisper model configured in Tuple for live transcription. Email
support@tuple.appif you need local transcription enabled for your team. - Notification permission for the AppleScript runner. The first time a notification tries to fire, macOS will prompt — accept it, otherwise the call is silent.
No MCP servers needed. No external accounts. No outbound network traffic from the coach itself.
Installation
Drop this directory into your Tuple triggers folder:
- Production:
~/.tuple/triggers/claude-drama-triangle-coach/ - Staging:
~/.tuplestaging/triggers/claude-drama-triangle-coach/
Both hooks fire automatically — the started hook the next time you start transcription, the complete hook when transcription stops at the end of a call.
How the in-call coach works
When call-transcription-started fires:
- Detects which Tuple environment (
prod,staging,dev) owns the call by probing each daemon'sstatefor a matching call ID, and exportsTUPLE_ENVso everytupleCLI call inside Claude scopes to the right daemon. - Copies
system-prompt.mdinto the call's artifact directory. If you have~/.tuple/identity.md(or the staging equivalent), it's appended so Claude knows whose voice to coach — but the trigger works fine without it. - Inlines the last 100 lifecycle events and last 100 transcript lines into the initial prompt so Claude has context if it joins mid-call.
- Opens a terminal (Ghostty if installed, otherwise the system
.commandhandler) running Claude Code inside the call's artifact directory.
If transcription stops and restarts mid-call, the trigger sees the live PID file and exits — the existing session's subscription picks up the resumed stream without restarting.
How the post-call observer works
When call-transcription-complete fires:
- Sleeps briefly, then probes each daemon for an active call matching this call ID. If the call is still active, transcription was toggled mid-call — the observer exits and lets the in-call coach handle the eventual real end. Only proceeds when the call is genuinely over.
- Checks that
transcriptions.jsonlfiles actually exist on disk. If you toggled transcription on and back off without anyone speaking, the observer exits. - Optionally appends
~/.tuple/identity.mdto the observer prompt for personal grounding. - Runs
claude --printheadless with the observer system prompt and a user prompt that points at the call root. - Claude reads the transcripts and writes
drama-evaluation.mdin the call root. - The script extracts the
SUMMARY:line and fires a macOS notification ("Drama Triangle Coach — analysis ready") with that summary in the body. Withterminal-notifierinstalled, clicking opens the file.
Identity (optional)
If you want either hook to personalize, drop a single file at ~/.tuple/identity.md (or ~/.tuplestaging/identity.md):
# Identity
You're coaching [Your Name]. [One-liner about how they tend to land in the triangle —
e.g. "defaults to Rescuer with their direct reports", "slips into Victim on vendor
calls", "tends to villainize sales when prioritization disagreements come up".]
Both hooks read it. Both work fine without it.
Tuning the behavior
In-call coach (system-prompt.md)
- Watch the other party too. Remove the "only evaluate the user's own lines" constraint in the Setup section if you also want real-time notifications about drama being done to you. Increases noise — be aware this risks turning the coach into a teammate-villainizing tool.
- Tighten or loosen the confidence threshold. Default 90%+ to fire.
- Cooldown / per-call cap. Default 180s between notifications, max 5 per call.
- Notification style. Swap
osascriptforterminal-notifierin the Notification format section if you have it installed. - Stream interval. 30s keeps wake rate low at the cost of ~30s lag; drop to
10sfor snappier reactions.
Post-call observer (observer-system-prompt.md)
- Output structure. Edit the "evaluation structure" markdown template directly. Add or drop sections — the launching script only requires the final
SUMMARY:line. - Tone. The default is terse and concrete with required quotes. If you want softer or more coaching-style language, edit the Calibration section.
Acknowledgments
The Drama Triangle framework is Stephen Karpman's. The Creator / Challenger / Coach reframe (TED — The Empowerment Dynamic) is David Emerald's. This trigger just listens for the markers and nudges you toward the better stance — in the moment, and after the fact.