← Dashboard

markdown package not installed — serving raw text.

# Skill Packs

A Skill Pack is a single-file JSON manifest that bundles a Firewall
policy with metadata (name, version, author, license). Packs are
**signed**, **versioned**, and **shareable** — install one to get a
curated set of block patterns for a specific use case without writing
regex yourself.

## Five first-party packs

| Name | What it blocks |
|---|---|
| `customer-support-base` | Impersonation, refund-fraud language, prompt-injection |
| `code-review-base` | "Add a backdoor" / hardcoded secrets / disable auth requests |
| `fdcpa` | US Fair Debt Collection Practices Act violations — arrest threats, false legal authority, time-of-day violations |
| `hipaa-intake` | PHI-leakage patterns in patient-intake chatbots |
| `gdpr-article-9` | Elicitation of GDPR special-category data without explicit consent |

## Install one

**Via dashboard:** Dashboard → **Packs** → click **Install** on the one you want.

That's it. The pack's policy becomes your active policy. Verdicts on
`/v1/guard/check` now incorporate the pack's patterns alongside the
default classifier.

## What's in a pack

```json
{
  "format_version": "1.0",
  "name": "fdcpa",
  "title": "FDCPA — Fair Debt Collection Practices Act",
  "description": "Block US-FDCPA-prohibited debt-collection patterns...",
  "version": "0.1.0",
  "author": "Orivael Dev",
  "license": "MIT",
  "homepage": "https://docs.orivael.dev/firewall/packs/fdcpa",
  "tags": ["compliance", "finance", "us-federal"],
  "tested_against": ["axiom-firewall>=0.1.0"],
  "policy": {
    "version": 1,
    "additional_block_patterns": [
      {"class": "HARM", "regex": "warrant\\s+for\\s+(?:your|the\\s+debtor's)\\s+arrest"}
    ],
    "disabled_default_classes": [],
    "allow_only_classes": null
  },
  "signature": "808f53b24ac8acdf513148a95a019a10578803dcb8f057d6be7a155ec0ef17dc"
}
```

| Field | Required | Description |
|---|---|---|
| `format_version` | yes | Always `"1.0"` for this release. [2-year backward-compat](PHASE_1_DECISIONS.md). |
| `name` | yes | Unique kebab-case slug. `^[a-z][a-z0-9-]{1,63}$`. |
| `title` | yes | Human-readable name shown in the dashboard. |
| `description` | yes | One paragraph — what this pack is for. |
| `version` | yes | Semver (`0.1.0`, `1.0.0-rc.1`). |
| `author` | yes | Publisher name. |
| `license` | yes | SPDX identifier (`MIT`, `Apache-2.0`, etc.). |
| `homepage` | no | URL to the pack's docs page. |
| `tags` | no | Free-form labels for filtering. |
| `tested_against` | no | Compatibility hints (`axiom-firewall>=0.1.0`). |
| `policy` | yes | The actual policy. Same schema as the [custom policy](custom-policies.md). |
| `signature` | yes (after signing) | HMAC-SHA256 of the canonical payload minus this field. |

## Signing

First-party packs (published by Orivael) are signed with a key
derived from `AXIOM_MASTER_KEY` under the namespace
`axiom-skill-pack-v1`. The dashboard REFUSES to install a pack with
an invalid or missing signature.

To re-sign after editing:

```bash
AXIOM_MASTER_KEY=<hex> python scripts/sign_packs.py packs/fdcpa
```

The script is idempotent — unchanged packs are left alone.

Third-party publishing keys come in Phase 2 week 6 alongside the
public registry at `packs.orivael.dev`.

## Customizing an installed pack

A pack installs by writing its policy section into the tenant
policy table. Two consequences:

1. The **Policy editor** at `/dashboard/policy` shows the pack's JSON.
   You can edit it freely — the pack's lineage is still tracked
   separately so the dashboard can show "based on `fdcpa@0.1.0`".

2. Uninstalling a pack also clears the policy. If you'd customized
   it, those edits are lost. Save your edits elsewhere first if you
   want them.

## Authoring your own pack

```bash
# Skeleton: a directory named after the pack with a pack.json inside.
mkdir packs/my-org-internal/
cp packs/customer-support-base/pack.json packs/my-org-internal/pack.json

# Edit metadata + policy
$EDITOR packs/my-org-internal/pack.json

# Sign with your master key
AXIOM_MASTER_KEY=<hex> python scripts/sign_packs.py packs/my-org-internal

# Restart the dashboard — your pack shows up alongside the first-party ones.
```

For self-hosters, point `AXIOM_FIREWALL_PACKS_DIR` at any directory
containing `<pack-name>/pack.json` files.

## What's a good pack pattern?

- **High precision over recall.** A pack with one false positive a
  week destroys user trust. A pack with one false negative a month
  is fine — the default classifier covers a lot.
- **Case-insensitive matching.** All regex compile with `re.IGNORECASE`.
- **Test against allowed text too.** Make sure innocuous mentions of
  the keyword don't trip the block. `(?:tell|ask)\s+me\s+about\s+your\s+religion`
  is fine; `religion` alone would block legitimate questions like
  "what's the most common world religion?".
- **Use word boundaries.** `\bbomb\b` not `bomb` — the latter matches
  `bombastic`.
- **Bias to `DECEIVE` over `HARM` for prompt-injection.** Easier to
  surface "this looks like injection" than "this is harmful".

## Roadmap

| When | What |
|---|---|
| **Phase 2 week 6** | Public registry at `packs.orivael.dev` — browse + install packs over HTTP without touching the filesystem. |
| **Phase 2 week 7** | More first-party packs: PCI-DSS, COPPA, GDPR Article 5, SEC Rule 10b-5 (financial advice). |
| **Phase 2 week 8** | Third-party publisher keys (managed via Stripe + AWS KMS). Smithery.ai discovery. |
| **Phase 3+** | Pack-driven Skill Pack Builder for non-Firewall products (Data Gate, CallGuard). |