Orca Morning Briefing Skill
Answers the question: "What happened while I was away, and what needs my attention?"
Provides a security briefing for the last 24-72 hours covering new critical alerts, escalated alerts, attack path changes, compliance drift, exposure changes, CDR activity anomalies, crown jewel risks, and aging unactioned alerts.
Usage
/orca-morning-briefing /orca-morning-briefing 72h /orca-morning-briefing week
Or natural language:
- "morning briefing"
- "what happened overnight?"
- "brief me on the last 72 hours"
- "daily security summary"
- "what's new since yesterday?"
Time Range
| Argument | Period | When to Use |
|---|---|---|
| (none) | Last 24 hours | Daily morning check |
72h | Last 3 days | Monday morning / after weekend |
week | Last 7 days | Weekly review / returning from PTO |
Map these to CDR time_range enum values:
- 24h →
"last_24_hours" - 72h →
"last_3_days" - week →
"last_7_days"
Processing Logic
Data Gathering Phase
Run ALL of the following queries in parallel to minimize latency. Do not wait for one to finish before starting the next.
Group 1: Alert Queries (via discovery_search)
Run these discovery_search queries in parallel:
Query 1a: New critical alerts
discovery_search: search_phrase: "critical open alerts" limit: 10
Query 1b: New high alerts
discovery_search: search_phrase: "high severity open alerts" limit: 10
Query 1c: Alerts on crown jewel assets
discovery_search: search_phrase: "open alerts on crown jewel assets" limit: 10
Query 1d: Internet-facing assets with critical vulnerabilities
discovery_search: search_phrase: "internet facing assets with critical vulnerabilities" limit: 10
Query 1e: New attack paths
discovery_search: search_phrase: "critical attack paths" limit: 10
Group 2: Compliance Queries
Run these in parallel:
Query 2a: Current compliance scores
get_enabled_compliance_frameworks: (no filters — get all frameworks)
Query 2b: Compliance trend
get_compliance_trend_over_time: filters: datetime_filter: 7 (or 14/30 depending on time range)
Query 2c: Compliance by account
get_compliance_analysis_by_account_or_business_unit: group_by: "accounts"
Group 3: CDR Activity
Run these in parallel:
Query 3a: CDR events grouped by action (last 24h)
get_cdr_events_grouped_by_event_name: time_range: "last_24_hours" (or "last_3_days" / "last_7_days") page_size: 50
Query 3b: CDR events from unusual sources
search_cdr_events: time_range: "last_24_hours" (or "last_3_days" / "last_7_days") limit: 50
Analysis Phase
After all queries return, analyze and synthesize:
1. New Alerts Analysis
From discovery_search results for critical and high alerts:
- Count total new alerts by severity
- Filter to alerts whose
CreatedAtfalls within the requested time window - For alerts that were already shown in previous briefings but were reopened or escalated, flag as "ESCALATED" or "REOPENED"
- Identify any alert types that appear for the first time (compare alert type names against the full list — if it's the first time this
AlertTypeappears, flag as "NEW TYPE") - Sort by Orca Score descending
2. Attack Path Analysis
From discovery_search attack path results:
- Count attack paths by severity
- Identify any that involve crown jewel assets
- Look for attack paths with stories involving lateral movement, privilege escalation, or data exfiltration
3. Compliance Drift Detection
From compliance framework results:
- Compare current scores against trend data
- Flag any framework that DROPPED in score (even 1%)
- Highlight frameworks below organizational thresholds (e.g., < 90%)
- Identify the account(s) dragging scores down (from account heatmap)
4. CDR Activity Analysis
From CDR event aggregation:
- Identify high-volume event types (top 10 by count)
- Flag events from unusual actors or IP addresses
- Look for patterns suggesting:
- Bulk resource changes (many Create*/Delete*/Modify* events)
- Reconnaissance (many Describe*/List*/Get* calls from one actor)
- Privilege escalation attempts (IAM policy changes, role assumptions)
- Data access spikes (S3 GetObject, database queries)
Classify CDR activity into:
Category Event Patterns Concern Level ──────────────────────────────────────────────────────────────────── Normal operations Describe*, List*, Get* (read) LOW Resource changes Create*, Put*, Modify*, Update* MEDIUM Deletions Delete*, Remove*, Terminate* HIGH IAM changes Attach*Policy, Create*Role, HIGH PutRolePolicy, AssumeRole Security changes AuthorizeSecurityGroup*, HIGH PutBucketPolicy, ModifyVpc* Console logins ConsoleLogin from new IPs MEDIUM-HIGH Root account usage Any action by root account CRITICAL
5. Exposure Changes
From discovery_search internet-facing results:
- Identify assets that are public-facing with high/critical alerts
- Cross-reference with crown jewel status
6. Crown Jewel Risk
From discovery_search crown jewel results:
- Count alerts on crown jewel assets by severity
- Flag any crown jewel with NEW critical alerts
7. Aging Alert Detection
From all alert results, identify:
- Critical alerts open > 7 days
- Critical alerts open > 30 days (severe aging)
- Alerts that were dismissed and reopened (remediation friction)
- Alerts with Jira tickets stuck in "To Do" status
8. Environment Pulse Calculation
Calculate the overall environment health:
IF new_critical_alerts > 0 AND (crown_jewel_affected OR compliance_dropped) THEN pulse = "🔴 DEGRADING — immediate attention needed" ELSE IF new_critical_alerts > 0 OR compliance_dropped THEN pulse = "⚠️ NEEDS ATTENTION — new critical findings" ELSE IF new_high_alerts > 3 THEN pulse = "⚠️ ELEVATED — review high-severity queue" ELSE IF aging_criticals > 0 THEN pulse = "⏳ STALE — no new threats but unresolved criticals aging" ELSE pulse = "✅ STABLE — no significant changes"
Output Format
Layer 1: Dashboard (always shown)
═══════════════════════════════════════════════════════════════════ MORNING BRIEFING — <date> Last <time_range> | <account(s)> ═══════════════════════════════════════════════════════════════════ PULSE: <environment health assessment — 1 line> ┌─────────────────────────────────────────────────────────────────┐ │ NEW ALERTS <N> total (<X> critical, <Y> high) │ │ ESCALATED <N> alerts changed severity or reopened │ │ ATTACK PATHS <N> new or worsened │ │ COMPLIANCE <framework> dropped <X>% │ │ EXPOSURE <N> assets newly internet-facing │ │ CROWN JEWELS <N> new alerts on critical assets │ │ AGING CRITICALS <N> critical alerts open > 7 days │ │ CDR ACTIVITY <volume assessment — normal/elevated/spike> │ └─────────────────────────────────────────────────────────────────┘ TOP PRIORITIES: [1] <alert-id> — <title> (<score>, <age>) [2] <alert-id> — <title> (<score>, <age>) [3] <alert-id> — <title> (<score>, <age>) [4] <alert-id> — <title> (<score>, <age>) [5] <alert-id> — <title> (<score>, <age>) ═══════════════════════════════════════════════════════════════════ Type a keyword to drill down: alerts | escalated | attack paths | compliance | exposure | crown jewels | aging | activity | new types | trends | full ═══════════════════════════════════════════════════════════════════
The TOP PRIORITIES list should be ordered by:
- New critical alerts on crown jewel or public-facing assets
- New critical alerts (by Orca Score descending)
- Escalated alerts (severity increased)
- Reopened alerts that were previously dismissed
- Aging critical alerts (oldest first)
Show up to 5 items. If fewer than 5 priorities, show fewer.
Layer 2: Drill-Down Sections
When user types a keyword, show the expanded section:
"alerts" — New Alerts Detail
─────────────────────────────────────────────────────────────────── NEW ALERTS — last <time_range> ─────────────────────────────────────────────────────────────────── CRITICAL (<N>): <alert-id> <score> <title> <asset> in <account> | <age> | <labels> <alert-id> <score> <title> <asset> in <account> | <age> | <labels> HIGH (<N>): <alert-id> <score> <title> <asset> in <account> | <age> | <labels> ... NEW ALERT TYPES (first time in environment): ⚡ <alert-type> — never seen before (orca-XXXX on <asset>) ─────────────────────────────────────────────────────────────────── Triage any alert: /orca-alert-triage <alert-id> ───────────────────────────────────────────────────────────────────
"escalated" — Escalated Alerts
─────────────────────────────────────────────────────────────────── ESCALATED ALERTS — last <time_range> ─────────────────────────────────────────────────────────────────── SEVERITY INCREASED: <alert-id> <old-level> → <new-level> <title> Reason: <score vector change> REOPENED (was closed/dismissed): <alert-id> dismissed → open <title> <asset> | originally opened <date> ───────────────────────────────────────────────────────────────────
"attack paths" — Attack Path Changes
─────────────────────────────────────────────────────────────────── ATTACK PATHS — last <time_range> ─────────────────────────────────────────────────────────────────── NEW ATTACK PATHS: [!] <score> <attack path story — 1 line> Assets: <list> | Kill chain: <step count> Crown jewel involved: YES/NO WORSENED: [↑] <score> <attack path story> Change: <what got worse> ───────────────────────────────────────────────────────────────────
"compliance" — Compliance Drift
─────────────────────────────────────────────────────────────────── COMPLIANCE POSTURE — last <time_range> ─────────────────────────────────────────────────────────────────── FRAMEWORK SCORES: Framework Score 7-Day Trend Status ───────────────────────────────────────────────────────── PCI DSS v4.0.1 87% ↓ -2% ⚠ DROPPED NIST 800-53 93% → 0% ✓ STABLE SOC 2 95% ↑ +1% ✓ IMPROVING CIS AWS v3.0 81% ↓ -1% ⚠ DROPPED WORST ACCOUNTS: <account> — <score>% avg across frameworks <account> — <score>% avg across frameworks NEW FAILING CONTROLS: <framework>: <control> — <N> assets failing ... ───────────────────────────────────────────────────────────────────
"exposure" — Exposure Changes
─────────────────────────────────────────────────────────────────── EXPOSURE — Internet-Facing Assets with Critical Alerts ─────────────────────────────────────────────────────────────────── <asset> (<type>) in <account> Public IP: <ip> Critical alerts: <N> | Orca Score: <score> Crown jewel: YES/NO <asset> (<type>) in <account> ... ───────────────────────────────────────────────────────────────────
"crown jewels" — Crown Jewel Risk
─────────────────────────────────────────────────────────────────── CROWN JEWEL ALERTS — last <time_range> ─────────────────────────────────────────────────────────────────── <asset> (crown jewel score: <N>) Reason: <why it's a crown jewel> New alerts: <N> (<severity breakdown>) Top alert: <alert-id> — <title> (score: <X>) ... ───────────────────────────────────────────────────────────────────
"aging" — Unactioned Aging Alerts
─────────────────────────────────────────────────────────────────── AGING ALERTS — Critical Alerts Needing Attention ─────────────────────────────────────────────────────────────────── CRITICAL > 30 DAYS (urgent): <alert-id> <age>d <title> <asset> | Jira: <ticket> (<status>) CRITICAL > 7 DAYS: <alert-id> <age>d <title> <asset> | Jira: <ticket> (<status>) DISMISSED → REOPENED (remediation friction): <alert-id> <title> dismissed <date>, reopened <date> JIRA STUCK: <alert-id> Jira <ticket> in "<status>" for <N> days <title> ───────────────────────────────────────────────────────────────────
"activity" — CDR Activity Overview
─────────────────────────────────────────────────────────────────── CDR ACTIVITY — last <time_range> ─────────────────────────────────────────────────────────────────── VOLUME: <total events> events (<assessment>) TOP EVENTS BY VOLUME: <event_name> <count> <assessment> <event_name> <count> <assessment> ... HIGH-INTEREST ACTIVITY: [!] <description of suspicious pattern> Actor: <identity> | Count: <N> | Service: <service> [!] <description> ... UNUSUAL ACTORS (if any): <actor> — <N events>, services: <list> First seen in this period: YES/NO ───────────────────────────────────────────────────────────────────
"new types" — First-Time Alert Types
─────────────────────────────────────────────────────────────────── NEW ALERT TYPES — First Time in Environment ─────────────────────────────────────────────────────────────────── ⚡ <alert-type> First occurrence: <alert-id> on <asset> Severity: <level> | Score: <X.X> What it means: <1-line explanation> ⚡ <alert-type> ... (If none): No new alert types detected in this period. ───────────────────────────────────────────────────────────────────
"trends" — Week-Over-Week Trends
─────────────────────────────────────────────────────────────────── TRENDS — Environment Over Time ─────────────────────────────────────────────────────────────────── ALERT TREND (7-day): Day Critical High Medium Total ────────────────────────────────────────── Mon Apr 14 2 5 12 19 Tue Apr 15 1 3 8 12 ... Today 3 4 5 12 DIRECTION: <improving / degrading / stable> TOP 5 MOST-AFFECTED ASSETS: <asset> — <N> open alerts (<X> critical) <asset> — <N> open alerts (<X> critical) ... TOP 3 MOST-AFFECTED ACCOUNTS: <account> — <N> critical alerts, compliance: <score>% ... ───────────────────────────────────────────────────────────────────
"full" — Everything Expanded
Show all sections above in order:
- Dashboard (repeated for context)
- New Alerts
- Escalated
- Attack Paths
- Compliance
- Exposure
- Crown Jewels
- Aging
- Activity
- New Types
- Trends
This is the "report mode" — useful for sharing with the team or pasting into a status update.
Edge Cases
No New Alerts
If no new critical/high alerts in the time window:
PULSE: ✅ STABLE — no new critical or high alerts NEW ALERTS: 0 critical, 0 high (Last critical alert was <N> days ago: <alert-id>)
Still show aging alerts, compliance, and CDR activity — the absence of new alerts doesn't mean everything is fine.
discovery_search Returns Partial Data
discovery_search is limited to 10 results per query. If results are capped:
- Note "showing top 10 of potentially more"
- Include the Orca UI URL for the full filtered view when available (from
app_urlin results) - For alert counts, qualify with "at least N" rather than exact numbers
No Compliance Frameworks Enabled
If get_enabled_compliance_frameworks returns empty:
COMPLIANCE: No frameworks enabled. Consider enabling PCI DSS, SOC 2, or CIS benchmarks.
CDR Not Configured
If CDR queries return 0 events:
CDR ACTIVITY: No events found. Possible reasons: • CloudTrail / audit log ingestion not configured • CDR not enabled for this account
First Briefing (No Baseline)
On the first run, there's no historical baseline to compare against. Note this:
Note: This is the first briefing for this environment. Future briefings will show trends and comparisons.
MCP Tools Used
Primary Tools (always called)
| Tool | Purpose | Briefing Section |
|---|---|---|
discovery_search | Find new critical alerts | New Alerts, Crown Jewels, Exposure |
discovery_search | Find new high alerts | New Alerts |
discovery_search | Find crown jewel alerts | Crown Jewels |
discovery_search | Find exposed assets | Exposure |
discovery_search | Find attack paths | Attack Paths |
get_enabled_compliance_frameworks | Current compliance scores | Compliance |
get_compliance_trend_over_time | Score trends (7/14/30 days) | Compliance, Trends |
get_cdr_events_grouped_by_event_name | Event volume by action type | CDR Activity |
Secondary Tools (called for drill-downs)
| Tool | Purpose | When Called |
|---|---|---|
get_compliance_analysis_by_account_or_business_unit | Account-level compliance breakdown | "compliance" drill-down |
get_compliance_framework_control_tests | Failing controls per framework | "compliance" drill-down |
search_cdr_events | Detailed event inspection | "activity" drill-down |
get_alert | Full alert details | When user triages from briefing |
get_asset_crown_jewel_info | Crown jewel status for specific asset | "crown jewels" drill-down |
get_framework_assets_with_failed_controls_count | Worst assets per framework | "compliance" drill-down |
Tool Parameter Reference
discovery_search
| Parameter | Type | Required | Description |
|---|---|---|---|
search_phrase | string | Yes | Natural language query |
limit | integer (1-10) | No | Max results (default: 5) |
get_enabled_compliance_frameworks
| Parameter | Type | Required | Description |
|---|---|---|---|
filters | object | No | Contains datetime_filter (7/14/30), providers, accounts, framework_ids, etc. |
get_compliance_trend_over_time
| Parameter | Type | Required | Description |
|---|---|---|---|
filters | object | No | Same shape as compliance frameworks filters |
get_compliance_analysis_by_account_or_business_unit
| Parameter | Type | Required | Description |
|---|---|---|---|
group_by | enum | No | "accounts" or "business_units" (default: "business_units") |
framework_ids | array | No | Filter to specific frameworks |
get_cdr_events_grouped_by_event_name
| Parameter | Type | Required | Description |
|---|---|---|---|
time_range | enum | Yes | "last_1_hour", "last_24_hours", "last_3_days", "last_7_days", "last_30_days" |
cloud_providers | array | No | Filter by provider |
accounts | array | No | Filter by account |
actors | array | No | Filter by actor |
services | array | No | Filter by service |
page_size | integer (1-100) | No | Results per page (default: 15) |
search_cdr_events
| Parameter | Type | Required | Description |
|---|---|---|---|
time_range | enum | Yes | Same as above |
actors | array | No | Filter by actor ARNs |
targets | array | No | Filter by target resources |
services | array | No | Filter by service |
actions | array | No | Filter by event name |
source_ip_addresses | array | No | Filter by source IP |
limit | integer (1-100) | No | Max events (default: 20) |
All array parameters must be arrays, even for single values: ["value"] not "value".
Implementation Notes
- Parallelize everything — run all Group 1, 2, and 3 queries simultaneously. The briefing should complete in a single round of parallel MCP calls.
- discovery_search is capped at 10 results — qualify counts with "at least N" and include Orca UI URLs for full views.
- Time filtering —
discovery_searchdoes not have an explicit time parameter. Use time-related language in the search phrase (e.g., "critical alerts created in the last 24 hours"). For CDR and compliance tools, use their native time filters. - Alert deduplication — the same alert may appear in multiple discovery_search results (e.g., a critical alert on a crown jewel). Deduplicate by alert_id before counting.
- Compliance trend interpretation —
get_compliance_trend_over_timereturns data points over time. Compare the latest score against the score from N days ago to calculate drift. - CDR volume assessment — without historical baselines, use absolute thresholds:
- < 100 events/day → LOW
- 100-1000 events/day → NORMAL
- 1000-10000 events/day → ELEVATED
- > 10000 events/day → HIGH VOLUME These are rough guidelines — adjust based on environment size.
- Keep the dashboard under 25 lines — the whole point is quick scanning. Details go in drill-downs.
- Top priorities list — always show the single most important thing to do first. This is the briefing's core value.
- Link to other skills — when showing alerts in drill-downs, suggest
/orca-alert-triage <alert-id>for investigation,/orca-impact-analysis <alert-id>for remediation planning, and/orca-config-origin <alert-id>for ownership.


