Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when working with WizTelemetry Notification extension for KubeSphere, including installation, configuration, troubleshooting, notification channel setup, alert routing, and silence management.
.claude/skills/kubesphere-whizard-notification/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 307% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 712% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 499% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 280% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 481% | 0% |
WizTelemetry Notification is the notification component of the KubeSphere observability platform. It receives alerts, cloud events, and audit logs in a multi-tenant Kubernetes environment and distributes notifications to different channels based on tenant labels (e.g., namespace).
┌──────────────────────────────────────────────────────────────────────────────┐
│ Alertmanager │
│ Prometheus ──▶ metrics alert ──▶ notification-manager-svc:19093 │
│ K8s Events ──▶ events alert ──▶ notification-manager-svc:19093 │
│ Auditing ──▶ auditing alert ──▶ notification-manager-svc:19093 │
│ Logging ──▶ logging alert ──▶ notification-manager-svc:19093 │
└──────────────────────────────────────────────────────────────────────────────┘
│
notification-manager (:19093)
│
┌──────────────────────────┼──────────────────────────┐
│ │ │
[Silence Stage] [Route Stage] [Filter Stage]
│ │ │
▼ ▼ ▼
[Match Silence CRs] [Match Router CRs] [alertSelector filtering]
│
[Aggregation Stage]
│
[Notify Stage]
│
┌────────────────────────┼────────────────────────────┐
│ │ │
Email/Slack DingTalk/Feishu WeChat/Webhook
│
▼
[History Webhook]
│
▼
┌─────────────────────┐
│ Vector Aggregator │
└────────┬────────────┘
│
│
▼
OpenSearch| Component | Description | Default | |-----------|-------------|---------| | notification-manager | Core notification management, receives alerts, dispatches to channels | true | | alertmanager (v0.27.0) | Alert routing, deduplication, aggregation, silencing | true | | alertmanager-proxy | Alertmanager API proxy, NodePort 31093 | true | | notification-history | Stores sent notifications via Vector to OpenSearch | true |
| Dependency | Type | Required | |------------|------|----------| | whizard-telemetry | extension | Required | | vector (WizTelemetry Data Pipeline) | extension | Required only notification history is enabled | | opensearch | extension | Required only notification history is enabled |
All CRDs belong to notification.kubesphere.io/v2beta2, scope is Cluster.
| CRD | Kind | Description | |-----|------|-------------| | notificationmanagers.notification.kubesphere.io | NotificationManager | Notification manager deployment spec (image, replicas, resources, sidecar, receiver config) | | receivers.notification.kubesphere.io | Receiver | Tenant-level notification receiver, references Config | | configs.notification.kubesphere.io | Config | Credential references (via Secret selectors), independent per channel | | routers.notification.kubesphere.io | Router | Route alerts to receivers based on label matchers | | silences.notification.kubesphere.io | Silence | Time-bounded silencing, supports matchers |
| Channel | Receiver Field | Config Field | Description | |---------|---------------|--------------|-------------| | Email | spec.email | spec.email | SMTP with TLS/STARTTLS support | | Slack | spec.slack | spec.slack | Slack webhook + token | | DingTalk | spec.dingtalk | spec.dingtalk | ChatBot + group conversation | | WeChat | spec.wechat | spec.wechat | ChatBot + group conversation | | Feishu | spec.feishu | spec.feishu | ChatBot + group conversation | | Webhook | spec.webhook | spec.webhook | Generic HTTP / HTTPS POST |
Config (credentials) --labels--> Receiver (via label selector) --labels--> Router (route matching)
│
└── namespace for multi-tenant isolationConfig's labels are used by Receiver's *ConfigSelector. Receiver's labels are used by Router's receiverSelector.
REQUIRED: Complete all steps in order before generating InstallPlan.
bashkubectl get extensionversions -l kubesphere.io/extension-ref=whizard-notification -o jsonpath='{range .items[*]}{.spec.version}{"\n"}{end}' | sort -V | tail -1
This outputs the latest version (e.g., 2.7.0). Note this down.
CRITICAL:
metadata.name MUST be whizard-notificationconfig field is YAML formatBasic installation:
yamlapiVersion: kubesphere.io/v1alpha1 kind: InstallPlan metadata: name: whizard-notification spec: extension: name: whizard-notification version: <VERSION> # From Step 1 enabled: true upgradeStrategy: Manual
Disable notification history:
yamlapiVersion: kubesphere.io/v1alpha1 kind: InstallPlan metadata: name: whizard-notification spec: extension: name: whizard-notification version: <VERSION> enabled: true upgradeStrategy: Manual config: | notification-history: enabled: false
Custom index format (monthly):
yamlnotification-history: sinks: opensearch: index: prefix: "{{ .cluster }}-notification-history" timestring: "%Y.%m"
| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | notification-history.enabled | bool | true | Enable notification history storage | | notification-history.sinks.opensearch.enabled | bool | true | Enable OpenSearch sink | | notification-history.sinks.opensearch.index.prefix | string | {{ .cluster }}-notification-history | Index prefix, supports template | | notification-history.sinks.opensearch.index.timestring | string | %Y.%m.%d | strftime format | | notification-history.ism_policy.enable | bool | false | Enable ISM policy | | notification-history.ism_policy.min_index_age | string | 7d | Minimum index retention |
| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | alertmanager.replicaCount | int | 1 | Replica count | | alertmanager.replicaAutoSet | bool | true | Auto set replicas by node count (<3=1, >=3=3) | | alertmanager.service.nodePort | int | 31093 | NodePort (alertmanager-proxy) | | alertmanager.config.group_wait | string | 30s | Alert aggregation wait time | | alertmanager.config.repeat_interval | string | 12h | Repeat alert interval | | alertmanager.config.route.receiver | string | Default | Default receiver | | alertmanager.config.inhibit_rules | list | see below | Inhibition rules (critical→warning→info) |
Default inhibit_rules:
critical alerts silence warning and info with same labelswarning alerts silence info with same labelsInfoInhibitor silences all info level alerts| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | notification-manager.notificationmanager.sidecar.tenant.resources.limits.cpu | string | 200m | Sidecar CPU limit | | notification-manager.notificationmanager.sidecar.tenant.resources.limits.memory | string | 512Mi | Sidecar memory limit | | notification-manager.notificationmanager.sidecar.tenant.resources.requests.cpu | string | 200m | Sidecar CPU request | | notification-manager.notificationmanager.sidecar.tenant.resources.requests.memory | string | 256Mi | Sidecar memory request | | notification-manager.operator.containers.operator.resources.limits.cpu | string | 50m | notification manager operator CPU limit | | notification-manager.operator.containers.operator.resources.limits.memory | string | 50Mi | notification manager operator memory limit | | notification-manager.operator.containers.operator.resources.requests.cpu | string | 5m | notification manager operator CPU request | | notification-manager.operator.containers.operator.resources.requests.memory | string | 20Mi | notification manager operator memory request | | notification-manager.notificationmanager.resources.limits.cpu | string | 500m | notification manager CPU limit | | notification-manager.notificationmanager.resources.limits.memory | string | 500Mi | notification manager memory limit | | notification-manager.notificationmanager.resources.requests.cpu | string | 5m | notification manager CPU request | | notification-manager.notificationmanager.resources.requests.memory | string | 20Mi | notification manager memory request | | notification-manager.notificationmanager.replicas | int | 1 | notification manager replicas |
| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | alertmanager-proxy.service.nodePort | int | 31093 | NodePort | | alertmanager-proxy.resources.limits.cpu | string | 500m | CPU limit | | alertmanager-proxy.resources.limits.memory | string | 500Mi | Memory limit | | alertmanager-proxy.resources.requests.cpu | string | 100m | CPU request | | alertmanager-proxy.resources.requests.memory | string | 100Mi | Memory request |
All APIs are at /kapis/notification.kubesphere.io/v2beta2/, routed through whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80. No authentication token is required.
The API supports two levels of resources:
| Level | URL Pattern | Resources | |-------|-------------|-----------| | Global | /{resources} | notificationmanagers, configs, receivers, routers, silences, secrets, configmaps | | Tenant | /users/{user}/{resources} | configs, receivers, silences, secrets, configmaps (NOT notificationmanagers or routers) |
Supported HTTP methods: GET (list/detail), POST (create), PUT (update), PATCH (patch), DELETE (delete).
Query parameters for list endpoints: name, labelSelector, type, page, limit, ascending, orderBy.
bashcurl -X GET "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/receivers" \
bashcurl -X GET "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/receivers?type=email" \
bashcurl -X GET "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/users/admin/receivers" \
bashcurl -X POST "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/receivers" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Receiver", "metadata": { "name": "email-receiver", "labels": { "type": "default" } }, "spec": { "email": { "emailConfigSelector": { "matchLabels": { "type": "default" } }, "to": ["user@example.com"], "tmplType": "html" } } }'
bashcurl -X POST "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/users/admin/receivers" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Receiver", "metadata": { "name": "email-receiver", "labels": { "type": "tenant", "user": "admin" } }, "spec": { "email": { "emailConfigSelector": { "matchLabels": { "type": "default" } }, "to": ["user@example.com"], "tmplType": "html" } } }'
bashcurl -X POST "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/users/admin/receivers" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Receiver", "metadata": { "name": "slack-receiver", "labels": { "type": "tenant", "user": "admin" } }, "spec": { "slack": { "slackConfigSelector": { "matchLabels": { "type": "default" } }, "channels": ["#alerts"], "alertSelector": { "matchLabels": { "severity": "critical" } } } } }'
bashcurl -X POST "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/receivers" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Receiver", "metadata": { "name": "dingtalk-receiver", "labels": { "type": "global" } }, "spec": { "dingtalk": { "dingtalkConfigSelector": { "matchLabels": { "type": "default" } }, "chatbot": { "webhook": { "value": "<CHATBOT_WEBHOOK>" }, "secret": { "valueFrom": { "secretKeyRef": { "name": "dingtalk-secret", "key": "secret" } } }, "keywords": ["Alert", "alert"], "atAll": false }, "alertSelector": {} } } }'
bashcurl -X POST "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/receivers" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Receiver", "metadata": { "name": "feishu-receiver", "labels": { "type": "global" } }, "spec": { "feishu": { "feishuConfigSelector": { "matchLabels": { "type": "default" } }, "chatbot": { "webhook": { "value": "<FEISHU_WEBHOOK>" }, "secret": { "valueFrom": { "secretKeyRef": { "name": "feishu-secret", "key": "secret" } } }, "keywords": ["Alert"] }, "user": ["<USER_ID>"], "department": ["<DEPT_ID>"] } } }'
bashcurl -X POST "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/users/admin/receivers" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Receiver", "metadata": { "name": "webhook-receiver", "labels": { "type": "tenant", "user": "admin" } }, "spec": { "webhook": { "webhookConfigSelector": { "matchLabels": { "type": "default" } }, "url": { "value": "https://example.com/webhook" }, "tmplType": "json" } } }'
bashcurl -X PUT "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/receivers/email-receiver" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Receiver", "metadata": { "name": "email-receiver", "labels": { "type": "default" } }, "spec": { "email": { "emailConfigSelector": { "matchLabels": { "type": "default" } }, "to": ["user@example.com", "admin@example.com"], "tmplType": "html" } } }'
bashcurl -X PATCH "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/receivers/email-receiver" \ -H "Content-Type: application/json" \ -d '{"spec": {"email": {"to": ["new@example.com"]}}}'
bashcurl -X DELETE "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/receivers/email-receiver"
bashcurl -X GET "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/silences"
bashcurl -X POST "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/silences" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Silence", "metadata": { "name": "maintenance-window" }, "spec": { "matchers": [ {"name": "alertname", "value": "KubeNodeReady"}, {"name": "namespace", "value": "default", "operator": "Equal"} ], "startAt": "2024-01-01T00:00:00Z", "endAt": "2024-01-02T00:00:00Z", "createdBy": "admin", "comment": "Scheduled maintenance" } }'
bashcurl -X POST "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/users/admin/silences" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Silence", "metadata": { "name": "tenant-maintenance", "labels": { "type": "tenant", "user": "admin" } }, "spec": { "matchers": [ {"name": "alertname", "value": ".*"} ], "startAt": "2024-01-01T00:00:00Z", "endAt": "2024-01-02T00:00:00Z", "createdBy": "admin", "comment": "Tenant maintenance window" } }'
bashcurl -X DELETE "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/silences/maintenance-window"
bashcurl -X POST "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/routers" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "notification.kubesphere.io/v2beta2", "kind": "Router", "metadata": { "name": "critical-alerts-router" }, "spec": { "receivers": ["email-receiver", "slack-receiver"], "alertSelector": { "matchLabels": { "severity": "critical" } } } }'
bash# Basic search curl -X GET "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/notifications/search?size=10" # Search with filters curl -X GET "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/notifications/search?alertname=KubeNodeReady&severity=critical&namespace=default&size=20&sort=startTime&order=desc" # Search with time range curl -X GET "http://whizard-telemetry-apiserver.extension-whizard-telemetry.svc:80/kapis/notification.kubesphere.io/v2beta2/notifications/search?start_time=1704067200&end_time=1704153600&size=50"
Notification Search Query Parameters:
| Parameter | Description | |-----------|-------------| | status | Alert status: firing, resolved (comma-separated) | | alertname | Alert name (comma-separated, exact match) | | alertname_fuzzy | Alert name fuzzy match | | alerttype | Alert type (comma-separated) | | alerttype_fuzzy | Alert type fuzzy match | | severity | Severity level (comma-separated) | | severity_fuzzy | Severity level fuzzy match | | namespace | Namespace (comma-separated) | | namespace_fuzzy | Namespace fuzzy match | | message_fuzzy | Alert message fuzzy match | | start_time | Start time (Unix timestamp, seconds) | | end_time | End time (Unix timestamp, seconds) | | sort | Sort field (e.g., startTime) | | order | Sort order: asc or desc (default: desc) | | from | Offset from result set (default: 0) | | size | Number of results (default: 10, max: 100) | | cluster | Cluster name |
bashkubectl get installplan whizard-notification kubectl get extension whizard-notification kubectl get extensionversion -l kubesphere.io/extension-ref=whizard-notification
bash# notification-manager operator + deployment kubectl get pods -n kubesphere-monitoring-system -l notification-manager=notification-manager # alertmanager kubectl get pods -n kubesphere-monitoring-system -l app.kubernetes.io/name=alertmanager # alertmanager-proxy kubectl get pods -n kubesphere-monitoring-system -l name=alertmanager-proxy
bash# notification-manager main process kubectl logs -n kubesphere-monitoring-system -l notification-manager=notification-manager -c notification-manager --tail=100 # tenant sidecar kubectl logs -n kubesphere-monitoring-system -l notification-manager=notification-manager -c tenant --tail=100 # operator kubectl logs -n kubesphere-monitoring-system -l control-plane=controller-manager --tail=100 # alertmanager kubectl logs -n kubesphere-monitoring-system -l app.kubernetes.io/name=alertmanager --tail=100
bashkubectl delete installplan whizard-notification
Diagnosis steps:
bash# 1. Check if notification-manager is running kubectl get pods -n kubesphere-monitoring-system -l notification-manager=notification-manager # 2. Check if alertmanager receives alerts kubectl logs -n kubesphere-monitoring-system -l app.kubernetes.io/name=alertmanager --tail=50 # 3. Check notification-manager logs kubectl logs -n kubesphere-monitoring-system -l notification-manager=notification-manager -c notification-manager --tail=100 | grep -i error # 4. Check if Receiver and Config exist kubectl get receivers,configs -n kubesphere-monitoring-system # 5. Check if silenced by Silence CR kubectl get silences
bash# 1. Check if vector aggregator is running kubectl get pods -n kubesphere-logging-system -l app.kubernetes.io/name=vector-aggregator # 2. Check if vector-sinks secret exists kubectl get secret vector-sinks -n kubesphere-logging-system # 3. Check OpenSearch indices exist # (requires OpenSearch API or Kibana)
bash# Check sidecar logs kubectl logs -n kubesphere-monitoring-system -l notification-manager=notification-manager -c tenant --tail=50 # Test sidecar API kubectl exec -n kubesphere-monitoring-system deploy/notification-manager -- \ curl -s "http://localhost:19094/api/v2/tenant?namespace=default"
bash# Check image tag config; manually set old tags block upgrades kubectl get installplan whizard-notification -n kubesphere-system -o yaml | grep -i image # Remove or update manually set image.tag in InstallPlan config
vector, and opensearch first if notification history is enabledvector-sinks Secretimage.tag to avoid pulling stale images| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,146 | 20,997 | +88% | 1 | 1 | 0% | 2,006 | 8,172 | +307% | 0 | 0 | — |
case-02 | fail→pass | 6,172 | 4,316 | -30% | 1 | 1 | 0% | 972 | 7,895 | +712% | 0 | 0 | — |
case-03 | fail→pass | 10,017 | 8,521 | -15% | 1 | 1 | 0% | 1,456 | 8,726 | +499% | 0 | 0 | — |
case-04 | fail→pass | 38,105 | 3,927 | -90% | 1 | 1 | 0% | 2,020 | 7,677 | +280% | 0 | 0 | — |
case-05 | fail→pass | 6,991 | 3,280 | -53% | 1 | 1 | 0% | 1,329 | 7,719 | +481% | 0 | 0 | — |
case-06 | fail→pass | 8,884 | 6,169 | -31% | 1 | 1 | 0% | 1,560 | 8,245 | +429% | 0 | 0 | — |
case-07 | fail→pass | 8,204 | 4,137 | -50% | 1 | 1 | 0% | 1,809 | 7,851 | +334% | 0 | 0 | — |
case-08 | fail→pass | 9,024 | 5,588 | -38% | 1 | 1 | 0% | 1,818 | 8,213 | +352% | 0 | 0 | — |
case-09 | fail→pass | 8,341 | 4,972 | -40% | 1 | 1 | 0% | 1,595 | 8,077 | +406% | 0 | 0 | — |
case-10 | fail→pass | 11,889 | 3,575 | -70% | 1 | 1 | 0% | 1,748 | 7,768 | +344% | 0 | 0 | — |
case-11 | fail→pass | 6,802 | 4,674 | -31% | 1 | 1 | 0% | 1,161 | 7,872 | +578% | 0 | 0 | — |
case-12 | fail→pass | 6,222 | 4,251 | -32% | 1 | 1 | 0% | 1,252 | 7,985 | +538% | 0 | 0 | — |
case-13 | fail→pass | 9,420 | 3,133 | -67% | 1 | 1 | 0% | 1,639 | 7,556 | +361% | 0 | 0 | — |
case-14 | fail→pass | 6,316 | 2,722 | -57% | 1 | 1 | 0% | 1,068 | 7,432 | +596% | 0 | 0 | — |
case-15 | fail→pass | 9,048 | 2,986 | -67% | 1 | 1 | 0% | 1,714 | 7,492 | +337% | 0 | 0 | — |
case-16 | fail→pass | 10,675 | 2,345 | -78% | 1 | 1 | 0% | 1,700 | 7,392 | +335% | 0 | 0 | — |
case-17 | fail→pass | 6,356 | 2,796 | -56% | 1 | 1 | 0% | 1,102 | 7,388 | +570% | 0 | 0 | — |
case-18 | fail→pass | 5,580 | 2,622 | -53% | 1 | 1 | 0% | 886 | 7,404 | +736% | 0 | 0 | — |
case-19 | pass→pass | 6,397 | 2,797 | -56% | 1 | 1 | 0% | 1,164 | 7,434 | +539% | 0 | 0 | — |
case-20 | pass→pass | 5,603 | 6,033 | +8% | 1 | 1 | 0% | 1,064 | 8,170 | +668% | 0 | 0 | — |
case-21 | pass→pass | 8,324 | 7,142 | -14% | 1 | 1 | 0% | 1,470 | 8,110 | +452% | 0 | 0 | — |
case-22 | pass→pass | 8,800 | 7,535 | -14% | 1 | 1 | 0% | 1,448 | 8,201 | +466% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +82 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.