Skip to content

πŸ“‹ Board Meeting Transcript Processing (Post-MVP Vision)

Scope: POST-MVP - AI-powered extraction of compliance decisions from board minutes Status: Future feature - Requires AI infrastructure (see simplified-mvp-architecture.md) Target Users: Company secretaries, compliance officers, directors Value: Turn 50-page transcripts into actionable compliance items

Important Note

This is a POST-MVP feature. The MVP does NOT include AI-powered document processing. This document describes a potential future capability once we add AI infrastructure post-MVP.

MVP Alternative: Manual task creation from board minutes (directors/company secretaries manually enter board decisions as tasks)

The Problem We Solve

Board meetings discuss compliance, but decisions get buried in lengthy transcripts:

  • "Did the board approve the new password policy?"
  • "What cyber risks were discussed?"
  • "Were there any compliance actions assigned?"

Our Solution: AI extracts compliance-relevant decisions automatically

How It Works

1. Upload Process

Supported Formats:
  - PDF (most common for minutes)
  - DOCX (draft minutes)
  - TXT (pure transcripts)
  - Audio (future - transcribe first)

Upload Methods:
  - Web interface drag & drop
  - Email attachment to minutes@[tenant].getcimple.com
  - Direct from board portal (future integration)

2. AI Extraction Pipeline

interface TranscriptProcessor {
  // Step 1: Parse document
  parseDocument(file: File): Promise<string>

  // Step 2: Extract compliance items
  extractItems(text: string): Promise<ComplianceItem[]>

  // Step 3: Categorize and link
  categorizeItems(items: ComplianceItem[]): Promise<CategorizedItems>

  // Step 4: Create tasks/evidence
  createActions(items: CategorizedItems): Promise<ActionResult>
}

interface ComplianceItem {
  type: 'decision' | 'risk' | 'action' | 'approval'
  text: string
  context: string // Surrounding paragraph
  confidence: number // 0-1 score
  page?: number

  // Extracted details
  details: {
    what: string // "Approve password policy"
    who?: string // "IT Manager"
    when?: string // "By next meeting"
    framework?: string // "Essential Eight"
  }
}

3. Smart Extraction Rules

const EXTRACTION_PATTERNS = {
  decisions: [
    /board (approved|endorsed|ratified)/i,
    /motion (passed|carried)/i,
    /resolved that/i,
    /agreed to/i,
  ],

  risks: [
    /cyber(security)? risk/i,
    /compliance (risk|concern)/i,
    /data breach/i,
    /vulnerability/i,
  ],

  actions: [
    /action item/i,
    /management to/i,
    /requested? that/i,
    /by next (meeting|quarter)/i,
  ],

  approvals: [
    /policy (approved|updated)/i,
    /budget approved/i,
    /expenditure authorized/i,
  ],
}

// Context-aware extraction
function extractWithContext(text: string, pattern: RegExp) {
  const paragraphs = text.split(/\n\n+/)
  const matches = []

  for (const para of paragraphs) {
    if (pattern.test(para)) {
      matches.push({
        text: para,
        context: getPreviousParagraph(para) + getNextParagraph(para),
        confidence: calculateConfidence(para, pattern),
      })
    }
  }

  return matches
}

User Interface

Upload & Process

