> ## Documentation Index
> Fetch the complete documentation index at: https://backstage.spotify.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Soundcheck Integration

AI Explorer integrates with [Soundcheck](/docs/portal/core-features-and-plugins/soundcheck) to evaluate the quality of skills, giving you data to build checks that enforce quality standards across your organization's agent resources.

## How it works

AI Explorer ships its own standalone Soundcheck fact collector, separate from built-in collectors like GitHub or SCM. It runs automatically once per day, analyzing all `AiContext` skill entities in your catalog. No setup is required — the collector is registered and scheduled with sensible defaults out of the box.

To customize the collection schedule or filtering, navigate to **Soundcheck → Integrations → AI Explorer**.

## Fact types

### `skill-analysis`

**Fact reference:** `ai-explorer:default/skill-analysis`

A comprehensive quality analysis of a skill, covering structure, ownership, and freshness.

## Skill analysis dimensions

### Structure

Deterministic checks on the skill's file structure and SKILL.md frontmatter.

| Field                                  | Type      | Description                                                                  |
| -------------------------------------- | --------- | ---------------------------------------------------------------------------- |
| `hasSkillMd`                           | `boolean` | Skill directory contains a `SKILL.md` file                                   |
| `hasValidFrontmatter`                  | `boolean` | `SKILL.md` has valid YAML frontmatter                                        |
| `nameValid`                            | `boolean` | Name is kebab-case and doesn't use reserved prefixes (`claude`, `anthropic`) |
| `nameMatchesFolder`                    | `boolean` | Frontmatter `name` matches the folder name                                   |
| `folderKebabCase`                      | `boolean` | Folder name uses kebab-case                                                  |
| `descriptionPresent`                   | `boolean` | Frontmatter includes a non-empty `description`                               |
| `descriptionIncludesTriggerConditions` | `boolean` | Description includes trigger phrases like "use when", "trigger when"         |
| `descriptionLength`                    | `number`  | Character length of the description                                          |
| `noXmlInFrontmatter`                   | `boolean` | Frontmatter contains no `<` or `>` characters                                |
| `noReadmeInFolder`                     | `boolean` | Skill folder does not contain a `README.md`                                  |
| `bodyWordCount`                        | `number`  | Word count of the SKILL.md body                                              |
| `usesProgressiveDisclosure`            | `boolean` | Body is under 2,000 words, or skill uses a `references/` directory           |

**Example check**: require valid frontmatter and trigger conditions in the description:

```yaml theme={"theme":{"light":"github-light","dark":"dracula"}}
- id: skill-structure-basics
  rule:
    allOf:
      - factRef: ai-explorer:default/skill-analysis
        path: $.structure.hasValidFrontmatter
        operator: equal
        value: true
      - factRef: ai-explorer:default/skill-analysis
        path: $.structure.descriptionIncludesTriggerConditions
        operator: equal
        value: true
```

### Ownership

| Field      | Type      | Description                        |
| ---------- | --------- | ---------------------------------- |
| `hasOwner` | `boolean` | Skill entity has an owner assigned |

### Freshness

| Field             | Type               | Description                                  |
| ----------------- | ------------------ | -------------------------------------------- |
| `recentlyUpdated` | `boolean`          | Source was modified within the last 6 months |
| `lastModifiedAt`  | `string` or `null` | ISO 8601 timestamp of last modification      |

## Collector configuration

The defaults can be customized through **Soundcheck → Integrations → AI Explorer**.

| Option         | Type     | Default                                      | Description                                               |
| -------------- | -------- | -------------------------------------------- | --------------------------------------------------------- |
| `frequency`    | `object` | Daily at 4:00 AM UTC (`0 4 * * *`)           | Cron schedule or duration for collection runs             |
| `filter`       | `object` | `AiContext` entities with `spec.type: skill` | Soundcheck filter to limit which entities are collected   |
| `exclude`      | `object` | —                                            | Exclude entities matching this filter (requires `filter`) |
| `batchSize`    | `number` | 1                                            | Number of entities to process per batch                   |
| `initialDelay` | `string` | —                                            | Delay before the first collection run                     |
| `cache`        | `object` | —                                            | Cache configuration for collected facts                   |
