Skip to content
Back to skills

Citedy Content Writer

ASecurity

From topic to published blog post in one conversation — generate SEO- and GEO-optimized articles with AI illustrations and voice-over in 55 languages, create social media adaptations for 9 platforms, set up automated content sessions, and manage product knowledge base. End-to-end blog autopilot. Powered by Citedy.

  • 18 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 26, 2026
content-marketinggoapisecurity

Works with

  • terminal
  • api
  • mcp

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned May 27, 2026

npx -y skills add citedy/citedy-seo-agent --skill citedy-content-writer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Citedy Content Writer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Citedy Content Writer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/citedy-citedy-content-writer/badge)](https://www.skillsdirectory.com/skills/citedy-citedy-content-writer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: citedy-content-writer
title: "AI Content Writer"
description: >
  From topic to published blog post in one conversation — generate SEO- and
  GEO-optimized articles with AI illustrations and voice-over in 55 languages,
  create social media adaptations for 9 platforms, set up automated content
  sessions, and manage product knowledge base. End-to-end blog autopilot.
  Powered by Citedy.
version: "1.0.0"
author: Citedy
tags:
  - content-marketing
  - seo
  - article-generation
  - social-media
  - blog-automation
  - writing
  - autopilot
metadata:
  openclaw:
    requires:
      env:
        - CITEDY_API_KEY
    primaryEnv: CITEDY_API_KEY
  compatible_with: "citedy-seo-agent@3.2.0"
privacy_policy_url: https://www.citedy.com/privacy
security_notes: |
  API keys (prefixed citedy_agent_) authenticate against Citedy API endpoints only.
  All traffic is TLS-encrypted.
---

# AI Content Writer — Skill Instructions

## Overview

**AI Content Writer** is an end-to-end blog autopilot powered by [Citedy](https://www.citedy.com/). It covers the entire content production pipeline in a single conversation:

1. **Research** — source URLs or topic input, optional web intelligence search
2. **Write** — SEO & GEO-optimized articles in 55 languages, 4 size presets
3. **Enhance** — AI illustrations, voice-over audio, internal link optimization, humanization
4. **Distribute** — social media adaptations for 9 platforms (X, LinkedIn, Facebook, Reddit, Threads, Instagram, Instagram Reels, YouTube Shorts)
5. **Automate** — cron-based autopilot sessions, scheduling, webhook notifications

No competitor offers the full pipeline in one agent skill.

---

## When to Use

Use this skill when the user wants to:

- Write a blog article from a topic or URL
- Create social media posts from an existing article
- Set up automated daily/weekly content publishing
- Manage a product knowledge base for AI-grounded articles
- Schedule and fill content calendar gaps
- Generate micro-posts across multiple platforms at once
- Select a writing persona (25 available)

---

## Setup

### 1. Get an API Key

Direct the user to: **https://www.citedy.com/dashboard/settings** → Team & API section.

API keys are prefixed `citedy_agent_`.

### 2. Register the Agent

```
POST https://www.citedy.com/api/agent/register
Content-Type: application/json

{
  "name": "My Content Agent",
  "description": "Automated blog content writer"
}
```

**Headers:** `Authorization: Bearer <CITEDY_API_KEY>`

**Response:**

```json
{
  "agent_id": "ag_xxxx",
  "status": "active",
  "blog_handle": "my-blog"
}
```

Store `agent_id` — it is required for session and webhook operations.

### 3. Verify Connection

```
GET https://www.citedy.com/api/agent/me
Authorization: Bearer <CITEDY_API_KEY>
```

---

## Core Workflows

### Workflow 1: URL to Article

Convert any web page, blog post, or competitor article into an original SEO-optimized article.

```
POST https://www.citedy.com/api/agent/autopilot
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "source_urls": ["https://example.com/some-article"],
  "language": "en",
  "size": "standard",
  "illustrations": true,
  "audio": false
}
```

After generation, adapt for social:

```
POST https://www.citedy.com/api/agent/adapt
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "article_id": "<returned_article_id>",
  "platforms": ["linkedin", "x_article"],
  "include_ref_link": true
}
```

---

### Workflow 2: Topic to Article

Write an article from a plain-text topic or title.

```
POST https://www.citedy.com/api/agent/autopilot
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "topic": "How to reduce churn in B2B SaaS",
  "language": "en",
  "size": "full",
  "persona": "saas-founder",
  "enable_search": true
}
```

---

### Workflow 3: Turbo Mode (Fast & Cheap)

For quick content at low cost. Two sub-modes:

| Mode     | Credits   | Description                        |
| -------- | --------- | ---------------------------------- |
| `turbo`  | 2 credits | Fast generation, no web search     |
| `turbo+` | 4 credits | Fast generation + web intelligence |

```
POST https://www.citedy.com/api/agent/autopilot
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "topic": "5 productivity hacks for remote teams",
  "mode": "turbo",
  "language": "en"
}
```

For turbo+, add `"enable_search": true`.

---

### Workflow 4: Social Adaptations

Adapt an existing article to up to 3 platforms per request.

```
POST https://www.citedy.com/api/agent/adapt
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "article_id": "art_xxxx",
  "platforms": ["x_thread", "linkedin", "reddit"],
  "include_ref_link": true
}
```

Available platforms: `x_article`, `x_thread`, `linkedin`, `facebook`, `reddit`, `threads`, `instagram`, `instagram_reels`, `youtube_shorts`

---

### Workflow 5: Autopilot Session (Automated Publishing)

Set up recurring content generation on a cron schedule.

```
POST https://www.citedy.com/api/agent/session
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "categories": ["SaaS", "productivity", "remote work"],
  "problems": ["user churn", "onboarding friction", "team alignment"],
  "languages": ["en"],
  "interval_minutes": 720,
  "article_size": "standard",
  "disable_competition": false
}
```

`interval_minutes: 720` = every 12 hours. Sessions run automatically and publish articles to the connected blog.

---

### Workflow 6: Micro-Post

Publish short-form content across platforms without writing a full article first.

```
POST https://www.citedy.com/api/agent/post
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "topic": "Why async communication beats meetings",
  "platforms": ["x_thread", "linkedin"],
  "tone": "professional",
  "contentType": "tip",
  "scheduledAt": "2026-03-02T09:00:00Z"
}
```

---

### Workflow 7: Knowledge Base (Products)

Ground articles with real product data. The AI references this during generation.

**Add a product:**

```
POST https://www.citedy.com/api/agent/products
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "name": "Citedy Pro",
  "description": "AI-powered blog automation platform",
  "url": "https://www.citedy.com/pricing",
  "features": ["autopilot", "SEO optimization", "55 languages"]
}
```

**List products:**

```
GET https://www.citedy.com/api/agent/products
Authorization: Bearer <CITEDY_API_KEY>
```

**Search products:**

```
POST https://www.citedy.com/api/agent/products/search
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "query": "pricing plans"
}
```

**Delete a product:**

```
DELETE https://www.citedy.com/api/agent/products/<product_id>
Authorization: Bearer <CITEDY_API_KEY>
```

---

### Workflow 8: Schedule Management

Check what content is planned and find gaps.

```
GET https://www.citedy.com/api/agent/schedule
GET https://www.citedy.com/api/agent/schedule/gaps
GET https://www.citedy.com/api/agent/schedule/suggest
```

Note: `schedule/suggest` is a REST-only endpoint — not available as an MCP tool.

All require `Authorization: Bearer <CITEDY_API_KEY>`.

---

### Workflow 9: Publish

Publish or schedule a social adaptation.

```
POST https://www.citedy.com/api/agent/publish
Authorization: Bearer <CITEDY_API_KEY>
Content-Type: application/json

{
  "adaptationId": "adp_xxxx",
  "action": "schedule",
  "platform": "linkedin",
  "accountId": "acc_xxxx",
  "scheduledAt": "2026-03-02T10:00:00Z"
}
```

`action` values: `now`, `schedule`, `cancel`

---

## Examples

### Example 1: Write Article from URL

**User:** "Write an article based on this post: https://competitor.com/best-crm-tools"

**Agent flow:**

1. Call `POST /api/agent/autopilot` with `source_urls: ["https://competitor.com/best-crm-tools"]`, `size: "standard"`, `language: "en"` — typically returns the full article inline (terminal `status: "generated" | "publishing" | "published"`); if the response is queued (`status: "processing"`), poll `GET /api/agent/articles/{id}` or wait for one of the `article.generated` / `article.published` / `article.failed` webhooks. On `article.failed` (or terminal `status: "failed"`), surface the error and skip the social-adaptations step
2. Return article title, URL, and word count to user
3. Ask: "Want social media adaptations? Which platforms?"

---

### Example 2: Daily Autopilot

**User:** "Set up daily articles about fintech in English and Spanish"

**Agent flow:**

1. Call `POST /api/agent/session` with `categories: ["fintech", "payments", "banking"]`, `languages: ["en", "es"]`, `interval_minutes: 720`, `article_size: "standard"`
2. Confirm session ID and next scheduled run
3. Optionally register webhook to notify user on each article completion

---

### Example 3: Turbo Mode

**User:** "Quickly write 5 short articles about remote work tips"

**Agent flow:**

1. For each topic, call `POST /api/agent/autopilot` with `mode: "turbo"`, `size: "mini"`
2. Run calls sequentially or note rate limits
3. Return list of generated article titles and links

---

### Example 4: Social Adaptations

**User:** "Take my latest article and make posts for LinkedIn, Reddit, and X"

**Agent flow:**

1. Call `GET /api/agent/articles` to find the latest article ID
2. Call `POST /api/agent/adapt` with `platforms: ["linkedin", "reddit", "x_thread"]`, `include_ref_link: true`
3. Return each adaptation with preview text
4. Ask: "Want to publish now or schedule?"

---

## API Reference

### POST /api/agent/autopilot

Generate a full blog article.

| Parameter             | Type     | Required                 | Description                                                                           |
| --------------------- | -------- | ------------------------ | ------------------------------------------------------------------------------------- |
| `topic`               | string   | one of topic/source_urls | Article topic or title                                                                |
| `source_urls`         | string[] | one of topic/source_urls | URLs to base the article on                                                           |
| `language`            | string   | no                       | Language code, default `en`. 55 languages supported                                   |
| `size`                | string   | no                       | `mini`, `standard`, `full`, `pillar`. Default `standard`                              |
| `mode`                | string   | no                       | `standard`, `turbo`. Default `standard`                                               |
| `enable_search`       | boolean  | no                       | Enable web intelligence. Default `false`                                              |
| `persona`             | string   | no                       | Writing persona slug (call GET /api/agent/personas, e.g. "musk", "hemingway", "jobs") |
| `auto_publish`        | boolean  | no                       | Publish immediately after generation. Default uses tenant setting (if unset, `true`)  |
| `illustrations`       | boolean  | no                       | Generate AI illustrations. Default `false`                                            |
| `audio`               | boolean  | no                       | Generate voice-over audio. Default `false`                                            |
| `disable_competition` | boolean  | no                       | Skip competitor analysis. Default `false`                                             |

**Response:**

```json
{
  "article_id": "art_xxxx",
  "status": "processing",
  "estimated_seconds": 45,
  "credits_reserved": 20
}
```

---

### GET /api/agent/articles

List generated articles.

| Parameter | Type    | Description                                            |
| --------- | ------- | ------------------------------------------------------ |
| `status`  | string  | Filter: `generated` (draft), `published`, `processing` |
| `limit`   | integer | Max results, default 20                                |
| `offset`  | integer | Pagination offset                                      |

---

### POST /api/agent/articles/{id}/publish

Publish a draft article (`status: "generated"` → `"published"`).

- 0 credits.
- Returns `{ article_id, status: "publishing", message }`.
- Only works on articles with `status: "generated"`. Other statuses return `409 Conflict`.
- Fires `article.published` webhook event.

---

### PATCH /api/agent/articles/{id}

Unpublish a published article (`status: "published"` → `"generated"`).

```json
{ "action": "unpublish" }
```

- 0 credits.
- Returns `{ article_id, status: "generated", message }`.
- Only works on articles with `status: "published"`. Other statuses return `409 Conflict`.
- Fires `article.unpublished` webhook event.

---

### DELETE /api/agent/articles/{id}

Permanently delete an article and its associated storage files (images, audio).

- 0 credits. Irreversible. Credits are NOT refunded.
- Returns `{ article_id, message: "Article deleted" }`.
- Fires `article.deleted` webhook event.

---

### POST /api/agent/adapt

Create social media adaptations from an article.

| Parameter          | Type     | Required | Description                             |
| ------------------ | -------- | -------- | --------------------------------------- |
| `article_id`       | string   | yes      | Source article ID                       |
| `platforms`        | string[] | yes      | 1–3 platforms per request               |
| `include_ref_link` | boolean  | no       | Append article backlink. Default `true` |

**Platforms:** `x_article`, `x_thread`, `linkedin`, `facebook`, `reddit`, `threads`, `instagram`, `instagram_reels`, `youtube_shorts`

---

### POST /api/agent/publish

Publish or schedule an adaptation.

| Parameter      | Type   | Required | Description                            |
| -------------- | ------ | -------- | -------------------------------------- |
| `adaptationId` | string | yes      | Adaptation ID from `/adapt`            |
| `action`       | string | yes      | `now`, `schedule`, `cancel`            |
| `platform`     | string | yes      | Target platform                        |
| `accountId`    | string | yes      | Connected social account ID            |
| `scheduledAt`  | string | no       | ISO 8601 datetime for scheduled action |

---

### POST /api/agent/session

Create an automated content session.

| Parameter             | Type     | Required | Description                                        |
| --------------------- | -------- | -------- | -------------------------------------------------- |
| `categories`          | string[] | yes      | Topic categories for generation                    |
| `problems`            | string[] | no       | Specific problems or pain points to cover          |
| `languages`           | string[] | no       | Language codes. Default `["en"]`                   |
| `interval_minutes`    | integer  | no       | Generation interval, 60-10080. Default `720` (12h) |
| `article_size`        | string   | no       | `mini`, `standard`, `full`, `pillar`               |
| `disable_competition` | boolean  | no       | Skip competitor analysis. Default `false`          |

---

### POST /api/agent/post

Create and publish a micro-post.

| Parameter     | Type     | Required | Description                                           |
| ------------- | -------- | -------- | ----------------------------------------------------- |
| `topic`       | string   | yes      | Post topic                                            |
| `platforms`   | string[] | yes      | Target platforms                                      |
| `tone`        | string   | no       | `professional`, `casual`, `humorous`, `authoritative` |
| `contentType` | string   | no       | `tip`, `insight`, `question`, `announcement`, `story` |
| `scheduledAt` | string   | no       | ISO 8601 datetime. Omit for immediate                 |

---

### GET /api/agent/personas

List all available writing personas.

No parameters required.

**Response:** Array of persona objects with `slug`, `name`, `description`, `style`.

---

### GET /api/agent/settings

Get current agent/blog settings.

---

### PUT /api/agent/settings

Update agent/blog settings.

| Parameter          | Type    | Description                     |
| ------------------ | ------- | ------------------------------- |
| `default_language` | string  | Default article language        |
| `default_size`     | string  | Default article size            |
| `auto_publish`     | boolean | Auto-publish generated articles |
| `default_persona`  | string  | Default persona slug            |

---

### POST /api/agent/products

Add a product to knowledge base.

| Parameter     | Type     | Required | Description          |
| ------------- | -------- | -------- | -------------------- |
| `name`        | string   | yes      | Product name         |
| `description` | string   | yes      | Product description  |
| `url`         | string   | no       | Product landing page |
| `features`    | string[] | no       | Key features list    |

---

### GET /api/agent/products

List all products in knowledge base.

---

### POST /api/agent/products/search

Semantic search over knowledge base.

| Parameter | Type   | Required | Description  |
| --------- | ------ | -------- | ------------ |
| `query`   | string | yes      | Search query |

---

### DELETE /api/agent/products/:id

Remove a product from knowledge base.

---

### GET /api/agent/schedule

Get current content schedule (upcoming articles, sessions).

---

### GET /api/agent/schedule/gaps

Find gaps in the content calendar where no articles are scheduled.

---

### GET /api/agent/schedule/suggest (REST only, not MCP tool)

Get AI-suggested topics to fill schedule gaps based on existing content and SEO opportunities.

---

### POST /api/agent/webhooks

Register a webhook endpoint for event notifications.

| Parameter | Type     | Required | Description                 |
| --------- | -------- | -------- | --------------------------- |
| `url`     | string   | yes      | HTTPS endpoint URL          |
| `events`  | string[] | yes      | Event types to subscribe to |
| `secret`  | string   | no       | HMAC signing secret         |

---

### GET /api/agent/webhooks

List registered webhooks.

---

### DELETE /api/agent/webhooks/:id

Remove a webhook registration.

---

### GET /api/agent/webhooks/deliveries

Get recent webhook delivery history with status codes and payloads.

---

### GET /api/agent/health

Check API availability.

---

### GET /api/agent/me

Get current agent profile, blog info, and credit balance.

---

### GET /api/agent/health

Check API health and readiness.

**Response:**

```json
{
  "status": "ok",
  "version": "3.0.0"
}
```

---

## Pricing

All costs in credits. **1 credit = $0.01 USD.**

### Article Generation

| Size       | Standard Mode | Description                  |
| ---------- | ------------- | ---------------------------- |
| `mini`     | 15 credits    | ~500 words, quick post       |
| `standard` | 20 credits    | ~1,000 words, full article   |
| `full`     | 33 credits    | ~2,000 words, in-depth piece |
| `pillar`   | 48 credits    | ~4,000 words, pillar content |

### Turbo Mode

| Mode     | Cost      | Notes                   |
| -------- | --------- | ----------------------- |
| `turbo`  | 2 credits | Fast, no web search     |
| `turbo+` | 4 credits | Fast + web intelligence |

### Extensions

| Extension                    | Cost                                          |
| ---------------------------- | --------------------------------------------- |
| +Intelligence (web search)   | +8 credits                                    |
| +Illustrations (per article) | +9–36 credits depending on count              |
| +Audio voice-over            | +10–55 credits depending on length & language |

### Micro-Post

| Endpoint          | Cost      |
| ----------------- | --------- |
| `/api/agent/post` | 2 credits |

### Social Adaptations

~5 credits per platform per article.

### Knowledge Base

Products storage is free. Semantic search costs minimal credits per query.

---

## Persona List

25 writing personas available. Pass the `slug` to `/api/agent/autopilot`. Call `GET /api/agent/personas` for the full dynamic list.

Example slugs: `"musk"`, `"hemingway"`, `"jobs"`, `"saas-founder"`, `"investigative-reporter"`, `"science-communicator"`, `"business-journalist"`, `"cto-engineer"`, `"data-scientist"`, `"marketing-strategist"`, `"comedian-writer"`, `"lifestyle-blogger"`, `"newsletter-writer"`, `"academic-researcher"`, `"creative-storyteller"`

---

## Webhook Event Types

Subscribe to these events when registering a webhook:

| Event                         | Triggered When                       |
| ----------------------------- | ------------------------------------ |
| `article.generated`           | Article generation completed         |
| `article.published`           | Article published (auto or manual)   |
| `article.unpublished`         | Article unpublished (→ draft)        |
| `article.deleted`             | Article permanently deleted          |
| `article.failed`              | Article generation failed            |
| `social_adaptation.generated` | Social post adaptation created       |
| `session.articles_generated`  | Recurring session published articles |
| `billing.credits_low`         | Balance below threshold              |
| `billing.credits_empty`       | Balance at 0                         |

---

## Rate Limits

| Endpoint               | Limit               |
| ---------------------- | ------------------- |
| `/api/agent/autopilot` | 10 requests/minute  |
| `/api/agent/adapt`     | 20 requests/minute  |
| `/api/agent/post`      | 30 requests/minute  |
| `/api/agent/products`  | 60 requests/minute  |
| All other endpoints    | 120 requests/minute |

Rate limit headers are included in all responses: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`.

---

## Limitations

- Social adaptation: maximum 3 platforms per `/api/agent/adapt` call
- Autopilot: `source_urls` maximum 5 URLs per request
- Knowledge base: maximum 500 products per account
- Webhooks: maximum 10 registered endpoints per account
- Article sizes above `standard` may take 60–180 seconds to generate
- `turbo` and `turbo+` modes do not support `illustrations` or `audio`
- Language support varies by persona — not all personas support all 55 languages

---

## Error Handling

All errors follow a consistent structure:

```json
{
  "error": {
    "code": "INSUFFICIENT_CREDITS",
    "message": "Not enough credits to complete this operation",
    "required": 20,
    "available": 5
  }
}
```

### Common Error Codes

| Code                   | HTTP Status | Description                      |
| ---------------------- | ----------- | -------------------------------- |
| `UNAUTHORIZED`         | 401         | Invalid or missing API key       |
| `INSUFFICIENT_CREDITS` | 402         | Not enough credits               |
| `RATE_LIMITED`         | 429         | Too many requests                |
| `ARTICLE_NOT_FOUND`    | 404         | Article ID does not exist        |
| `INVALID_PLATFORM`     | 400         | Unknown platform slug            |
| `SESSION_CONFLICT`     | 409         | Active session already exists    |
| `GENERATION_FAILED`    | 500         | AI generation error — retry safe |

### Agent Response Guidelines

When an error occurs:

1. **`INSUFFICIENT_CREDITS`** — Inform the user of current balance and required credits. Direct to: `https://www.citedy.com/dashboard/billing`
2. **`RATE_LIMITED`** — Wait for `Retry-After` header value before retrying. Do not spam requests.
3. **`GENERATION_FAILED`** — Retry once after 10 seconds. If it fails again, report the error and suggest trying a different topic or smaller size.
4. **`UNAUTHORIZED`** — Guide the user to check their API key at `https://www.citedy.com/dashboard/settings`.

---

## Response Guidelines for the Agent

- Always show the user the article title and URL after successful generation
- Article generation usually returns the article inline. Check the `/api/agent/autopilot` response `status`:
  - `"generated"`, `"publishing"`, or `"published"` (success-terminal) → the article payload is in the response; present `title`, `URL`, and `word_count` to the user.
  - `"failed"` (failure-terminal) → there is no usable article. Surface the error (`error.message` or `error.code`) to the user and follow your retry/fallback path. Do **not** treat this as a success.
  - `"processing"` or any other non-terminal value (e.g. when the transform pipeline returns 202 admission, or when async generation is requested) → use the response `id`/`article_id` and poll `GET /api/agent/articles/{id}` until `status` reaches a terminal value, or wait for the corresponding webhook (`article.generated`, `article.published`, `article.failed`).
- Present credit costs before starting expensive operations (full/pillar articles, audio)
- After generating an article, proactively offer social adaptations
- After social adaptations, offer to publish or schedule
- For autopilot sessions, confirm interval and categories with the user before creating

---

## Want More?

This skill covers the full content writing pipeline. Citedy also offers:

- **Video Shorts** — AI UGC viral video generation with voice and subtitles for TikTok, Reels, and YouTube Shorts
- **Trend Scouting** — Daily trending topic discovery from Hacker News, Reddit, and social signals
- **Content Ingestion** — Convert any YouTube video, podcast, or long-form document into a blog article
- **SEO Intelligence** — Competitor gap analysis, keyword tracking, and SERP monitoring

Explore the full suite: [https://www.citedy.com/tools](https://www.citedy.com/tools)

Files in this skill

  • README.md2.9 KB
  • SKILL.md25.5 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.