Executive Intelligence
311 lines

Plan overview

CEO Weekly Report

Read a week of Slack across sales, dev, leadership, and health-check channels, extract a per-department pulse, and synthesize a polished executive brief for the CEO.

Best for

CEOs · Chiefs of Staff · Founders

Runs with

Slack · Executive brief · Department pulse

At a glance

04

Outputs

01

Capabilities

03

Teams

Core outputs

Executive summary

Department pulses

Decisions required

Watch list

Capability requirements

MCP

What it solves

Executive updates are late, subjective, and depend on someone manually stitching cross-functional context together every week.

Creates a dependable weekly executive operating rhythm.

Removes manual briefing work for chiefs of staff and founders.

Flags decisions and risks with an explicit urgency for each.

Workflow

1

Pull the trailing window of Slack history from four operating channels.

2

Extract a structured pulse — wins, blockers, risks, sentiment — per department.

3

Synthesize a CEO-ready brief with decisions required and a watch list.

Implementation

Review the underlying FML plan — the sessions, tools, and typed schemas that define this workflow — and see exactly how it is instructed for repeatable execution.

FML Plan

ceo-report.fml

311 lines

Copy
parameter("lookBackDays", type=string, default="7", title="Look Back Days") # Number of days of Slack history to retrieve (for example: '7')
parameter("reportWeekOf", type=string, default="") # Week-ending date label, for example 'March 21, 2026'. Leave blank to auto-detect.

require mcp Slack

transformer("cleanup_slack_history") {
    onFunctionOutput = "conversations_history"
    jmesPath = "structuredContent.messages || result.messages || messages"
}

call("computeCutoff") -> oldestTs {
    days = "{{ .params.lookBackDays }}"
    code( const days = parseInt(args.days, 10);
const safeDays = Number.isFinite(days) && days > 0 ? days : 7;
const nowSec = Math.floor(Date.now() / 1000);
nowSec - (safeDays * 86400); )
}
call("conversations_history") -> salesRaw {
    channel = "C091MES33UK"
    oldest = $(vars.oldestTs)
    limit = 200
}
call("conversations_history") -> devRaw {
    channel = "C08A3PZ78NL"
    oldest = $(vars.oldestTs)
    limit = 200
}
call("conversations_history") -> leadershipRaw {
    channel = "C08K10S721K"
    oldest = $(vars.oldestTs)
    limit = 200
}
call("conversations_history") -> healthCheckRaw {
    channel = "C095SEVCS1G"
    oldest = $(vars.oldestTs)
    limit = 200
}

components {
    schema("DepartmentPulse") {
        wins: string[] # Concrete achievements, closed deals, shipped work, or milestones landed
        blockers: string[] # Active blockers, unresolved dependencies, or slowdowns raised in the channel
        risks: string[] # Forward-looking risks or concerns a CEO should monitor
        sentiment: strong|steady|concerning|unclear # Overall team energy and momentum reading for the week
        notableThreads: string[] # 2-3 significant discussions or decisions worth CEO awareness
        headline: string # One sentence — the single most important thing happening in this department this week
    }
}

session("extract-sales-signals", target="salesSignals") {
    - You are a business analyst preparing a CEO briefing.

      The conversations_history call returned Slack messages for sales.
      The transformer cleaned them into a list of messages.

      Here is the Slack history for sales:
      ```json
      {{ json .vars.salesRaw }}
      ```

      Map this data exactly to the salesSignals schema.

      Focus on:
      - deal updates
      - pipeline movement
      - customer wins or losses
      - quota progress
      - objections heard in the field
      - pricing or competitive mentions

      Sentiment classification rules:
      - use "strong" when wins clearly outweigh blockers and risks and momentum is positive
      - use "steady" when work is progressing normally with manageable blockers
      - use "concerning" when blockers, slippage, or risks materially threaten progress
      - use "unclear" only when there is not enough signal in the retrieved messages
      - sentiment is required and must never be blank

      If the channel is inaccessible, missing, or contains no messages in the selected time window,
      still return a valid DepartmentPulse with:
      - headline: "No messages retrieved from the sales channel in the selected time window."
      - wins: []
      - blockers: []
      - risks: []
      - sentiment: "unclear"
      - notableThreads: []
      Do not return an empty string for sentiment.
    schema $DepartmentPulse
}

