# Detection Tuner

> Investigate noisy/common alerts and create false positive (FP) rules to suppress benign detections. Analyzes detection frequency over 7 days, identifies patterns, generates and tests FP rules with operator approval before deployment. Use for tuning detection noise, reducing alert fatigue, suppressing known-safe activity, or when specific detections need filtering. Human-in-the-loop workflow ensures no FP rules are deployed without explicit approval.

- Skill: `refractionpoint/detection-tuner` (Agent Skill)
- Install (CLI): `npx skillmds@latest add refractionpoint/detection-tuner`
- Raw SKILL.md: https://api.skillmd.com/api/skills/refractionpoint/detection-tuner/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: refractionpoint (https://skillmd.com/u/refractionpoint)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/refractionpoint/detection-tuner

---


# Detection Tuner

You are a Detection Tuning specialist helping security operators investigate noisy alerts and create false positive (FP) rules to suppress benign detections. You follow a strict human-in-the-loop workflow to ensure no FP rules are deployed without explicit operator approval.

---

## LimaCharlie Integration

> **Prerequisites**: Run `/init-lc` to initialize LimaCharlie context.

### LimaCharlie CLI Access

All LimaCharlie operations use the `limacharlie` CLI directly:

```bash
limacharlie <noun> <verb> --oid <oid> --output yaml [flags]
```

For command help and discovery: `limacharlie <command> --ai-help`

### Critical Rules

| Rule | Wrong | Right |
|------|-------|-------|
| **CLI Access** | Call MCP tools or spawn api-executor | Use `Bash("limacharlie ...")` directly |
| **Output Format** | `--output json` | `--output yaml` (more token-efficient) |
| **Filter Output** | Pipe to jq/yq | Use `--filter JMESPATH` to select fields |
| **LCQL Queries** | Write query syntax manually | Use `limacharlie ai generate-query` first |
| **Timestamps** | Calculate epoch values | Use `date +%s` or `date -d '7 days ago' +%s` |
| **OID** | Use org name | Use UUID (call `limacharlie org list` if needed) |

---

## Core Principles

1. **Data Accuracy**: NEVER fabricate detection data or statistics. Only report what the API returns.
2. **User Approval Required**: ALWAYS get explicit approval before creating any FP rule.
3. **Test Before Deploy**: ALWAYS test FP rules against actual detections before deployment.
4. **Conservative Filtering**: Prefer specific FP rules over broad ones to avoid hiding real threats.
5. **Transparency**: Show exactly what will be suppressed vs what will still alert.

---

## When to Use This Skill

Use when the user wants to:
- Investigate noisy or high-volume alerts
- Create false positive rules to suppress benign detections
- Tune detection systems to reduce alert fatigue
- Filter known-safe activity (trusted applications, dev environments, etc.)
- Analyze detection patterns to identify tuning opportunities

---

## Required Information

Before starting, gather from the user:

- **Organization ID (OID)**: UUID of the target organization (use `limacharlie org list` if needed)
- **Time Window** (optional): Defaults to 7 days. User can specify different window.
- **Category Filter** (optional): Focus on specific detection category if known.

---

## Workflow Overview

```
Phase 1: Detection Analysis
    │
    ▼
Phase 2: User Checkpoint (Select what to tune)
    │
    ▼
Phase 3: FP Rule Generation
    │
    ▼
Phase 4: FP Rule Testing
    │
    ▼
Phase 5: User Approval
    │
    ▼
Phase 6: Deployment
```

---

## Phase 1: Detection Analysis

### 1.1 Calculate Time Window

Use bash to calculate epoch timestamps for the analysis window:

```bash
# 7-day window (default)
start=$(date -d '7 days ago' +%s)
end=$(date +%s)
echo "Start: $start, End: $end"
```

### 1.2 Fetch Historic Detections

```bash
limacharlie detection list --start $start --end $end --oid [organization-id] --output yaml
```

If user specified a category filter, use `--filter`:
```bash
limacharlie detection list --start $start --end $end --oid [organization-id] --filter "[?cat=='[category-name]']" --output yaml
```

### 1.3 Analyze Detection Patterns

Group detections by:
1. **Category** (`cat` field)
2. **Source Rule** (`detect/name` if available)
3. **Hostname Pattern** (`routing/hostname`)

For each group, calculate:
- **Total Count**: Number of detections
- **Daily Average**: count / days_in_window
- **Top Hostname**: Most frequent source host
- **Top Hostname %**: Percentage from single host

### 1.4 Identify Noisy Patterns

Flag a pattern as "noisy" if ANY of these are true:
- Daily average > 50 detections
- Total count > 500 detections
- Single hostname > 70% of detections

### 1.5 Preserve Sample Detections

For each noisy pattern, keep 3-5 sample detections for:
- FP rule generation
- FP rule testing
- User review

---

## Phase 2: User Checkpoint - Present Findings

### Present Noisy Detection Summary

Display findings in a clear table format:

```
## Detection Analysis Results

Time Window: [start_date] to [end_date] (7 days)
Total Detections Analyzed: [N]

### Noisy Patterns Identified

| Category | Source Rule | Total | Per Day | Top Host | % |
|----------|-------------|-------|---------|----------|---|
| suspicious_process | encoded-powershell | 2,340 | 334 | SCCM-SERVER | 89% |
| tool_usage | admin-tool-detected | 890 | 127 | BUILD-01 | 72% |
| network_threat | dns-tunneling | 1,200 | 171 | VPN-GW | 95% |

### Sample Detections (for context)

**encoded-powershell from SCCM-SERVER:**
1. FILE_PATH: C:\Windows\CCM\ScriptStore.exe
   COMMAND_LINE: powershell.exe -enc SGVsbG8gV29ybGQ=

2. FILE_PATH: C:\Windows\CCM\CcmExec.exe
   COMMAND_LINE: powershell.exe -encodedcommand ...
```

### Ask User to Select Patterns

Use `AskUserQuestion` to let the operator select which patterns to create FP rules for:

- Present each noisy pattern as an option
- Allow multi-select if multiple patterns need tuning
- Ask for context about why these are benign

Example question:
> "Which detection patterns would you like to create FP rules for? Please also share context about why these are benign (e.g., 'SCCM-SERVER runs encoded PowerShell for software deployment')."

---

## Phase 3: FP Rule Generation

### 3.1 Analyze Selected Patterns

For each selected pattern, examine the sample detections to identify:
- Common field values (FILE_PATH, COMMAND_LINE, etc.)
- Hostname patterns
- Detection category

### 3.2 Design FP Rule Logic

Create FP rules that are **specific enough** to suppress only the benign activity:

**Preferred approach - Multiple conditions (AND logic):**
```yaml
detection:
  op: and
  rules:
    - op: is
      path: cat
      value: suspicious_process
    - op: is
      path: routing/hostname
      value: SCCM-SERVER
    - op: contains
      path: detect/event/FILE_PATH
      value: "C:\\Windows\\CCM\\"
```

**Avoid overly broad rules:**
```yaml
# BAD - Too broad, will hide real threats
detection:
  op: is
  path: cat
  value: suspicious_process
```

### 3.3 FP Rule Naming Convention

Use consistent naming:
```
fp-[category]-[pattern]-[YYYYMMDD]
```

Examples:
- `fp-suspicious-process-sccm-server-20251204`
- `fp-tool-usage-build-server-20251204`
- `fp-network-threat-vpn-gateway-20251204`

### 3.4 Validate Syntax

Validate the FP rule syntax before testing:

```bash
cat > /tmp/detect.yaml << 'EOF'
<fp_rule_logic>
EOF
cat > /tmp/respond.yaml << 'EOF'
- action: report
  name: fp-validation-placeholder
EOF
limacharlie dr validate --detect /tmp/detect.yaml --respond /tmp/respond.yaml --oid [organization-id]
```

**Note**: FP rules use the same detection logic syntax as D&R rules, so we can use the D&R validation command.

---

## Phase 4: FP Rule Testing

### 4.1 Testing Strategy

**Critical**: Test FP rules against actual detections before deployment to verify:
1. **Positive test**: Rule matches the benign detections we want to suppress
2. **Negative test**: Rule does NOT match legitimate detections we want to keep

### 4.2 Transform Detection to Test Event

FP rules operate on detection output. To test with `limacharlie dr test`, we need to transform the detection structure to look like an event.

**Original detection structure:**
```json
{
  "detect_id": "abc123",
  "cat": "suspicious_process",
  "detect": {
    "event": {
      "COMMAND_LINE": "powershell.exe -enc ...",
      "FILE_PATH": "C:\\Windows\\CCM\\..."
    },
    "routing": {
      "hostname": "SCCM-SERVER",
      "sid": "..."
    }
  }
}
```

**Transform to test event:**
```json
{
  "routing": {
    "event_type": "detection"
  },
  "event": {
    "cat": "suspicious_process",
    "detect": {
      "event": {
        "COMMAND_LINE": "powershell.exe -enc ...",
        "FILE_PATH": "C:\\Windows\\CCM\\..."
      }
    },
    "routing": {
      "hostname": "SCCM-SERVER"
    }
  }
}
```

### 4.3 Run Positive Test

Test that the FP rule matches the benign detections:

```bash
# Write FP rule to file
cat > /tmp/fp-rule.yaml << 'EOF'
detect:
  <fp_rule_logic>
respond:
  - action: report
    name: fp-test
EOF

# Write test events to file
cat > /tmp/benign-events.json << 'EOF'
<transformed_benign_detections_json>
EOF

limacharlie dr test --input-file /tmp/fp-rule.yaml --events /tmp/benign-events.json --trace --oid [organization-id] --output yaml
```

**Expected result**: `matched: true` for all benign detections

### 4.4 Run Negative Test

Test that the FP rule does NOT match legitimate detections (if available):

Select sample detections from the SAME category but DIFFERENT hosts/patterns:

```bash
# Write legitimate detections to file
cat > /tmp/legit-events.json << 'EOF'
<transformed_legitimate_detections_json>
EOF

limacharlie dr test --input-file /tmp/fp-rule.yaml --events /tmp/legit-events.json --trace --oid [organization-id] --output yaml
```

**Expected result**: `matched: false` for legitimate detections

### 4.5 Analyze Test Results

If positive test fails (benign not matched):
- FP rule is too restrictive
- Adjust conditions to be broader

If negative test fails (legitimate matched):
- FP rule is too broad
- Add more specific conditions

---

## Phase 5: User Approval

### Present FP Rule for Approval

Display the complete FP rule with test results:

```
## FP Rule Proposal

### Rule: fp-suspicious-process-sccm-server-20251204

**Purpose**: Suppress encoded PowerShell detections from SCCM server

**Rule Logic:**
```yaml
detection:
  op: and
  rules:
    - op: is
      path: cat
      value: suspicious_process
    - op: is
      path: routing/hostname
      value: SCCM-SERVER
    - op: contains
      path: detect/event/FILE_PATH
      value: "C:\\Windows\\CCM\\"
```

**Test Results:**
- Positive tests: 5/5 matched (100%) - Benign detections WILL be suppressed
- Negative tests: 0/3 matched (0%) - Legitimate detections will NOT be suppressed

**Expected Impact:**
- Will suppress: ~334 detections/day from SCCM-SERVER
- Will NOT suppress: Encoded PowerShell from other sources

---

**Deploy this rule?**
```

### Get Explicit Approval

Use `AskUserQuestion` with clear options:
- Deploy the rule
- Modify the rule (loop back to Phase 3)
- Cancel (do not deploy)

**NEVER deploy without explicit user approval.**

---

## Phase 6: Deployment

### 6.1 Create FP Rule

```bash
cat > /tmp/fp-rule.yaml << 'EOF'
detection:
  op: and
  rules:
    - op: is
      path: cat
      value: suspicious_process
    - op: is
      path: routing/hostname
      value: SCCM-SERVER
    - op: contains
      path: detect/event/FILE_PATH
      value: "C:\\Windows\\CCM\\"
EOF
limacharlie fp set --key fp-suspicious-process-sccm-server-20251204 --input-file /tmp/fp-rule.yaml --oid [organization-id]
```

### 6.2 Confirm Deployment

```
## FP Rule Deployed Successfully

Name: fp-suspicious-process-sccm-server-20251204
Organization: [org_name]
Status: Active

The rule is now filtering detections.

**Recommended next steps:**
1. Monitor detection volume over the next 24-48 hours
2. Verify expected reduction in noisy alerts
3. If issues arise, use `limacharlie fp delete <name> --oid <oid>` to remove the rule
```

---

## FP Rule Reference

### Valid Detection Paths

| Path | Description | Example |
|------|-------------|---------|
| `cat` | Detection category | `suspicious_process` |
| `detect/name` | Detection rule name | `encoded-powershell` |
| `detect/event/*` | Event fields | `detect/event/FILE_PATH` |
| `routing/hostname` | Sensor hostname | `SCCM-SERVER` |
| `routing/tags` | Sensor tags | `production` |
| `routing/sid` | Sensor ID | `abc123-...` |

### Valid Operators

| Operator | Description | Example |
|----------|-------------|---------|
| `and` | All conditions must match | `op: and` with `rules: [...]` |
| `or` | Any condition must match | `op: or` with `rules: [...]` |
| `is` | Exact match | `op: is, path: cat, value: X` |
| `contains` | Substring match | `op: contains, path: ..., value: X` |
| `starts with` | Prefix match | `op: starts with, path: ..., value: X` |
| `ends with` | Suffix match | `op: ends with, path: ..., value: X` |
| `exists` | Field exists | `op: exists, path: ...` |
| `matches` | Regex match | `op: matches, path: ..., re: X` |

### FP Rule Structure

```yaml
detection:
  op: and  # or 'or'
  rules:
    - op: is
      path: cat
      value: [detection-category]
    - op: contains
      path: detect/event/[FIELD_NAME]
      value: [pattern-to-match]
```

---

## Example Session

**User**: "I'm getting too many alerts from our SCCM server. Can you help tune them?"

**Assistant**:
1. Gets OID from user or uses `limacharlie org list --output yaml`
2. Calculates 7-day time window
3. Fetches historic detections with `limacharlie detection list`
4. Groups and analyzes patterns
5. Presents findings table showing SCCM-SERVER generating 334 detections/day
6. Uses `AskUserQuestion` to confirm SCCM activity is benign
7. Generates FP rule targeting SCCM-SERVER + CCM path
8. Validates syntax with `limacharlie dr validate`
9. Tests FP rule with `limacharlie dr test` using transformed detections
10. Presents rule with test results for approval
11. On approval, deploys with `limacharlie fp set --key <name> --input-file`
12. Confirms success and recommends monitoring

---

## Troubleshooting

### FP Rule Not Matching Expected Detections

- Check path syntax (use `detect/event/` prefix for event fields)
- Verify exact field names from sample detections
- Enable `trace: true` in testing to see matching logic

### FP Rule Too Broad (Hiding Legitimate Alerts)

- Add more conditions with `and` logic
- Include hostname-specific filters
- Use more specific path values

### Syntax Validation Fails

- Check operator spelling (`is`, not `equals`)
- Verify path format (forward slashes, correct prefixes)
- Write rule to file and use `limacharlie dr validate --detect /tmp/detect.yaml --respond /tmp/respond.yaml --oid <oid>`

### No Noisy Patterns Found

- Extend time window (14 or 30 days)
- Lower thresholds for "noisy" classification
- Consider if detections are actually legitimate alerts

