Compare commits
2 Commits
03cc8c797a
...
864038a60e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
864038a60e | ||
|
|
8c4b32df08 |
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: init-greyhaven
|
||||
description: Build comprehensive Greyhaven business documentation by analyzing meetings and Zulip threads via DataIndex API, using parallel subagents to extract business context, positioning, product details, and open items from authoritative sources (Corey Gallon, Max, Jordan).
|
||||
description: Build comprehensive Greyhaven business documentation by analyzing Reflector meeting transcripts and Zulip threads from the last 4 months via DataIndex API, using parallel subagents to extract business context, positioning, product details, and open items from authoritative sources (Corey Gallon, Max, Jordan). Only Zulip threads and Reflector transcripts are used.
|
||||
user-invocable: true
|
||||
---
|
||||
|
||||
@@ -8,7 +8,7 @@ user-invocable: true
|
||||
|
||||
## What I do
|
||||
|
||||
- Query DataIndex for all-hands meetings and Greyhaven-related Zulip threads from the last 3 months
|
||||
- Query DataIndex for all-hands meetings and Greyhaven-related Zulip threads from the last 4 months (only Zulip threads and Reflector transcripts)
|
||||
- Launch parallel subagents to analyze transcripts and threads for Greyhaven/data-sovereignty content
|
||||
- Synthesize findings into a structured business document covering vision, positioning, product, marketing, and open items
|
||||
- Prioritize statements from **Corey Gallon**, **Max**, and **Jordan (jordan@monadical.com)**
|
||||
@@ -23,22 +23,48 @@ Use this when you need to create or update comprehensive company documentation f
|
||||
- ContactDB for resolving participant names
|
||||
- Subagent capability for parallel analysis
|
||||
|
||||
## Data Sources (Explicit Connector Requirements)
|
||||
|
||||
This skill ONLY uses these two connectors - do not query any others:
|
||||
|
||||
| Connector | Entity Type | Use For |
|
||||
|-----------|-------------|---------|
|
||||
| `reflector` | `meeting` | Meeting recordings with transcripts |
|
||||
| `zulip` | `threaded_conversation` | Zulip topic threads |
|
||||
|
||||
**⚠️ NEVER use:** `ics_calendar`, `mbsync_email`, `hedgedoc`, `babelfish`, `browser_history`, or other connectors.
|
||||
|
||||
## Workflow
|
||||
|
||||
### Step 1: Query all-hands meetings
|
||||
|
||||
Query DataIndex for all-hands meetings from the last 3 months.
|
||||
### Step 1: Query Reflector all-hands meetings
|
||||
|
||||
**REQUIRED QUERY PATTERN:**
|
||||
```
|
||||
GET /dataindex/api/v1/query
|
||||
?entity_types=meeting
|
||||
&connector_ids=reflector
|
||||
&date_from={3_months_ago}
|
||||
&room_name=allhands
|
||||
&date_from={4_months_ago}
|
||||
&date_to={today}
|
||||
&limit=100
|
||||
```
|
||||
|
||||
Filter for meetings where `room_name="allhands"`.
|
||||
**Entity type:** `meeting`
|
||||
**Connector:** `reflector` (MUST be specified)
|
||||
**Room filter:** `room_name=allhands` (MUST be specified - only all-hands meetings)
|
||||
**Date range:** Last 4 months (120 days)
|
||||
|
||||
**Key fields to extract:**
|
||||
- `transcript` - Full meeting transcript text
|
||||
- `summary` - AI-generated summary
|
||||
- `room_name` - Should be "allhands" (verified by filter)
|
||||
- `participants` - List of attendees
|
||||
- `start_time`, `end_time` - Meeting timestamps
|
||||
|
||||
**⚠️ CRITICAL:**
|
||||
- Only use `connector_ids=reflector`
|
||||
- MUST filter by `room_name=allhands` - this ensures we only get company all-hands meetings
|
||||
- Never use other meeting sources or other room types
|
||||
|
||||
### Step 2: Fetch full meeting transcripts
|
||||
|
||||
@@ -73,22 +99,36 @@ Return JSON:
|
||||
|
||||
Launch all subagents simultaneously.
|
||||
|
||||
### Step 4: Query Zulip threads
|
||||
### Step 4: Query Zulip threaded conversations
|
||||
|
||||
**REQUIRED QUERY PATTERN:**
|
||||
```
|
||||
GET /dataindex/api/v1/query
|
||||
?entity_types=threaded_conversation
|
||||
&connector_ids=zulip
|
||||
&date_from={3_months_ago}
|
||||
&date_from={4_months_ago}
|
||||
&date_to={today}
|
||||
&limit=100
|
||||
```
|
||||
|
||||
Target streams:
|
||||
**Entity type:** `threaded_conversation` (NOT `conversation` or `conversation_message`)
|
||||
**Connector:** `zulip` (MUST be specified)
|
||||
**Date range:** Last 4 months (120 days)
|
||||
|
||||
**Why `threaded_conversation`:**
|
||||
- Represents a **Zulip topic thread** (grouped messages under a topic)
|
||||
- Contains `recent_messages` with full thread content
|
||||
- Better for analysis than individual `conversation_message` entities
|
||||
|
||||
**High-priority streams to search:**
|
||||
- `[greyhaven] marketing` (stream 212)
|
||||
- `[greyhaven] branding` (stream 206)
|
||||
- `[greyhaven] leads` (stream 208)
|
||||
- `InternalAI` (stream 193)
|
||||
- `engineering` - selfhostyour.tech topic
|
||||
- `bizdev + marketing`
|
||||
|
||||
**⚠️ CRITICAL:** Only use `connector_ids=zulip` and `entity_types=threaded_conversation`. Never use other chat connectors like `babelfish`.
|
||||
|
||||
### Step 5: Filter threads by relevance
|
||||
|
||||
@@ -158,6 +198,49 @@ Remove any temporary JSON or transcript files created during analysis.
|
||||
- **Empty thread:** Mark as low relevance, skip
|
||||
- **API failures:** Retry with backoff, continue with available data
|
||||
|
||||
## Query Patterns Summary
|
||||
|
||||
**EXACT API CALLS TO MAKE:**
|
||||
|
||||
### For Reflector all-hands meetings:
|
||||
```python
|
||||
dataindex_query_entities(
|
||||
entity_types="meeting",
|
||||
connector_ids="reflector",
|
||||
room_name="allhands", # MUST filter for all-hands only
|
||||
date_from="2024-10-19T00:00:00Z", # 4 months ago
|
||||
date_to="2025-02-19T23:59:59Z", # today
|
||||
limit=100
|
||||
)
|
||||
```
|
||||
|
||||
Then for each meeting ID:
|
||||
```python
|
||||
dataindex_get_entity_by_id(
|
||||
entity_id="reflector:{meeting_id}",
|
||||
max_content_length=null # Get full transcript
|
||||
)
|
||||
```
|
||||
|
||||
### For Zulip threads:
|
||||
```python
|
||||
dataindex_query_entities(
|
||||
entity_types="threaded_conversation", # MUST be threaded_conversation
|
||||
connector_ids="zulip", # MUST be zulip
|
||||
date_from="2024-10-19T00:00:00Z", # 4 months ago
|
||||
date_to="2025-02-19T23:59:59Z", # today
|
||||
limit=100
|
||||
)
|
||||
```
|
||||
|
||||
Then for each thread ID:
|
||||
```python
|
||||
dataindex_get_entity_by_id(
|
||||
entity_id="zulip:{thread_id}",
|
||||
max_content_length=null # Get full thread content
|
||||
)
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
- [dataindex](../dataindex/SKILL.md) — entity querying
|
||||
|
||||
406
.agents/skills/internalai-business-context/SKILL.md
Normal file
406
.agents/skills/internalai-business-context/SKILL.md
Normal file
@@ -0,0 +1,406 @@
|
||||
---
|
||||
name: internalai-business-context
|
||||
description: Generate business context updates for InternalAI meetings. Fetches the latest InternalAI meeting (or specified meeting ID), analyzes participant contributions, researches business context via DataIndex, and creates a concise business update document with 1-week priorities. Requires Greyhaven_Company_Documentation.md in repo root.
|
||||
user-invocable: true
|
||||
argument-hint: [meeting_id]
|
||||
---
|
||||
|
||||
# InternalAI Business Context Update
|
||||
|
||||
Generate a business context update document for InternalAI meetings, connecting technical discussions to Greyhaven's strategic mission.
|
||||
|
||||
## What I do
|
||||
|
||||
- Fetch the latest InternalAI meeting transcript (or use specified meeting ID)
|
||||
- Extract participant talking points and work items
|
||||
- Research business context for each participant via DataIndex (last 30 days)
|
||||
- Synthesize findings into a concise business update document
|
||||
- Map work to Greyhaven's strategic pillars and revenue goals
|
||||
|
||||
## When to use me
|
||||
|
||||
Use this skill after InternalAI meetings to create business-focused updates that:
|
||||
- Connect technical work to business value
|
||||
- Show strategic alignment with Greyhaven's mission
|
||||
- Highlight immediate priorities (1 week ahead)
|
||||
- Provide context for stakeholders (Max, Jordan, investors)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Greyhaven_Company_Documentation.md in repository root
|
||||
- DataIndex API access for meeting transcripts and business context
|
||||
- If Greyhaven doc missing, run `/init-greyhaven` first
|
||||
|
||||
## Workflow
|
||||
|
||||
### Step 1: Check for Greyhaven Documentation
|
||||
|
||||
```bash
|
||||
# Check if Greyhaven_Company_Documentation.md exists in repo root
|
||||
ls -la Greyhaven_Company_Documentation.md
|
||||
```
|
||||
|
||||
**If missing:** Run `/init-greyhaven` to generate it, then retry this skill.
|
||||
|
||||
### Step 2: Fetch Meeting Data
|
||||
|
||||
**Option A: Use specified meeting ID**
|
||||
```python
|
||||
dataindex_get_entity_by_id(
|
||||
entity_id="reflector:{meeting_id}",
|
||||
include_raw_data=true,
|
||||
max_content_length=null
|
||||
)
|
||||
```
|
||||
|
||||
**Option B: Fetch latest InternalAI meeting (default)**
|
||||
```python
|
||||
# Query for latest InternalAI meeting
|
||||
dataindex_query_entities(
|
||||
entity_types="meeting",
|
||||
connector_ids="reflector",
|
||||
search="internalai",
|
||||
limit=1,
|
||||
sort_by="timestamp",
|
||||
sort_order="desc"
|
||||
)
|
||||
|
||||
# Then fetch full transcript
|
||||
dataindex_get_entity_by_id(
|
||||
entity_id="reflector:{latest_meeting_id}",
|
||||
include_raw_data=true,
|
||||
max_content_length=null
|
||||
)
|
||||
```
|
||||
|
||||
**Extract from meeting entity:**
|
||||
- `raw_data.transcript` - Full conversation text
|
||||
- `participants` - List of attendees with contact_ids
|
||||
- `title` - Meeting title
|
||||
- `timestamp` - Meeting date
|
||||
- `id` - Meeting ID for reference links (extract UUID portion)
|
||||
|
||||
### Step 3: Parse Meeting into JSON Structure
|
||||
|
||||
Create structured JSON with participant talking points:
|
||||
|
||||
```json
|
||||
{
|
||||
"meeting": {
|
||||
"title": "Meeting Title",
|
||||
"date": "2026-02-18",
|
||||
"room": "internalai",
|
||||
"participants": ["Name1", "Name2"],
|
||||
"meeting_id": "reflector:xxx"
|
||||
},
|
||||
"participants": {
|
||||
"ParticipantName": {
|
||||
"business_value": ["talking point 1", "talking point 2"],
|
||||
"things_done": ["completed item 1"],
|
||||
"things_in_progress": ["current work 1"],
|
||||
"things_to_do": ["planned item 1"],
|
||||
"key_references": ["reference 1"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Parsing approach:**
|
||||
1. Segment transcript by speaker (lines starting with "SpeakerName: ")
|
||||
2. Extract business outcomes from each segment
|
||||
3. Categorize into: completed, in-progress, planned
|
||||
4. Identify key technical references mentioned
|
||||
|
||||
### Step 4: Research Business Context (Parallel Subagents)
|
||||
|
||||
For each participant, launch parallel subagents to search DataIndex.
|
||||
|
||||
**Subagent task template:**
|
||||
```
|
||||
Research business context for {participant_name} from meeting on {date}.
|
||||
|
||||
Meeting context: {meeting_title} - {brief_description_of_discussion}
|
||||
|
||||
Search DataIndex for the last 30 days (from {date_minus_30} to {date}) to find:
|
||||
- What projects this person is working on
|
||||
- What business problems they're solving
|
||||
- Recent decisions or priorities
|
||||
- Related work from other team members
|
||||
|
||||
**Search Command to Use:**
|
||||
Use dataindex_search with these parameters:
|
||||
- query: [your search terms]
|
||||
- limit: 10
|
||||
- date_from: {date_minus_30} (ISO format)
|
||||
- date_to: {date} (ISO format)
|
||||
|
||||
**Maximum 10 searches per participant.** Choose your search queries strategically based on the meeting topics discussed.
|
||||
|
||||
**URL Construction Helpers:**
|
||||
|
||||
For Zulip references (from threaded_conversation entities):
|
||||
- Base: https://zulip.monadical.com/#narrow/channel/
|
||||
- Format: https://zulip.monadical.com/#narrow/channel/{stream_id}-{stream_name}/topic/{topic_name}/with/{first_message_id}
|
||||
- stream_id: From entity.connector_metadata.stream_id or parse from entity.id
|
||||
- stream_name: From entity.title (extract stream name before the dash)
|
||||
- topic_name: From entity.connector_metadata.topic or parse from entity.title
|
||||
- message_id: Use the first message ID from entity.recent_messages[0].id
|
||||
|
||||
For Reflector references (from meeting entities):
|
||||
- Base: https://reflector.monadical.com/transcripts/
|
||||
- Format: https://reflector.monadical.com/transcripts/{transcript_id}
|
||||
- transcript_id: Extract from meeting.entity_id (remove "reflector:" prefix)
|
||||
|
||||
**What to return:**
|
||||
For each participant, provide:
|
||||
1. Key themes from their work (2-3 themes)
|
||||
2. Business value of each theme (1 sentence)
|
||||
3. Strategic alignment with Greyhaven (1 sentence)
|
||||
4. Direct URLs to relevant sources (use formats above)
|
||||
|
||||
Return as structured JSON:
|
||||
{
|
||||
"participant": "Name",
|
||||
"research_date_range": "{date_minus_30} to {date}",
|
||||
"key_themes": [
|
||||
{
|
||||
"theme": "Theme name",
|
||||
"business_value": "Why this matters commercially",
|
||||
"strategic_alignment": "How this supports Greyhaven's mission",
|
||||
"references": [
|
||||
{
|
||||
"type": "zulip|reflector",
|
||||
"title": "Brief description",
|
||||
"url": "Full URL"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Launch all subagents simultaneously** - one per participant.
|
||||
|
||||
**Search command example for subagents:**
|
||||
```python
|
||||
# Example search - subagent adapts query based on context
|
||||
dataindex_search(
|
||||
query="{participant_name} {topic}",
|
||||
limit=10,
|
||||
date_from="2026-01-18T00:00:00Z",
|
||||
date_to="2026-02-18T23:59:59Z"
|
||||
)
|
||||
```
|
||||
|
||||
### Step 5: Read Greyhaven Business Context
|
||||
|
||||
```bash
|
||||
# Read Greyhaven documentation
|
||||
cat Greyhaven_Company_Documentation.md
|
||||
```
|
||||
|
||||
Extract key context:
|
||||
- Three Pillars: Human-centered design, Local-first sovereignty, Rapid prototyping
|
||||
- Other Three Pillars of Data Sovereignty: Choice, Control, Clarity
|
||||
- Current positioning: "Palantir for SMEs"
|
||||
- Key stakeholders: Max (Founder), Jordan (BizDev), Corey Gallon (Strategic Advisor)
|
||||
- Immediate business priorities: Fundraising, first paying customer (Electra), enterprise readiness
|
||||
|
||||
### Step 6: Generate Business Context Document
|
||||
|
||||
**Output file:** `internalai_context_YYYY-MM-DD.md` (in repo root)
|
||||
|
||||
**Document structure:**
|
||||
|
||||
```markdown
|
||||
# InternalAI Business Context Update
|
||||
|
||||
[2-3 sentences total business impact across all participants]
|
||||
|
||||
---
|
||||
|
||||
## Participant Updates
|
||||
|
||||
### {Participant Name}
|
||||
|
||||
**What They've Done:**
|
||||
[2-3 sentences on completed work with business outcomes]
|
||||
|
||||
**Immediate Priorities (Next 7 Days):**
|
||||
- [Priority 1]
|
||||
- [Priority 2]
|
||||
|
||||
**Strategic Context:**
|
||||
[1-2 sentences connecting work to Greyhaven's mission and pillars]
|
||||
|
||||
**References:**
|
||||
- [Title](https://zulip.monadical.com/#narrow/channel/{stream_id}-{stream}/topic/{topic}/with/{message_id})
|
||||
- [Title](https://reflector.monadical.com/transcripts/{transcript_id})
|
||||
|
||||
---
|
||||
|
||||
**Revenue Enablement:**
|
||||
[How this work supports fundraising, customer acquisition, or retention]
|
||||
|
||||
**Market Positioning:**
|
||||
[How this supports "Palantir for SMEs" or data sovereignty messaging]
|
||||
|
||||
---
|
||||
|
||||
## Reference Links
|
||||
|
||||
### Key Meetings
|
||||
- [Meeting Title](https://reflector.monadical.com/transcripts/{transcript_id})
|
||||
|
||||
### Zulip Threads
|
||||
- [Thread Title](https://zulip.monadical.com/#narrow/channel/{stream_id}-{stream}/topic/{topic}/with/{message_id})
|
||||
|
||||
---
|
||||
|
||||
*Document generated from meeting transcript and DataIndex research*
|
||||
```
|
||||
|
||||
**Content guidelines:**
|
||||
- **Per participant:** Max 2 short paragraphs (What Done + Strategic Context)
|
||||
- **Immediate priorities:** Only 1 week ahead (not 2 weeks)
|
||||
- **Business language:** No technical jargon, focus on outcomes
|
||||
- **URL formats:**
|
||||
- Zulip: `https://zulip.monadical.com/#narrow/channel/{stream_id}-{stream_name}/topic/{topic_name}/with/{message_id}`
|
||||
- Reflector: `https://reflector.monadical.com/transcripts/{transcript_id}`
|
||||
|
||||
### Step 7: Generate Meeting JSON
|
||||
|
||||
Create `{date}_meeting_analysis.json` with parsed talking points (saved by default):
|
||||
|
||||
```json
|
||||
{
|
||||
"meeting": {
|
||||
"title": "...",
|
||||
"date": "...",
|
||||
"participants": ["..."],
|
||||
"meeting_url": "https://reflector.monadical.com/transcripts/{id}"
|
||||
},
|
||||
"participants": {
|
||||
"Name": {
|
||||
"business_value": [...],
|
||||
"things_done": [...],
|
||||
"things_in_progress": [...],
|
||||
"things_to_do": [...],
|
||||
"key_references": [...]
|
||||
}
|
||||
},
|
||||
"decisions_made": [...],
|
||||
"open_questions": [...]
|
||||
}
|
||||
```
|
||||
|
||||
### Step 8: Output Summary
|
||||
|
||||
Display to user:
|
||||
```
|
||||
✅ Business Context Update Complete
|
||||
|
||||
📄 Documents generated:
|
||||
- internalai_context_{date}.md
|
||||
- {date}_meeting_analysis.json
|
||||
|
||||
👥 Participants covered: {names}
|
||||
|
||||
🎯 Key business themes:
|
||||
- {theme 1}
|
||||
- {theme 2}
|
||||
```
|
||||
|
||||
## Commands Summary
|
||||
|
||||
**Pre-flight check:**
|
||||
```bash
|
||||
ls -la Greyhaven_Company_Documentation.md || echo "Run /init-greyhaven first"
|
||||
```
|
||||
|
||||
**Fetch meeting (latest):**
|
||||
```python
|
||||
dataindex_query_entities(
|
||||
entity_types="meeting",
|
||||
connector_ids="reflector",
|
||||
search="internalai",
|
||||
limit=1,
|
||||
sort_by="timestamp",
|
||||
sort_order="desc"
|
||||
)
|
||||
```
|
||||
|
||||
**Fetch meeting (by ID):**
|
||||
```python
|
||||
dataindex_get_entity_by_id(
|
||||
entity_id="reflector:{meeting_id}",
|
||||
include_raw_data=true,
|
||||
max_content_length=null
|
||||
)
|
||||
```
|
||||
|
||||
**Research business context (per participant - max 10 searches):**
|
||||
```python
|
||||
# Launch parallel subagents, one per participant
|
||||
# Each subagent runs up to 10 dataindex_search queries
|
||||
# Subagent constructs queries based on meeting context
|
||||
```
|
||||
|
||||
**Generate output:**
|
||||
```bash
|
||||
# Write to: internalai_context_YYYY-MM-DD.md
|
||||
# Write to: YYYY-MM-DD_meeting_analysis.json
|
||||
```
|
||||
|
||||
## URL Construction Reference
|
||||
|
||||
### Zulip URLs
|
||||
From `threaded_conversation` entity:
|
||||
```
|
||||
https://zulip.monadical.com/#narrow/channel/{stream_id}-{stream_name}/topic/{topic_name}/with/{message_id}
|
||||
```
|
||||
|
||||
**Field mapping:**
|
||||
- `stream_id`: entity.connector_metadata.stream_id
|
||||
- `stream_name`: Parse from entity.title (before dash)
|
||||
- `topic_name`: entity.connector_metadata.topic
|
||||
- `message_id`: entity.recent_messages[0].id
|
||||
|
||||
### Reflector URLs
|
||||
From `meeting` entity:
|
||||
```
|
||||
https://reflector.monadical.com/transcripts/{transcript_id}
|
||||
```
|
||||
|
||||
**Field mapping:**
|
||||
- `transcript_id`: entity.entity_id.replace("reflector:", "")
|
||||
|
||||
## Error Handling
|
||||
|
||||
- **Greyhaven doc missing:** Prompt user to run `/init-greyhaven`
|
||||
- **No InternalAI meetings found:** Check room_name filter, suggest checking reflector connector status
|
||||
- **Empty transcript:** Mark meeting as processed but note limited content
|
||||
- **Subagent failures:** Continue with available data, note gaps in output
|
||||
- **Large transcripts (>200KB):** Save to temp file, pass path to subagents
|
||||
|
||||
## Dependencies
|
||||
|
||||
- [dataindex](../dataindex/SKILL.md) — meeting queries and business context search
|
||||
- [init-greyhaven](../init-greyhaven/SKILL.md) — Greyhaven business context generation (if needed)
|
||||
- [contactdb](../contactdb/SKILL.md) — participant name resolution
|
||||
|
||||
## Example Usage
|
||||
|
||||
**Default (latest meeting):**
|
||||
```
|
||||
/internalai-business-context
|
||||
```
|
||||
|
||||
**Specific meeting:**
|
||||
```
|
||||
/internalai-business-context aecfd2e9-990f-4f25-b746-eb14ddae7494
|
||||
```
|
||||
|
||||
**Output location:**
|
||||
- `{repo_root}/internalai_context_2026-02-18.md`
|
||||
- `{repo_root}/2026-02-18_meeting_analysis.json`
|
||||
Reference in New Issue
Block a user