Slack Assistant Client Transcript Search Integration
Context
The transcript integration surfaces institutional knowledge stored in client meeting transcripts. Transcripts live as markdown files in knowledge/clients/{client}/transcripts/{YYYY-MM-DD}_{title}_{hash}.md within the brainforge-platform repo. This integration uses the same GitHub token as github.ts — the files are in the same repo, accessed via the same API.
Guidance
Path Parsing for Metadata Extraction
Transcript filenames encode critical metadata in predictable positions:
// Pattern: knowledge/clients/{client}/transcripts/{YYYY-MM-DD}_{title}.md
const match = filePath.match(
/^knowledge\/clients\/([^/]+)\/transcripts\/(\d{4}-\d{2}-\d{2})_(.+)\.md$/
);
return {
client: match[1], // e.g., "acme-corp"
date: match[2], // e.g., "2026-04-15"
title: match[3], // e.g., "weekly_sync_b202892c"
};The title hash suffix (e.g., b202892c) is stripped during formatting since it’s a deduplication artifact, not meaningful content.
Risk Signal Detection
The risk scanner is a keyword-density heuristic:
const riskKeywords = [
'budget', 'timeline', 'delay', 'concern', 'risk', 'blocker',
'waiting on', 'need from', 'missing', 'issue', 'problem',
'not sure', 'uncertain', 'churn', 'cancel', 'hold',
];
// Severity scoring:
// >= 4 matches → high
// >= 3 matches → medium
// >= 2 matches → low
// < 2 matches → ignored (noise threshold)Results are sorted by severity with evidence snippets:
Risk scan of 15 transcripts. Found 4 potential signals.
**HIGH** — [2026-04-15] acme-corp: budget, timeline, concern, delay
**MEDIUM** — [2026-04-10] beta-inc: blocker, waiting on
The noise threshold (>=2 keywords) filters out transcripts that casually mention one risk word. This is a heuristic — it produces false positives (casual use of “budget” in a budget-planning meeting) but catches genuinely risky transcripts reliably.
Client-Grouped Output
Results are grouped by client for readability:
### acme-corp (3 transcripts)
**[2026-04-15] weekly sync**
Meeting notes content...
### beta-inc (2 transcripts)
**[2026-04-10] sprint review**
...
This is done with a Map<string, TranscriptFile[]> accumulator across the result files.
Latest Transcript Access
getLatestTranscripts(clientName, count = 3) is a convenience wrapper around searchTranscripts that scopes to a specific client and limits results. This is used for quick status queries like “what was the last discussion with Acme.”
Why This Matters
Transcript search is the most “institutional” integration — it reflects what was actually discussed in meetings, not what’s documented in formal knowledge bases. The risk scanner catches escalation signals that might not be logged as Linear tickets yet. The path-parsing approach means zero infrastructure beyond GitHub — no separate indexing, no vector DB for this particular search.
When to Apply
- Any system that stores meeting notes as files in a repo
- Risk monitoring and escalation detection workflows
- Client context gathering for CSOs and account managers
Examples
Cross-Client Topic Search
User: "What did we discuss about pricing last month across all clients?"
→ searchTranscripts({ token, query: "pricing" })
→ Groups by client → formatted with dates and summaries
Client-Specific Latest
const result = await getLatestTranscripts({
token: config.githubToken,
clientName: 'acme-corp',
count: 3,
});
// Returns 3 most recent acme-corp transcriptsRelated
apps/slack-apps/brainforge-assistant/src/transcripts.tsapps/slack-apps/brainforge-assistant/src/github.ts(shared token)apps/slack-apps/brainforge-assistant/src/assistant.ts(wiring)knowledge/clients/(vault path)docs/solutions/architecture-patterns/slack-assistant-v2-hybrid-ai-pipeline-2026-04-28.md