<div class="transcript-processor">
  <DropZone on:drop={processTranscript}>
    <FileText size={48} />
    <p>Drop board minutes here</p>
    <p class="hint">PDF, DOCX, or TXT - up to 100MB</p>
  </DropZone>

  {#if processing}
    <ProcessingStatus
      steps={[
        { name: 'Parsing document', status: 'complete' },
        { name: 'Extracting compliance items', status: 'active' },
        { name: 'Creating tasks', status: 'pending' }
      ]}
    />
  {/if}
</div>

Review & Confirm

<div class="extraction-results">
  <h3>Found {items.length} Compliance Items</h3>

  {#each items as item}
    <ExtractionCard>
      <div class="item-type">{item.type}</div>
      <div class="item-text">{item.text}</div>
      <div class="confidence">Confidence: {item.confidence}%</div>

      <div class="actions">
        <button on:click={() => createTask(item)}>Create Task</button>
        <button on:click={() => dismiss(item)}>Dismiss</button>
        <button on:click={() => edit(item)}>Edit</button>
      </div>
    </ExtractionCard>
  {/each}

  <div class="bulk-actions">
    <button on:click={createAllTasks}>Create All Tasks</button>
    <button on:click={exportToReport}>Add to Board Report</button>
  </div>
</div>

AI Prompts

Extraction Prompt

const EXTRACTION_PROMPT = `
You are a governance expert reviewing board meeting minutes for
compliance-related items.

Extract the following from the transcript:
1. DECISIONS: Any formal board approvals or resolutions related to
   compliance, security, or risk
2. RISKS: Cyber security or compliance risks discussed
3. ACTIONS: Tasks assigned to management regarding compliance
4. APPROVALS: Specific policies or procedures approved

For each item, extract:
- The specific decision/risk/action
- Who is responsible (if mentioned)
- Timeline (if mentioned)
- Related framework (E8, ISO27001, etc. if mentioned)

Focus only on technology, cyber security, and compliance items.
Ignore financial, HR, and operational matters unless they relate to compliance.

Format as JSON array of ComplianceItem objects.
`

Categorization Prompt

const CATEGORIZATION_PROMPT = `
Categorize this compliance item:

"${item.text}"

Determine:
1. Framework: E8, ISO27001, Privacy Act, General
2. Control Area: Access Control, Patching, Backup, etc.
3. Priority: Critical, High, Medium, Low
4. Task Type: Policy Update, Technical Implementation, Review, Approval

Consider the context and typical board-level discussions.
Return as structured JSON.
`

Data Model

CREATE TABLE board_transcripts (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  meeting_date DATE NOT NULL,
  file_name TEXT NOT NULL,
  file_url TEXT NOT NULL,
  processed_at TIMESTAMPTZ,

  -- Extraction results
  items_extracted INTEGER DEFAULT 0,
  tasks_created INTEGER DEFAULT 0,

  -- Metadata
  uploaded_by UUID REFERENCES users(id),
  tenant_id UUID NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE TABLE extracted_items (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  transcript_id UUID REFERENCES board_transcripts(id),

  -- Extraction details
  item_type TEXT CHECK (item_type IN ('decision', 'risk', 'action',
    'approval')),
  extracted_text TEXT NOT NULL,
  context_text TEXT,
  confidence DECIMAL(3,2),
  page_number INTEGER,

  -- Parsed details
  what TEXT NOT NULL,
  who TEXT,
  when_due TEXT,
  framework TEXT,

  -- User actions
  status TEXT DEFAULT 'pending', -- pending, accepted, dismissed
  task_id UUID REFERENCES tasks(id),

  tenant_id UUID NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

Integration with Core Platform

Auto-Task Creation

async function createTaskFromExtraction(item: ExtractedItem) {
  // Map to task
  const task = {
    title: item.what,
    description: `From board meeting ${item.meeting_date}:
      ${item.extracted_text}`,
    assignee: findUserByName(item.who) || getDefaultAssignee(),
    dueDate: parseDate(item.when_due) || getDefaultDueDate(),
    priority: item.confidence > 0.8 ? 'high' : 'medium',
    source: 'board_minutes',
    evidence: [item.transcript_id],
    tags: [item.framework, 'board-mandated'],
  }

  return await taskService.create(task)
}

Board Report Integration

// Include extracted items in next board report
function addToBoardReport(meetingDate: Date) {
  const items = getExtractedItems(meetingDate)

  return {
    title: 'Actions from Previous Meeting',
    items: items.map((item) => ({
      decision: item.what,
      assigned: item.who,
      due: item.when_due,
      status: item.task?.status || 'pending',
    })),
  }
}

Privacy & Security

Data Handling

  • Transcripts encrypted at rest
  • No storage of recordings (only text)
  • Automatic deletion after 12 months
  • Audit trail of all extractions

Access Control

  • Board members: View all
  • Executives: View assigned items
  • Managers: View their tasks only
  • Configurable per tenant

Success Metrics

Accuracy

  • Extraction precision: > 80%
  • False positive rate: < 20%
  • User acceptance rate: > 70%

Efficiency

  • Processing time: < 2 min per document
  • Time saved vs manual: 45 minutes
  • Actions captured: 95% of compliance items

Implementation Plan

  1. Week 1: Document parsing (PDF, DOCX)
  2. Week 2: AI extraction pipeline
  3. Week 3: Review interface
  4. Week 4: Task creation integration
  5. Week 5: Testing with real transcripts

Limitations (MVP)

  • English language only
  • Text documents only (no audio)
  • No real-time processing
  • No custom extraction rules
  • No learning from corrections

Future Enhancements

  • Audio transcription support
  • Multi-language support
  • Custom extraction patterns
  • Learning from user feedback
  • Integration with board portals
  • Automated compliance tracking

Related Documents: