Skip to main content
skill CX Codex

k9-ownership-byod-setup — Claude Code skill: BYOD ownership table

Builds a Datadog ownership preferences CSV and walks you through uploading it. Useful when the Ownership Agent guesses the wrong resource owners.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add datadog-labs/agent-skills --skill k9-ownership-byod-setup -a claude-code
npx skills add datadog-labs/agent-skills --skill ownership-agent -a claude-code
Open on GitHub

What k9-ownership-byod-setup does

The skill runs a short interview first: which tags on your cloud resources signal ownership, which bot or shared accounts should never show up as owners, and any org context such as naming conventions. Then it writes a CSV with 12 columns, one row per rule, each with a sequential id and only the fields its preference_type needs.

Upload paths: the Reference Tables UI, cloud storage sync from S3, Azure Blob or GCS, the datadog_reference_table Terraform resource, or the Reference Tables API. The table name has to be exactly k9_ownership_preferences — get that wrong and nothing applies. Changes land within 24 hours, so checking right after upload tells you nothing. UI uploads cap at 4 MB, cloud storage at 200 MB.

Watch the limits: 50 tag mappings, 20 exclusions, 3 prompt texts, 1024 bytes per field and 4096 per prompt. Validation is all-or-nothing, so one bad row rejects the whole set for that cycle. Angle brackets, curly braces and pipes are not allowed in values. Tag mappings add to direct ownership signals like team: or service: tags rather than replacing them.

What it helps with

  • map cost-center and team tags to the right owners
  • keep bot accounts out of resource ownership
  • generate a valid 12-column preferences CSV
  • manage the reference table through Terraform or the API
  • find out why an entire preference set was rejected

Example prompts for the agent

  • Generate a k9_ownership_preferences table — our team tag marks the owning team
  • Set up BYOD ownership preferences and upload the CSV with Terraform
  • Why haven't my ownership preferences applied after 24 hours?

How to install k9-ownership-byod-setup

1Skills CLI (Vercel)

npx skills add datadog-labs/agent-skills --skill k9-ownership-byod-setup -a claude-code
npx skills add datadog-labs/agent-skills --skill ownership-agent -a claude-code

2Manually: put the files in place

~/.claude/skills/ownership-agent/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/ownership-agent/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about k9-ownership-byod-setup

How do I install k9-ownership-byod-setup in Claude?

Run npx skills add datadog-labs/agent-skills --skill k9-ownership-byod-setup -a claude-code. The skill lands at ~/.claude/skills/ownership-agent/SKILL.md.

What does k9-ownership-byod-setup do?

It walks through preference types, generates a CSV for the k9_ownership_preferences table, and gives upload instructions for the UI, API, cloud storage or Terraform.

Why aren't my preferences taking effect?

Usually the table name isn't exactly k9_ownership_preferences, or headers are missing — all 12 columns must be present. Changes also take up to 24 hours, so early checks prove nothing.

Source text

SKILL.md · MIT
---
name: k9-ownership-byod-setup
description: >
  Generate a BYOD ownership preferences reference table for a customer.
  Walks through preference types, generates CSV, and provides upload instructions (UI, API, cloud storage, or Terraform).
  Use when asked about BYOD setup, preferences reference table, k9_ownership_preferences, or ownership customization.
argument-hint: "[csv|api|help]"
model: sonnet
allowed-tools: Read, Bash
---

# BYOD Preferences Reference Table Setup

Help customers create and upload a `k9_ownership_preferences` reference table to customize how the Ownership Agent determines resource owners.

## Read first

- `references/schema.md` — full schema, column details, validation rules, and per-type examples
- `assets/example.csv` — complete working CSV with all three preference types

## Overview

The Ownership Agent infers owners for cloud resources with security findings. **Ownership preferences** let customers customize this by providing rules in a Datadog reference table. The agent reads them automatically.

With preferences you can:
- **Map tags to owners**: Resources with specific tag values belong to a particular team or person
- **Exclude accounts**: Prevent bot accounts or shared infrastructure from appearing as owners
- **Provide custom guidance**: Give the AI engine organization-specific context

## Reference Table Details

- **Table name**: `k9_ownership_preferences` (exact name, must match)
- **Effect delay**: Changes take effect within 24 hours of upload
- **Schema**: 12 columns, all STRING — see `references/schema.md` for details

## Workflow

### Step 1: Determine Needs

Ask the customer:
- **Tag mappings**: "Do you have tags on your cloud resources that indicate ownership? (e.g., `cost-center`, `team`, `project`)"
- **Exclusions**: "Are there bot accounts, service accounts, or shared accounts that should never appear as owners?"
- **Prompt text**: "Any organization-specific context that would help determine ownership? (e.g., naming conventions, team structure)"

### Step 2: Generate CSV

Read `references/schema.md` for the full column spec and `assets/example.csv` for a working template. Build a CSV with all 12 column headers. Each row gets a unique sequential `id` and fills columns relevant to its `preference_type`, leaving the rest empty.

### Step 3: Upload Instructions

**Option A — CSV Upload (UI):**
1. Go to **Integrations > Reference Tables** in Datadog
2. Click **New Reference Table**
3. Upload the CSV
4. Set table name to `k9_ownership_preferences`
5. Choose primary key: `preference_type, tag_key, tag_value, handle`
6. Save

Manual uploads support files up to 4 MB.

**Option B — Cloud Storage Sync (S3, Azure Blob, GCS):**
Best for automated, recurring updates. Store your CSV in a cloud storage bucket and Datadog periodically imports it.
1. Upload CSV to S3 / Azure Blob / GCS
2. In Datadog, go to **Integrations > Reference Tables**
3. Click **New Reference Table**, select **Cloud Storage** as source
4. Provide storage path and credentials
5. Set table name to `k9_ownership_preferences`
6. Datadog re-imports the file periodically

Cloud storage uploads support files up to 200 MB.

**Option C — Terraform:**
Use the `datadog_reference_table` resource in the Datadog Terraform provider to manage the table as infrastructure-as-code.

**Option D — API:**
You can manage reference tables programmatically through the Reference Tables API. See the [API documentation](https://docs.datadoghq.com/api/latest/reference-tables/) for available endpoints. Replace the API domain with your Datadog site URL if applicable.

### Step 4: Verify

Changes take effect within 24 hours. To verify:
1. Identify a resource that matches one of your tag mappings
2. After 24 hours, check the ownership suggestion for that resource in the Datadog UI
3. The suggested owner should reflect your configured mapping

## Key Behaviors

- **Case-insensitive matching**: Tag keys, tag values, handles, exclusion types, and resource types are all matched case-insensitively
- **AND-logic exclusions**: All non-empty exclusion fields must match. Empty fields act as wildcards
- **Tag mappings complement, not override**: Direct ownership indicators (like `team:` or `service:` tags) take precedence. Tag mappings augment, not replace
- **Graceful degradation**: If the table doesn't exist or is empty, ownership detection works normally without preferences
- **Empty table clears preferences**: Deleting all rows or deleting the table causes cached preferences to expire and be left empty
- **All-or-nothing validation**: Any validation failure rejects the entire preference set for that cycle

## Troubleshooting

| Problem | Likely cause | Fix |
|---|---|---|
| Preferences not taking effect after 24h | Table name is wrong | Must be exactly `k9_ownership_preferences` |
| Preferences not taking effect after 24h | Missing column headers | All 12 columns must exist as CSV headers |
| Preferences not taking effect after 24h | Feature not enabled for org | Contact support to enable ownership preferences |
| All preferences rejected | Invalid characters | See `references/schema.md` Allowed Characters. No angle brackets, curly braces, or pipes |
| All preferences rejected | Missing required field | Check required fields for each preference type in `references/schema.md` |
| All preferences rejected | Duplicate or conflicting rows | See Duplicate Detection in `references/schema.md` |
| All preferences rejected | Size limit exceeded | 50 tag mappings, 20 exclusions, 3 prompt texts. 1024 bytes/field, 4096/prompt |
| Tag mapping not matching | Spelling mismatch | Matching is case-insensitive but verify exact tag key/value on resource |
| Exclusion not applying | Scoping too narrow | All non-empty fields must match (AND). Leave filters empty for broad exclusions |
| Preferences cleared unexpectedly | Table emptied or deleted | Both cause cached preferences to expire. Upload a valid CSV to restore |

© datadog-labs · MIT · datadog-labs/agent-skills

Similar skills

Everything for Security →

From the same set20

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor