Session Analyst
Pull session data → aggregate patterns → produce a structured report →
optionally hand off to slides/email tools for distribution.
Practice runs, SIP calls, and meeting-bot joins all land as sessions.
Use ttai:list_sessions as the source of truth; ttai:list_sip_calls /
ttai:list_meeting_bots only if you need the live call or bot schedule.
Prerequisites
Load ttai-agent (features/mcp) before any ttai: call (prefix ttai:;
some clients show mcp__ttai__…).
Data model (what a session gives you)
Each session from ttai:list_sessions / ttai:get_sessions_batch includes:
- Identity:
scenario_id, scenario_name, user_name, user_email
- Lifecycle:
status, created_at, completed_at, duration_minutes
evaluation_results: final_score, strengths, weaknesses, and
report_card[] — per-topic {topic, score, note, weight}
improvement_results: improvement_areas, action_items, resources
extraction_results: structured variables (if the scenario extracts them)
transcript_url (signed URL — fetch it for the conversation text) and
analytics_url (human-viewable analysis page)
report_card topics are the backbone of aggregation: they are consistent
within a scenario because they come from its rubric.
Workflow
Step 1: Scope
- Load
ttai-agent/kb/operating-model.md. Reuse a current, verified
workspace context; otherwise call ttai:list_organizations. Team analysis
almost always needs an org_id — pass it on every call, along with
is_org: true on ttai:list_sessions for org-wide data.
- Resolve the scenario:
ttai:list_scenarios if the user gave a name, not
an ID.
- Confirm the window and population: which scenario(s), which date range
(
from_date / to_date), which people (user_email filter), how many
sessions.
Step 2: Pull
ttai:list_sessions with scenario_id, date filters, and pagination
(page, limit). Iterate pages until you have the requested population —
check the page metadata rather than assuming one page is everything.
- Sessions missing
evaluation_results: either exclude them from scoring
aggregates (note the count), or backfill — call ttai:post_process_session
for each, then re-fetch after a wait and check that evaluation_results
appeared. Backfill only when the user needs completeness.
- Deep dives (outliers, disputed scores):
ttai:get_sessions_batch with the
session IDs, then fetch transcript_url contents for the actual
conversation.
Step 3: Aggregate
Compute, at minimum:
- Score distribution: mean, median, range of
final_score; flag the
count of unanalyzed sessions excluded.
- Per-topic breakdown: average
report_card score per topic, weighted by
weight. The lowest topics are the improvement areas.
- Recurring weaknesses: cluster
weaknesses and improvement_areas text
across sessions into themes; count occurrences. Name each theme by the
behavior, not an abstraction ("jumps to price before discovery" beats
"communication issues").
- Trend: score over time if the window is long enough (week buckets work
well); per-person averages for team views.
- Evidence: for each top theme, pull 1-2 short transcript quotes from
representative sessions. Reports without evidence read as opinion.
For org-wide rollups (usage, member breakdown, time series),
ttai:get_analytics with is_org_wide: true complements per-session
aggregation.
Step 4: Report
Use the matching template from
references/report-templates.md:
- Team performance report — "how is my team doing?"
- Scenario health report — "is this scenario working?" (pairs with the
scenario-maker skill when the answer is no)
- Individual coaching report — one person, one skill gap, action items
Always include: population and window, score summary, top 3-5 improvement
areas with evidence, concrete action items, and analytics_url links for
sessions worth reviewing by a human.
Step 5: Distribute (optional)
If the user wants a deck, email, or document, hand the report content to
their connected tools (slides MCP, email MCP, docs). Keep the structure:
one improvement area per slide/section, evidence quote included.
Recipes
"Top 5 improvement areas for scenario X, last 50 sessions"
ttai:list_scenarios (resolve ID) → ttai:list_sessions (scenario_id,
limit 50, org context) → aggregate report_card topics + weakness themes →
Team performance report → deck if asked.
"Pull the 5 lowest-scoring sessions and find out what went wrong"
ttai:list_sessions (scenario_id + window) → sort by
evaluation_results.final_score ascending, take 5 →
ttai:get_sessions_batch → fetch transcripts → diagnose common failure
patterns → if the fault is in the scenario (not the users), hand off to the
scenario-maker skill with the diagnosis.
"How did [person] do this month?"
ttai:list_sessions (user_email + from_date) → per-topic averages, trend
across their sessions → Individual coaching report with action items from
improvement_results.
Automated post-call coaching (webhook-driven)
For teams wiring this into pipelines (e.g. every real sales call gets a
coaching report): see the recipe in
references/report-templates.md —
ttai:create_session ingests an external transcript against a coaching
scenario, ttai:post_process_session triggers analysis, poll until
evaluation_results appears, then format and send the report.
Pitfalls
- Don't average across different scenarios' report cards — topics and
weights differ per rubric. Aggregate per scenario, compare qualitatively.
- Small samples: below ~10 analyzed sessions, report observations, not
statistics — and say so.
- Session status: only
completed sessions have meaningful duration and
results; exclude in_progress and failed from aggregates.
- Privacy: coaching reports name individuals. Confirm the audience before
distributing anything per-person to a group channel.
Key Files
1---2name: session-analyst3description: Analyze Tough Tongue AI sessions — practice, SIP phone calls, and meeting bots — and build reports via the ttai MCP server. Pulls scores, strengths, and weaknesses, aggregates patterns across a team or scenario, and produces structured reports with improvement areas and action items. Use when the user asks "how is my team doing?", "top improvement areas for scenario X", "pull the lowest-scoring sessions", "build me a coaching report", "session trends this month", or wants session data turned into a deck, email, or dashboard.4---56# Session Analyst78Pull session data → aggregate patterns → produce a structured report →9optionally hand off to slides/email tools for distribution.1011Practice runs, SIP calls, and meeting-bot joins all land as **sessions**.12Use `ttai:list_sessions` as the source of truth; `ttai:list_sip_calls` /13`ttai:list_meeting_bots` only if you need the live call or bot schedule.1415## Prerequisites1617Load **ttai-agent** (features/mcp) before any `ttai:` call (prefix `ttai:`;18some clients show `mcp__ttai__…`).1920## Data model (what a session gives you)2122Each session from `ttai:list_sessions` / `ttai:get_sessions_batch` includes:2324- Identity: `scenario_id`, `scenario_name`, `user_name`, `user_email`25- Lifecycle: `status`, `created_at`, `completed_at`, `duration_minutes`26- `evaluation_results`: `final_score`, `strengths`, `weaknesses`, and27 `report_card[]` — per-topic `{topic, score, note, weight}`28- `improvement_results`: `improvement_areas`, `action_items`, `resources`29- `extraction_results`: structured variables (if the scenario extracts them)30- `transcript_url` (signed URL — fetch it for the conversation text) and31 `analytics_url` (human-viewable analysis page)3233`report_card` topics are the backbone of aggregation: they are consistent34within a scenario because they come from its rubric.3536## Workflow3738### Step 1: Scope39401. Load `ttai-agent/kb/operating-model.md`. Reuse a current, verified41 workspace context; otherwise call `ttai:list_organizations`. Team analysis42 almost always needs an `org_id` — pass it on every call, along with43 `is_org: true` on `ttai:list_sessions` for org-wide data.442. Resolve the scenario: `ttai:list_scenarios` if the user gave a name, not45 an ID.463. Confirm the window and population: which scenario(s), which date range47 (`from_date` / `to_date`), which people (`user_email` filter), how many48 sessions.4950### Step 2: Pull5152- `ttai:list_sessions` with `scenario_id`, date filters, and pagination53 (`page`, `limit`). Iterate pages until you have the requested population —54 check the page metadata rather than assuming one page is everything.55- Sessions missing `evaluation_results`: either exclude them from scoring56 aggregates (note the count), or backfill — call `ttai:post_process_session`57 for each, then re-fetch after a wait and check that `evaluation_results`58 appeared. Backfill only when the user needs completeness.59- Deep dives (outliers, disputed scores): `ttai:get_sessions_batch` with the60 session IDs, then fetch `transcript_url` contents for the actual61 conversation.6263### Step 3: Aggregate6465Compute, at minimum:6667- **Score distribution**: mean, median, range of `final_score`; flag the68 count of unanalyzed sessions excluded.69- **Per-topic breakdown**: average `report_card` score per topic, weighted by70 `weight`. The lowest topics are the improvement areas.71- **Recurring weaknesses**: cluster `weaknesses` and `improvement_areas` text72 across sessions into themes; count occurrences. Name each theme by the73 behavior, not an abstraction ("jumps to price before discovery" beats74 "communication issues").75- **Trend**: score over time if the window is long enough (week buckets work76 well); per-person averages for team views.77- **Evidence**: for each top theme, pull 1-2 short transcript quotes from78 representative sessions. Reports without evidence read as opinion.7980For org-wide rollups (usage, member breakdown, time series),81`ttai:get_analytics` with `is_org_wide: true` complements per-session82aggregation.8384### Step 4: Report8586Use the matching template from87[references/report-templates.md](references/report-templates.md):8889- **Team performance report** — "how is my team doing?"90- **Scenario health report** — "is this scenario working?" (pairs with the91 scenario-maker skill when the answer is no)92- **Individual coaching report** — one person, one skill gap, action items9394Always include: population and window, score summary, top 3-5 improvement95areas with evidence, concrete action items, and `analytics_url` links for96sessions worth reviewing by a human.9798### Step 5: Distribute (optional)99100If the user wants a deck, email, or document, hand the report content to101their connected tools (slides MCP, email MCP, docs). Keep the structure:102one improvement area per slide/section, evidence quote included.103104## Recipes105106### "Top 5 improvement areas for scenario X, last 50 sessions"107108`ttai:list_scenarios` (resolve ID) → `ttai:list_sessions` (scenario_id,109limit 50, org context) → aggregate report_card topics + weakness themes →110Team performance report → deck if asked.111112### "Pull the 5 lowest-scoring sessions and find out what went wrong"113114`ttai:list_sessions` (scenario_id + window) → sort by115`evaluation_results.final_score` ascending, take 5 →116`ttai:get_sessions_batch` → fetch transcripts → diagnose common failure117patterns → if the fault is in the scenario (not the users), hand off to the118**scenario-maker** skill with the diagnosis.119120### "How did [person] do this month?"121122`ttai:list_sessions` (user_email + from_date) → per-topic averages, trend123across their sessions → Individual coaching report with action items from124`improvement_results`.125126### Automated post-call coaching (webhook-driven)127128For teams wiring this into pipelines (e.g. every real sales call gets a129coaching report): see the recipe in130[references/report-templates.md](references/report-templates.md) —131`ttai:create_session` ingests an external transcript against a coaching132scenario, `ttai:post_process_session` triggers analysis, poll until133`evaluation_results` appears, then format and send the report.134135## Pitfalls136137- **Don't average across different scenarios' report cards** — topics and138 weights differ per rubric. Aggregate per scenario, compare qualitatively.139- **Small samples**: below ~10 analyzed sessions, report observations, not140 statistics — and say so.141- **Session status**: only `completed` sessions have meaningful duration and142 results; exclude `in_progress` and `failed` from aggregates.143- **Privacy**: coaching reports name individuals. Confirm the audience before144 distributing anything per-person to a group channel.145146## Key Files147148- [../ttai-agent/kb/operating-model.md](../ttai-agent/kb/operating-model.md) — scope and action protocol149- [../ttai-agent/kb/entities/scenario-engine.md](../ttai-agent/kb/entities/scenario-engine.md) — session lifecycle150- [references/report-templates.md](references/report-templates.md) — report formats