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

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 transcripts
  • apps/slack-apps/brainforge-assistant/src/transcripts.ts
  • apps/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