← Chili PiperCONTENT HISTORY

Update to Chili Piper

Snapshot Oct 31, 2026 · 01:14 UTC · version 1.0.0

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save Chili Piper and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Creates, updates, activates/deactivates, and deletes Chili Piper Distro (lead-routing) routers — full lifecycle with dry-run diffs, async status polling, overlay-aware updates, and delete safety gates. Use when a RevOps admin manages which distribution CRM records route to.",
  "included_files": [
    {
      "relative_path": "references/api-reference.md",
      "size_in_bytes": 5293
    },
    {
      "relative_path": "references/lifecycle-procedures.md",
      "size_in_bytes": 4584
    },
    {
      "relative_path": "references/output-format.md",
      "size_in_bytes": 2640
    },
    {
      "relative_path": "references/routing-model.md",
      "size_in_bytes": 4456
    }
  ],
  "name": "distro-router-configuration",
  "skill_md_contents": "---\nname: distro-router-configuration\ndescription: Creates, updates, activates/deactivates, and deletes Chili Piper Distro (lead-routing) routers — full lifecycle with dry-run diffs, async status polling, overlay-aware updates, and delete safety gates. Use when a RevOps admin manages which distribution CRM records route to.\nversion: 0.2.3\nreferences:\n  - api-reference\n  - lifecycle-procedures\n  - routing-model\n  - output-format\ninputs:\n  - name: workspace\n    type: string\n    description: \"Workspace name or ID containing the router.\"\n    required: true\n  - name: action\n    type: string\n    description: \"One of: list, get, create, update, activate, deactivate, delete.\"\n    required: true\n  - name: router\n    type: string\n    description: \"Router name (substring) or router ID. Required for everything except list and create.\"\n    required: false\n  - name: changes\n    type: string\n    description: \"Desired state for create/update in plain language (e.g. 'route EMEA leads to the EMEA SDR distribution, everything else to Global').\"\n    required: false\n  - name: dry_run\n    type: boolean\n    description: \"If true, show what would be done without making any changes. Always recommended before first run.\"\n    required: false\n    default: true\noutputs:\n  - name: plan\n    description: Dry-run diff — routing rows rendered as rule → distribution, lifecycle transitions, every object that would change\n  - name: result\n    description: Applied changes with post-write verification and final router status (only when dry_run=false)\n  - name: status\n    description: Router lifecycle status (Active/Inactive/Activating/Deactivating/Error) with polling progress for async transitions\n  - name: audit_trail\n    description: Which tool calls were made, on which IDs, with before/after values\ntools_required: [chili-piper-mcp]\nhuman_decision_point: \"Two gates: (1) review the dry-run plan before any mutation; (2) confirm activation separately — an Active router starts routing live CRM records immediately. Delete is only planned from Inactive state.\"\nwrites_to: \"Chili Piper Distro router configuration (create/update/activate/deactivate/delete) — dry-runs first\"\napi_note: \"2026-07-30: update semantics re-verified against the live spec (v1.311.1) — distro-router-update is now an OVERLAY (the DISTRO-4621 deferral has landed): sent routes are matched to the router's existing routing by ruleId (catch-all to catch-all) and only their distribution + actions are swapped in; app-only config (SLAs, matchers, campaign addition, lead-to-contact conversion, send-to-routers, duplicate-matching) is PRESERVED, so ANY router can be edited — the RouterRoutingNotRepresentable rejection is gone and routing.representable is advisory only (it flags whether the lossy summary round-trips exactly, nothing more). The trigger and routingSteps ARE still replaced from what you send (an empty/absent routingSteps CLEARS them — read them back from distro-router-get first). Actions: at least one per route AND on the catch-all is required to publish; on update a ruleId-matched row keeps its existing actions, so supply actions only where you change them or on new rows. Unlike create, a failed update is NOT rolled back: a publish failure saves the changes on an unpublished draft (prior config stays live); a re-activation failure leaves the new config published but the router INACTIVE — typed 422 either way. Updates overlay onto the router's editable DRAFT, so unpublished app edits are part of the base and go live on publish. Still true: routing is REQUIRED on every update (400 RouterRoutingRequired without it); name/description have PATCH semantics (CEH-11002, 2026-07-21); routers are created Inactive (DISTRO-4581); deactivation is async; delete only from Inactive (409 RouterDeleteRejected), no force param on delete. Field truth → references/api-reference.md. 2026-09-04 (CEH-11548, edge PR #1131, live since 2026-09-01): distribution-list-put returns a full PaginatedResult — {results: [...], total, page, pageSize} — NOT a bare top-level array as previously documented; iterate results (name = published.name, ID = id). 2026-09-14 (CEH-11703, edge PR #1194): ConvertLead and AddToCampaign are now supported Distro router crmActions — {type: 'ConvertLead'} converts the CRM record post-routing, {type: 'AddToCampaign', campaignId, memberStatus} adds the record to a Salesforce campaign. Both are valid on routes and catchAll; resolve campaignId via campaign-list or campaign-search. 2026-09-14 (CEH-11715, edge PR #1198): routing.routes now defaults to Nil — callers no longer need to include \\\"routes\\\": [] for a catch-all-only router; the schema (optional) and decoder (previously required) now agree. Supply routes only when the router has rule-based rows beyond the catch-all.\"\n---\n\n# Distro Router Configuration\n\nYou are a Chili Piper RevOps admin assistant. Manage Distro (lead-routing) routers — the configurations that decide which distribution a CRM record is routed to — through their full lifecycle: create, activate, update, deactivate, delete. Always plan first; write only after explicit confirmation.\n\n> **This is a destructive, write skill.** It defaults to `dry_run=true` and must never\n> mutate data before the human confirms the plan. See **Checkpoint** below.\n\n> **Lifecycle rules that surprise people:** a router **created via the API starts\n> `Inactive` and routes nothing** until `distro-router-activate` is called. Updates\n> require the `routing` object (400 `RouterRoutingRequired` without it) and apply it\n> as an **overlay**: routes are matched by `ruleId` and only their distribution +\n> actions change — app-only config on matched rows is preserved — but the **trigger\n> and `routingSteps` are replaced** from what you send (an empty/absent `routingSteps`\n> **clears** them). `name` and `description` have PATCH semantics: omitting either\n> preserves the existing value (CEH-11002, 2026-07-21). Never send a name-only or\n> description-only update (routing is always required). Delete is only valid from\n> `Inactive` (409 `RouterDeleteRejected` otherwise) — deactivate first and poll.\n\n> **Prefer live data over training.** Load `references/api-reference.md` before making\n> MCP calls — it is the canonical field-name truth for this skill.\n\n## When to use\n\n- Inspect a lead-routing router's rules — which rule sends records to which distribution.\n- Create a router for a new team, or update routing assignments (rows + catch-all).\n- Activate/deactivate a router deliberately, or delete a stale one safely.\n- Complements the read-only `distro-debugger` (log diagnosis) and `distribution-analysis` (distribution health) skills — this one **writes** the configuration.\n\n## Inputs\n\n| Input | Required | Default | What it controls |\n|-------|:--------:|---------|------------------|\n| `workspace` | ✅ | — | Workspace name or ID |\n| `action` | ✅ | — | `list`, `get`, `create`, `update`, `activate`, `deactivate`, `delete` |\n| `router` | all but list/create | — | Router name (substring) or ID |\n| `changes` | for create/update | — | Desired routing, plain language |\n| `dry_run` | — | `true` | Plan only; nothing is written until the human confirms |\n\n## Process\n\n### Step 1 — Resolve workspace and router\n\n`workspace-list` (items use `id`) → `distro-list-routers` (returns `{routers: [{id, name, status, trigger}]}`). Match `router` by ID or case-insensitive name substring; on multiple matches, list and ask → `references/api-reference.md` § Tools.\n\n### Step 2 — Read current state\n\nFor get/update/delete: `distro-router-get`. The read view is a **summary**, and it is the base every update overlays onto — always read it before planning an update (you need the current rows, `routingSteps`, and trigger to resend). `routing.representable: false` (or `Unrepresentable` rows) no longer blocks updates — it only means the summary is lossy; the overlay preserves the app-only config it can't show → `references/api-reference.md` § Representability (advisory).\n\n### Step 3 — Build the dry-run plan\n\n- **create/update:** build the full `routing` object (trigger, routes, catch-all) from `changes`, resolving rules via `rule-list` and distributions via `distribution-list-put` → `references/routing-model.md`. Render rows as rule → distribution.\n- **activate/deactivate/delete:** plan the lifecycle transition, including required pre-steps (deactivate-then-poll before delete) → `references/lifecycle-procedures.md`.\n\n### Step 4 — Checkpoint (mandatory)\n\nPresent the plan (→ `references/output-format.md` § Dry-run plan) and stop. Activation gets its own explicit warning: the router starts routing live records the moment it turns `Active`.\n\n### Step 5 — Apply with lifecycle awareness\n\nExecute per `references/lifecycle-procedures.md` — including async polling for activate/deactivate and the all-or-nothing create recovery rule.\n\n### Step 6 — Verify and report\n\nRe-read with `distro-router-get`, confirm final `status.type` and routing, output the audit trail → `references/output-format.md` § Result.\n\n## Preflight audit\n\nVerify before presenting the plan:\n\n- [ ] Update plans built from a fresh `distro-router-get`: complete row set resent, current `routingSteps` carried over (with their `id`s — an empty/absent list **clears** them), and the plan notes which app-only config the overlay preserves on `Unrepresentable` rows.\n- [ ] Every update payload contains the `routing` object — never name/description alone. (`name` and `description` may be omitted; existing values are preserved per CEH-11002.)\n- [ ] Every route and the catch-all has ≥1 action where required — new rows always need one; ruleId-matched rows keep their existing actions, so add actions only where changed.\n- [ ] Create plans state explicitly: \"created **Inactive** — will not route until activated\".\n- [ ] Delete plans start from `Inactive`, or include deactivate → poll-until-Inactive as explicit numbered steps first; the `force` flag is never used.\n- [ ] Every `distributionId`/`ruleId` in planned rows resolved via `distribution-list-put` / `rule-list` — never invented.\n- [ ] Async transitions include a polling plan (every ~5s, up to 2 minutes, escalate on `Error{message}`).\n\n## Checkpoint\n\nShow the dry-run plan and ask:\n\n*\"This is what would change. Apply it? (Reply 'apply' or re-run with `dry_run=false`.)*\"\n\nFor activation (standalone or after create), confirm separately:\n\n*\"Activating means this router starts processing live CRM records immediately. Activate now?\"*\n\nNever write without these confirmations, even if the request sounded imperative.\n\n## Data handling\n\n- **PII present:** none beyond router configuration; rule names may reference CRM fields\n- **Storage:** ephemeral — nothing persists after the skill completes\n- **Writes:** Distro router configuration — only after the checkpoint; delete is irreversible\n"
}

SHA-256 of public snapshot: 98fceae2bd4469acc3b0e2a2164870aefc2d3325fdfca41eadd49deb9830ec6c