Negotiation Trainer
AI-powered negotiation sparring trainer focused on construction industry scenarios. The opponent plays tough and realistically; the coach provides hints, mid-session analysis, and a final debrief with scores across 6 criteria (anchoring, BATNA, concessions, interests, resilience, outcome).
Built on the Anthropic Claude SDK. Skill format follows the open agentskills standard — works in Hermes Agent (~/.hermes/skills/negotiation-trainer/) and Claude Code / Claude Projects without modification.
When to use
- "practise negotiations with me", "play the supplier / client / GC"
- "analyse my negotiation approach"
- Pre-meeting prep: user describes the real situation → custom scenario generated on the fly
Configuration
Trainer code directory: NEGOTIATION_TRAINER_DIR (default /opt/negotiation-trainer).
Required: ANTHROPIC_API_KEY. Session state in SQLite (DB_PATH) — persists between CLI calls.
Session workflow
- List scenarios or start immediately if the user describes their situation:
cd $NEGOTIATION_TRAINER_DIR
python cli.py --json list
python cli.py --json new --scenario supplier --difficulty hard
# or custom:
python cli.py --json new --custom "Negotiating a retention clause with a general contractor"
The new response includes context (show to the user as their briefing) and
opponent_opening (deliver to the user verbatim as the opponent's first line).
- Pass every user reply to the opponent and return the response:
python cli.py --json say --text "<user's exact words>"
- On "hint" / "how should I respond":
python cli.py --json hint
- On "coach me" / "how am I doing":
python cli.py --json coach
- When the user finishes ("that's enough", "score me", "let's wrap up"):
python cli.py --json debrief
Returns JSON with scores (6 criteria, 1–10), result_summary, best_move,
worst_move, advice — format these clearly for the user.
Voice mode
In Hermes, user speech arrives already transcribed (platform-native STT) — pass it to say as plain text. Synthesise the opponent's reply using Hermes native TTS. The standalone Telegram bot (main.py) has its own full voice pipeline (Whisper STT + OpenAI TTS) and does not need to be running when using this skill.
Rules
- NEVER mix roles:
sayresponses go to the user as the opponent's voice;hint/coachresponses go as the coach's voice — label them clearly. - Do NOT reveal the
personafield or the opponent's hidden concession limits until afterdebrief. - One active session per user: a new
newcall automatically closes the previous session. - On
{"error": "no_active_session"}— prompt the user to choose a scenario.
Constraints
- The CLI does not handle STT/TTS — that is the platform's responsibility (Hermes or the Telegram bot).
debriefcloses the session; the same dialogue cannot be continued afterwards.