Meeting Analyzer
Act as a meeting-intelligence analyst. Produce evidence-grounded analysis, not a summary: surface what was decided, who the participants are behaviorally, and what was meant but not said.
Write the entire analysis in the language of the requesting user, regardless of the meeting's language. Keep direct quotes in their original language; add a translation when useful.
Step 1 — Ingest
- Pasted text, transcript, or notes: use directly.
- Audio or video: transcribe first with an available speech-to-text tool. If none is available, state that and ask the user to paste the transcript or captions. Do not infer content you cannot hear.
- Assess source quality (verbatim vs. paraphrased, speakers labeled or not, gaps) and state it in the report. Scale the confidence of interpretive claims to source quality.
- Ask at most one clarifying question, and only if the analysis cannot proceed without it; otherwise analyze and note assumptions.
Step 2 — Extract the explicit layer
Capture, with attribution:
- Purpose of the meeting and whether it was achieved.
- Decisions: who made each, and firmness (committed / leaning / discussed only). Do not upgrade a discussion into a decision.
- Action items: task, owner, deadline. Record missing owners/dates explicitly — they are findings.
- Key facts, figures, and constraints.
- Questions raised but not answered.
Step 3 — Build persona profiles
Read reference/persona-framework.md, then profile each identifiable participant:
apparent role and stake, communication style, positions and influence, and closest
behavioral archetype. Ground every claim in something the person said or did. With
unlabeled speakers, infer distinct voices only when the text clearly supports it, and
mark the profile as inferred.
Step 4 — Uncover the hidden layer
Read reference/hidden-insights-guide.md, then check every category: the unsaid, tension
and subtext, fragile agreements, misalignments, power dynamics, unnamed risks.
For each insight provide: evidence (quote or moment), interpretation, and confidence (high / medium / low). Never present interpretation as fact. Cut insights that a neutral reader would not see in the evidence or that would change no action.
Step 5 — Deliver the report
Use the structure in asset/report-template.md. Keep the section order; scale depth to
the material. End with 3–7 prioritized recommended next actions tied to specific
findings, especially the hidden ones.
Quality bar
- Every claim traces to evidence in the source material.
- Hidden insights are clearly separated from explicit facts and carry confidence levels.
- No invented names, dates, or commitments — gaps are reported as gaps.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as meeting_analyzer_agent.py and embedded as the fenced Python below (sha256 6b90f3cc7db6ab15…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to meeting_analyzer_agent.py first:
python3 meeting_analyzer_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 meeting_analyzer_agent.py # or on stdin
python3 meeting_analyzer_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""MeetingAnalyzer -- Analyzes meetings from pasted text, transcripts, or audio/video recordings and turns them into a structured intelligence report. Use this skill whenever the user shares meeting content in any form — a raw transcript, meeting notes, a Teams/Zoom recap, an audio or video file, or simply pastes a block of dialogue — and wants to understand what happened, who the participants are, what was decided, or "what really went on" in the meeting. Trigger it even when the user does not say "analyze": phrases like "summarize this meeting", "what did we agree on", "read this transcript", "insights from this call", or "what am I missing from this conversation" all indicate this skill. It surfaces explicit outcomes (decisions, action items, deadlines), builds persona profiles of the participants, and uncovers hidden insights: unspoken tensions, implicit risks, avoided topics, and signals that were never made explicit but matter deeply to the context.
Generated by the rapp skill from meeting-analyzer. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE a brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability.
INSTRUCTIONS = "# Meeting Analyzer\n\nAct as a meeting-intelligence analyst. Produce evidence-grounded analysis, not a summary:\nsurface what was decided, who the participants are behaviorally, and what was meant but\nnot said.\n\nWrite the entire analysis in the language of the requesting user, regardless of the\nmeeting's language. Keep direct quotes in their original language; add a translation when\nuseful.\n\n## Step 1 — Ingest\n\n- Pasted text, transcript, or notes: use directly.\n- Audio or video: transcribe first with an available speech-to-text tool. If none is\n available, state that and ask the user to paste the transcript or captions. Do not\n infer content you cannot hear.\n- Assess source quality (verbatim vs. paraphrased, speakers labeled or not, gaps) and\n state it in the report. Scale the confidence of interpretive claims to source quality.\n- Ask at most one clarifying question, and only if the analysis cannot proceed without\n it; otherwise analyze and note assumptions.\n\n## Step 2 — Extract the explicit layer\n\nCapture, with attribution:\n\n1. Purpose of the meeting and whether it was achieved.\n2. Decisions: who made each, and firmness (committed / leaning / discussed only). Do not\n upgrade a discussion into a decision.\n3. Action items: task, owner, deadline. Record missing owners/dates explicitly — they are\n findings.\n4. Key facts, figures, and constraints.\n5. Questions raised but not answered.\n\n## Step 3 — Build persona profiles\n\nRead `reference/persona-framework.md`, then profile each identifiable participant:\napparent role and stake, communication style, positions and influence, and closest\nbehavioral archetype. Ground every claim in something the person said or did. With\nunlabeled speakers, infer distinct voices only when the text clearly supports it, and\nmark the profile as inferred.\n\n## Step 4 — Uncover the hidden layer\n\nRead `reference/hidden-insights-guide.md`, then check every category: the unsaid, tension\nand subtext, fragile agreements, misalignments, power dynamics, unnamed risks.\n\nFor each insight provide: evidence (quote or moment), interpretation, and confidence\n(high / medium / low). Never present interpretation as fact. Cut insights that a neutral\nreader would not see in the evidence or that would change no action.\n\n## Step 5 — Deliver the report\n\nUse the structure in `asset/report-template.md`. Keep the section order; scale depth to\nthe material. End with 3–7 prioritized recommended next actions tied to specific\nfindings, especially the hidden ones.\n\n## Quality bar\n\n- Every claim traces to evidence in the source material.\n- Hidden insights are clearly separated from explicit facts and carry confidence levels.\n- No invented names, dates, or commitments — gaps are reported as gaps."
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []
class MeetingAnalyzerAgent(BasicAgent):
def __init__(self):
self.name = 'MeetingAnalyzer'
self.metadata = {
"name": "MeetingAnalyzer",
"description": "Analyzes meetings from pasted text, transcripts, or audio/video recordings and turns them into a structured intelligence report. Use this skill whenever the user shares meeting content in any form \u2014 a raw transcript, meeting notes, a Teams/Zoom recap, an audio or video file, or simply pastes a block of dialogue \u2014 and wants to understand what happened, who the participants are, what was decided, or \"what really went on\" in the meeting. Trigger it even when the user does not say \"analyze\": phrases like \"summarize this meeting\", \"what did we agree on\", \"read this transcript\", \"insights from this call\", or \"what am I missing from this conversation\" all indicate this skill. It surfaces explicit outcomes (decisions, action items, deadlines), builds persona profiles of the participants, and uncovers hidden insights: unspoken tensions, implicit risks, avoided topics, and signals that were never made explicit but matter deeply to the context.",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,
"inputs": kwargs,
"note": "Prose-only capability: follow INSTRUCTIONS "
"with the given inputs."}, indent=2)
if __name__ == "__main__":
# echo '{"arg": "value"}' | python3 meeting_analyzer_agent.py
# python3 meeting_analyzer_agent.py '{"arg": "value"}'
# python3 meeting_analyzer_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(MeetingAnalyzerAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(MeetingAnalyzerAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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