session("extract-dev-signals", target="devSignals") {
    - You are a business analyst preparing a CEO briefing.

      The conversations_history call returned Slack messages for dev.
      The transformer cleaned them into a list of messages.

      Here is the Slack history for dev:
      ```json
      {{ json .vars.devRaw }}
      ```

      Map this data exactly to the devSignals schema.

      Focus on:
      - features shipped
      - bugs in production
      - incidents
      - deployment status
      - technical debt discussions
      - scope changes
      - any signs of timelines slipping or accelerating

      Translate technical language into business impact where possible.

      Sentiment classification rules:
      - use "strong" when delivery is healthy and wins clearly outweigh blockers
      - use "steady" when execution is progressing with manageable issues
      - use "concerning" when incidents, deployment problems, tool limits, or technical blockers materially threaten progress
      - use "unclear" only when there is not enough signal in the retrieved messages
      - sentiment is required and must never be blank

      If the channel is inaccessible, missing, or contains no messages in the selected time window,
      still return a valid DepartmentPulse with:
      - headline: "No messages retrieved from the dev channel in the selected time window."
      - wins: []
      - blockers: []
      - risks: []
      - sentiment: "unclear"
      - notableThreads: []
      Do not return an empty string for sentiment.
    schema $DepartmentPulse
}

session("extract-leadership-signals", target="leadershipSignals") {
    - You are a business analyst preparing a CEO briefing.

      The conversations_history call returned Slack messages for leadership.
      The transformer cleaned them into a list of messages.

      Here is the Slack history for leadership:
      ```json
      {{ json .vars.leadershipRaw }}
      ```

      Map this data exactly to the leadershipSignals schema.

      Focus on:
      - strategic discussions
      - directional decisions made or deferred
      - cross-functional priorities
      - goal progress or slippage
      - resourcing conversations
      - escalations
      - issues requiring CEO visibility or intervention

      Sentiment classification rules:
      - use "strong" when leadership signals show aligned momentum and clear progress
      - use "steady" when leadership is operating normally with contained concerns
      - use "concerning" when there are escalations, strategic tension, security concerns, or material adoption risks
      - use "unclear" only when there is not enough signal in the retrieved messages
      - sentiment is required and must never be blank

      If the channel is inaccessible, missing, or contains no messages in the selected time window,
      still return a valid DepartmentPulse with:
      - headline: "No messages retrieved from the leadership channel in the selected time window."
      - wins: []
      - blockers: []
      - risks: []
      - sentiment: "unclear"
      - notableThreads: []
      Do not return an empty string for sentiment.
    schema $DepartmentPulse
}

session("extract-health-check-signals", target="healthCheckSignals") {
    - You are a business analyst preparing a CEO briefing.

      The conversations_history call returned Slack messages for health-check.
      The transformer cleaned them into a list of messages.

      Here is the Slack history for health-check:
      ```json
      {{ json .vars.healthCheckRaw }}
      ```

      Map this data exactly to the healthCheckSignals schema.

      Focus on:
      - alerts
      - outages
      - degraded services
      - on-call escalations
      - infrastructure bottlenecks
      - deployment failures
      - remediation work
      - operational risks that could affect customers or team throughput

      Translate technical alerts into business terms where possible.

      Sentiment classification rules:
      - use "strong" when systems are stable and operational wins clearly outweigh incidents
      - use "steady" when systems are healthy with manageable operational noise
      - use "concerning" when outages, degraded services, incidents, or infrastructure risks materially affect customers or team throughput
      - use "unclear" only when there is not enough signal in the retrieved messages
      - sentiment is required and must never be blank

      If the channel is inaccessible, missing, or contains no messages in the selected time window,
      still return a valid DepartmentPulse with:
      - headline: "No messages retrieved from the health-check channel in the selected time window."
      - wins: []
      - blockers: []
      - risks: []
      - sentiment: "unclear"
      - notableThreads: []
      Do not return an empty string for sentiment.
    schema $DepartmentPulse
}

