Orca Compliance Gap Skill
Answers the question: "Where are we failing, what's the fastest path to improve, and who owns the worst gaps?"
Given a compliance framework (or all frameworks), analyzes failing controls ranked by blast radius, identifies quick wins (single-fix controls), breaks down gaps by account/business unit, and generates a prioritized remediation plan.
Usage
/orca-compliance-gap /orca-compliance-gap PCI DSS /orca-compliance-gap CIS AWS /orca-compliance-gap SOC 2
Or natural language:
- "how's our PCI compliance?"
- "what's failing in CIS AWS?"
- "compliance gap analysis"
- "show me our worst compliance gaps"
- "which framework needs the most work?"
- "quick wins for SOC 2"
Processing Logic
Step 1: Determine Scope
Parse user input to determine:
- Specific framework: "PCI DSS" → filter to that framework
- All frameworks: no argument → show overview of all, then drill into worst
- Account-specific: "compliance in account 123456789012" → filter by account
Step 2: Gather Data (run ALL in parallel)
Query 1: All enabled frameworks with current scores
get_enabled_compliance_frameworks: (no filters)
Query 2: Compliance trend over time
get_compliance_trend_over_time: filters: datetime_filter: 30
Query 3: Compliance by account
get_compliance_analysis_by_account_or_business_unit: group_by: "accounts"
Query 4: Compliance by business unit
get_compliance_analysis_by_account_or_business_unit: group_by: "business_units"
Step 3: Deep-Dive into Target Framework(s)
For the target framework (or the worst-scoring one if user said "all"), run Queries 5-8 in parallel. Query 6 depends on Query 5 (it needs the rule_ids), so run it after Query 5 returns.
Query 5: Failing control tests
get_compliance_framework_control_tests: framework_id: <id> filters: status: "fail"
Query 6: Compliant + non-compliant assets per failing control (runs after Query 5)
Scope to the top N failing controls (default N=5) to keep response sizes manageable. The rule_id comes from Query 5's tests[].rule_id.
get_control_test_assets: framework_id: <id> rule_id: <tests[].rule_id from Query 5> # one call per top-N failing control
Returns { non_compliant_assets: [...], compliant_assets: [...] } — both arrays, so true pass/fail ratios are computable per control, not just a failure count.
Query 7: Framework stats
get_compliance_framework_stats_for_asset: framework_id: <id>
Query 8: Assets with most failures
get_framework_assets_with_failed_controls_count: framework_id: <id>
Query 9: Per-framework account breakdown
get_compliance_analysis_by_account_or_business_unit: group_by: "accounts" framework_ids: ["<framework_id>"]
Step 4: Analyze and Rank
Quick Win Detection
A "quick win" is a failing control where:
- Few assets are affected — use the actual
non_compliant_assets.lengthfrom Query 6 (get_control_test_assets), not a guess (treat < 5 as low) - The fix is a single configuration change (not architectural)
- Fixing it passes the control completely (no partial pass)
- The control appears in multiple frameworks (high ROI)
Impact Ranking
Rank failing controls by:
- Cross-framework impact — for the top failing assets returned by Query 6 (
get_control_test_assets), callget_related_compliance_frameworks_for_assetwith the asset'sgroup_unique_idasasset_unique_id. A control/asset participating in more frameworks gets priority.- HARD RULE: before counting frameworks per asset, filter
result[]to entries whereactive === true. Theresultarray includes frameworks withactive: false(frameworks that could apply to this asset type but aren't enabled in the tenant). Counting them inflates cross-framework impact with frameworks the customer hasn't enabled.
- HARD RULE: before counting frameworks per asset, filter
- Asset count — controls failing on many assets = systematic issue
- Severity — critical/high controls before medium/low
- Fix complexity — simple config changes before architectural changes
Account Responsibility
Map failing controls to accounts to identify:
- Which account drags the score down most
- Which account has the most unique failures
- Cross-account patterns (same control failing everywhere)
Step 5: Generate Remediation Plan
Build a prioritized remediation plan:
Phase 1: Quick Wins (days)
- Single-config fixes affecting multiple frameworks
- Expected score improvement per fix
Phase 2: Systematic Fixes (weeks)
- Controls failing across many assets (same root cause)
- Requires policy change or automation
Phase 3: Architectural Changes (months)
- Deep structural gaps requiring design changes
- Network segmentation, encryption-at-rest, etc.
Proactive Remediation Behavior
CRITICAL: Never leave the user with just data. After EVERY output layer, suggest the next action and offer to generate remediation code.
After the dashboard and after every drill-down section:
- Suggest what to do next — identify the highest-ROI fix and recommend it
- Offer remediation format selection — always ask: "I can generate the fix. What format do you prefer?"
- Supported formats: Terraform, CloudFormation, Ansible, CLI commands (aws/az/gcloud), step-by-step instructions, Pulumi, ARM/Bicep
- Auto-suggest quick wins — proactively say "The quickest score improvement is fixing X. Want me to generate the code?"
When the user selects a format:
- Generate the remediation code for the selected control(s) immediately
- Write it to a file:
compliance-fix-<control-id>.<ext>(e.g.,.tf,.yml,.sh) - Include verification commands
- Show projected score improvement after applying
- Suggest the next control to fix
Format mapping:
| User says | Extension | Template |
|---|---|---|
| Terraform | .tf | HCL with provider + resource blocks |
| CloudFormation | .cfn.yaml | YAML template with Parameters/Resources |
| Ansible | .yml | Playbook with tasks |
| CLI | .sh | Shell script with cloud CLI commands |
| Instructions | inline | Numbered step-by-step console walkthrough |
| Pulumi | .ts | TypeScript Pulumi program |
| ARM/Bicep | .bicep | Bicep template |
Output Format
Layer 1: Dashboard
═══════════════════════════════════════════════════════════════════ COMPLIANCE GAP ANALYSIS — <framework or "All Frameworks"> <date> | <account scope> ═══════════════════════════════════════════════════════════════════ POSTURE: <overall assessment — 1 line> ┌─────────────────────────────────────────────────────────────────┐ │ FRAMEWORKS <N> enabled │ │ AVG SCORE <X>% │ │ WORST <framework> at <X>% │ │ BEST <framework> at <X>% │ │ TREND (30d) <improving / stable / degrading> │ │ QUICK WINS <N> controls fixable with single changes │ │ WORST ACCOUNT <account> — <X>% avg score │ └─────────────────────────────────────────────────────────────────┘ FRAMEWORK SCORES: Framework Score Trend Status ───────────────────────────────────────────────────────── <framework> <X>% ↓ -N% ⚠ DROPPED <framework> <X>% → 0% ✓ STABLE <framework> <X>% ↑ +N% ✓ IMPROVING ... # Show the next line ONLY when fewer than 3 frameworks are enabled. # Source from get_recommended_compliance_frameworks_to_enable. Recommended additional frameworks (from connected providers <connected_providers>): <top 3 display_names> TOP FAILING CONTROLS (highest impact): [1] <control name> — failing on <N> assets, affects <M> frameworks [2] <control name> — failing on <N> assets, affects <M> frameworks [3] <control name> — failing on <N> assets, affects <M> frameworks RECOMMENDED ACTION: The fastest score improvement: fix <top control> — affects <N> assets across <M> frameworks. I can generate the fix now. What format? terraform | cloudformation | ansible | cli | instructions | pulumi | arm/bicep ═══════════════════════════════════════════════════════════════════ Or drill down: controls | quick wins | accounts | trends | remediation plan | <framework name> | full ═══════════════════════════════════════════════════════════════════
Layer 2: Drill-Down Sections
"controls" — All Failing Controls
─────────────────────────────────────────────────────────────────── FAILING CONTROLS — <framework> Score: <X>% (<P> pass, <F> fail of <T> total) ─────────────────────────────────────────────────────────────────── CRITICAL CONTROLS FAILING: <control-id> <control name> Assets failing: <N> | Frameworks: <list> Fix: <1-line remediation summary> Failing assets (from get_control_test_assets): - <name> (<type>) — <ui_url> - <name> (<type>) — <ui_url> ... <control-id> <control name> ... HIGH CONTROLS FAILING: ... MEDIUM CONTROLS FAILING: ... (Rendering the real failing assets — name, type, ui_url — per control is what lets generated remediation code target actual resource IDs instead of a generic template.) FIX NOW: Pick any control and I'll generate the remediation code. Choose format: terraform | cloudformation | ansible | cli | instructions | pulumi | arm/bicep ───────────────────────────────────────────────────────────────────
"quick wins" — Fastest Path to Improvement
─────────────────────────────────────────────────────────────────── QUICK WINS — Highest ROI Fixes ─────────────────────────────────────────────────────────────────── [1] <control name> Fix: <specific action> Impact: passes control in these active frameworks: <active framework display_names from get_related_compliance_frameworks_for_asset, filtered to active === true> Failing assets (from get_control_test_assets): - <name> (<type>) — <ui_url> - ... Score boost: ~<X>% across <frameworks> Effort: LOW (single config change) [2] <control name> ... [3] <control name> ... ESTIMATED TOTAL IMPROVEMENT: Fixing all <N> quick wins → +<X>% average score improvement LET'S DO IT: I'll generate fixes for all quick wins in one batch. Choose format: terraform | cloudformation | ansible | cli | instructions | pulumi | arm/bicep ───────────────────────────────────────────────────────────────────
"accounts" — Account Breakdown
─────────────────────────────────────────────────────────────────── COMPLIANCE BY ACCOUNT ─────────────────────────────────────────────────────────────────── Account Avg Score Worst Framework Failures ────────────────────────────────────────────────────────────────── <account-1> <X>% <framework> <Y>% <N> <account-2> <X>% <framework> <Y>% <N> ... WORST ACCOUNT DEEP DIVE — <account>: Framework Score Gap from Target ────────────────────────────────────────── <framework> <X>% -<Y>% from 90% ... Top failures in this account: <control> — <N> assets ... ───────────────────────────────────────────────────────────────────
"trends" — Score History
─────────────────────────────────────────────────────────────────── COMPLIANCE TRENDS — Last 30 Days ─────────────────────────────────────────────────────────────────── Date Avg Score Direction Notable Changes ────────────────────────────────────────────────────── Apr 17 <X>% ─ <note> Apr 10 <X>% ↓ -N% <note> Apr 03 <X>% → 0% <note> Mar 27 <X>% ↑ +N% <note> FRAMEWORKS THAT DROPPED: <framework>: <from>% → <to>% (<reason if detectable>) FRAMEWORKS THAT IMPROVED: <framework>: <from>% → <to>% (<what was fixed>) ───────────────────────────────────────────────────────────────────
"remediation plan" — Prioritized Fix Plan
─────────────────────────────────────────────────────────────────── REMEDIATION PLAN — Path to <target>% Compliance ─────────────────────────────────────────────────────────────────── PHASE 1: QUICK WINS (this week) Expected improvement: +<X>% [ ] <fix 1> — <N> assets, <M> frameworks [ ] <fix 2> — <N> assets, <M> frameworks [ ] <fix 3> — ... PHASE 2: SYSTEMATIC FIXES (this month) Expected improvement: +<X>% [ ] <fix pattern> — <N> assets across <M> accounts [ ] <fix pattern> — ... PHASE 3: ARCHITECTURAL (this quarter) Expected improvement: +<X>% [ ] <change> — requires <team/resource> [ ] <change> — ... PROJECTED SCORES AFTER EACH PHASE: Framework Current Phase 1 Phase 2 Phase 3 ───────────────────────────────────────────────────── <framework> <X>% <Y>% <Z>% <W>% ... START NOW: Tell me which phase to start with and your preferred format. I'll generate implementation code for each fix in that phase. Format: terraform | cloudformation | ansible | cli | instructions | pulumi | arm/bicep ───────────────────────────────────────────────────────────────────
"" — Single Framework Deep Dive
Show controls, account breakdown, and remediation plan for just that framework.
"full" — Everything Expanded
Show all sections in order.
Edge Cases
No Compliance Frameworks Enabled
Call get_recommended_compliance_frameworks_to_enable (no params) and render the tenant-aware
recommendations from its response: frameworks[].display_name and connected_providers.
⚠ No compliance frameworks enabled in Orca. To get started, enable frameworks in: Orca Console → Compliance → Framework Settings Recommended for your connected providers (<connected_providers>): • <frameworks[0].display_name> • <frameworks[1].display_name> • <frameworks[2].display_name> ...
If the tool returns an empty frameworks list, fall back to one line: "No tenant-specific recommendations available — enable a CIS Benchmark for your cloud provider to start."
Framework Not Found
⚠ Framework "<input>" not found. Available frameworks: <list of enabled frameworks> Try: /orca-compliance-gap <exact framework name>
Perfect Score
✅ <framework> — 100% compliant! All <N> controls passing across <M> assets. Last failure resolved: <date> Recommendation: Set up alerts for score regression.
MCP Tools Used
Primary Tools
| Tool | Purpose | Parameter |
|---|---|---|
get_enabled_compliance_frameworks | All framework scores | optional filters |
get_compliance_trend_over_time | Score history | filters.datetime_filter (7/14/30) |
get_compliance_analysis_by_account_or_business_unit | Account/BU breakdown | group_by ("accounts" or "business_units") |
get_compliance_framework_control_tests | Failing controls per framework | framework_id, optional filters |
get_compliance_framework_stats_for_asset | Per-framework detailed stats | framework_id |
get_framework_assets_with_failed_controls_count | Worst assets per framework | framework_id |
get_control_test_assets | Compliant + non-compliant assets for one control test | framework_id, rule_id |
get_related_compliance_frameworks_for_asset | All frameworks an asset participates in (active + inactive) | asset_unique_id (= group_unique_id from get_control_test_assets) |
get_compliance_analysis_by_account_or_business_unit | Per-account score per framework (heatmap replacement) | group_by: "accounts", framework_ids: ["<id>"] |
Secondary Tools
| Tool | Purpose | When |
|---|---|---|
get_control_test_alerts | Alerts for a specific control | "controls" drill-down |
get_recommended_compliance_frameworks_to_enable | Tenant-aware framework recommendations | empty-state edge case + sparse-coverage dashboard hint |
discovery_search | Find assets related to a control failure | When investigating specific gaps |
Parameter Notes
framework_idcomes fromget_enabled_compliance_frameworksresponsefiltersobject can contain:datetime_filter,providers,accounts,framework_ids,business_unitsdatetime_filtervalues: 7, 14, 30 (days)group_byis an enum:"accounts"or"business_units"framework_idsonget_compliance_analysis_by_account_or_business_unitis top-level, NOT underfilters— nesting it underfiltersis silently ignored or failsrule_id(e.g.rcad0b53623) is the second key needed forget_control_test_assets, sourced fromget_compliance_framework_control_tests→tests[].rule_idasset_unique_id(e.g.CodeRepository_<acct>_<resource>orvm_<acct>_<resource>) forget_related_compliance_frameworks_for_assetis sourced fromget_control_test_assets→*_assets[].group_unique_idget_related_compliance_frameworks_for_assetreturns inactive frameworks too — filteractive: truebefore counting
Implementation Notes
- Parallelize all initial queries — frameworks, trends, and account breakdown are independent.
- Cross-framework impact is the key ranking metric — a control that fails in 5 frameworks is 5x more impactful to fix.
- Quick wins should have estimated score improvements — calculate from (controls_fixed / total_controls) per framework.
- Account ownership matters — the user needs to know WHO to assign the work to.
- Link to other skills — suggest
/orca-alert-triagefor individual alert deep-dives from failing controls,/orca-impact-analysisfor fix impact. - Compliance tools are the most complete in the Orca MCP — leverage all of them.
- Avoid the redundant account round-trip —
get_enabled_compliance_frameworksalready returnstop_accountsandstats.accounts.data(per-account pass/fail counts across the framework). Only callget_compliance_analysis_by_account_or_business_unitwhen you need the per-account score per framework (e.g. the heatmap replacement in Query 9); otherwise prefer the inline data.
Response sizes are large — always scope first
Every compliance tool can return tens to hundreds of KB. Without scoping, the skill will hit context limits before it can rank or render. Default scoping rules:
get_compliance_framework_control_tests: passfilters.providersand/orfilters.assets_categorieswhenever the user query implies a scope (e.g. "PCI on AWS" →providers: ["aws"]).get_control_test_assets: call only on the top-N failing controls (default N=5), never on every failing control by default.get_related_compliance_frameworks_for_asset: call only on the top-N failing assets per control (default N=3), and de-duplicate bygroup_unique_idacross controls.get_enabled_compliance_frameworks: when answering a single-framework question, passfilters.framework_ids: ["<id>"]instead of fetching all.