session("build-ceo-report", after="extract-sales-signals", after="extract-dev-signals", after="extract-leadership-signals", after="extract-health-check-signals") {
    context true
    - You are the Chief of Staff preparing the weekly CEO report.
      {{ if .params.reportWeekOf }}The report covers the week of {{ .params.reportWeekOf }}.{{ else }}Use today's date to determine and label the report week automatically.{{ end }}

      The structured signals available in context are:
      - salesSignals
      - devSignals
      - leadershipSignals
      - healthCheckSignals

      Produce a polished executive brief for a CEO audience.

      Write it the way a CEO wants to read it:
      - Lead with the most important thing happening in the business right now
      - Be direct and specific  no vague language, no filler
      - Surface decisions the CEO needs to make or conversations they need to have
      - Flag risks before they become crises
      - Celebrate wins clearly and attribute them
      - The CEO reads this in under 5 minutes  every sentence must earn its place

      Requirements:
      - executiveSummary must be a 3-5 sentence memo, not bullets
      - companyMomentum.overallSentiment must be one of: accelerating, steady, mixed, at-risk
      - every department sentiment must be one of: strong, steady, concerning, unclear
      - every decisionsRequired.urgency must be one of: this-week, this-month, watching
      - if a department has no real activity, keep the empty arrays and use sentiment "unclear"
      - set reportMeta.channelsCovered to the four channel categories, not raw IDs
      - set reportMeta.generatedAt to a current ISO timestamp
      - do not return empty strings for any enum field
      - if all departments have no real activity, set companyMomentum.overallSentiment to "at-risk"
      - if all departments have no real activity and you create one escalation item, set its urgency to "this-week"

      Overall sentiment classification rules:
      - use "accelerating" when multiple departments show strong forward momentum with limited risk
      - use "steady" when execution is healthy and risks are contained
      - use "mixed" when there are meaningful wins and meaningful risks at the same time
      - use "at-risk" when blockers or operational risk materially threaten company execution
      - overallSentiment is required and must never be blank

      Populate every final field explicitly:
      - reportMeta.weekOf
      - reportMeta.generatedAt
      - reportMeta.channelsCovered
      - executiveSummary
      - companyMomentum.overallSentiment
      - companyMomentum.topWin
      - companyMomentum.topRisk
      - departments.sales
      - departments.dev
      - departments.leadership
      - departments.healthCheck
      - decisionsRequired
      - lookingAhead.keyMilestones
      - lookingAhead.watchList

      The departments object should be synthesized directly from the intermediate signals:
      - departments.sales from salesSignals
      - departments.dev from devSignals
      - departments.leadership from leadershipSignals
      - departments.healthCheck from healthCheckSignals

      Do not leave reportMeta, executiveSummary, companyMomentum, or departments fields blank if relevant signal data exists.

    schema {
        reportMeta: {
            weekOf: string # Week-ending date this report covers, for example 'March 21, 2026'
            generatedAt: string # ISO timestamp when the report was generated
            channelsCovered: string[] # List of Slack channels included in this report
        }
        executiveSummary: string # 3-5 sentence memo written directly to the CEO. Leads with the biggest business development this week (positive or negative), then calls out the most important cross-functional signal, and closes with what needs the CEO's attention. Written in confident, direct prose — not bullets.
        companyMomentum: {
            topRisk: string # The single most pressing risk on the CEO's radar this week
            overallSentiment: accelerating|steady|mixed|at-risk # CEO's one-word read on where the company is this week
            topWin: string # The single best thing that happened this week, company-wide
        }
        departments: {
            sales: $DepartmentPulse
            dev: $DepartmentPulse
            leadership: $DepartmentPulse
            healthCheck: $DepartmentPulse
        }
        decisionsRequired: {
            decision: string # What needs to be decided or acted on
            context: string # Why this is on the CEO's plate — what's blocking or at stake
            urgency: this-week|this-month|watching # How soon the CEO needs to engage
            raisedBy: string # Team or person who surfaced this issue in Slack
        }[] # Explicit decisions or interventions the CEO needs to make this week
        lookingAhead: {
            keyMilestones: string[] # Launches, deadlines, or commitments due in the next 7 days mentioned across channels
            watchList: string[] # Situations that aren't crises yet but the CEO should keep an eye on
        }
    }
}