# Paste MCP Phase 1 Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Wire the Content Outbox and Call Prep pinboards into the linkedin-post, linkedin-carousel, and pilot-prep skills so every approved draft and call brief lands in Paste automatically.

**Architecture:** Two Paste pinboards are created first. Each skill gets one new instruction block at its natural completion point — after copy-review passes (linkedin-post), after final output is rendered (linkedin-carousel), and after the briefing is assembled (pilot-prep). Skills look up pinboard IDs by name via `mcp__paste__list_pinboards` at runtime rather than hardcoding IDs, so the wiring survives pinboard recreation.

**Tech Stack:** Paste MCP (`mcp__paste__create_pinboard`, `mcp__paste__list_pinboards`, `mcp__paste__create_item`), skill SKILL.md files (plain markdown instruction files, no code).

---

### Task 1: Create Content Outbox Pinboard

**Files:**
- No file changes — Paste MCP call only

- [ ] **Step 1: Create the pinboard**

Call `mcp__paste__create_pinboard` with name `Content Outbox`.

Expected response:
```json
{ "id": "content_outbox_XXXXXXXX-...", "name": "Content Outbox", "itemCount": 0 }
```

- [ ] **Step 2: Record the pinboard ID**

Note the `id` returned. It will be referenced in verification steps.

- [ ] **Step 3: Verify via list**

Call `mcp__paste__list_pinboards`. Confirm `Content Outbox` appears in the list alongside `Useful Links`.

---

### Task 2: Create Call Prep Pinboard

**Files:**
- No file changes — Paste MCP call only

- [ ] **Step 1: Create the pinboard**

Call `mcp__paste__create_pinboard` with name `Call Prep`.

Expected response:
```json
{ "id": "call_prep_XXXXXXXX-...", "name": "Call Prep", "itemCount": 0 }
```

- [ ] **Step 2: Verify via list**

Call `mcp__paste__list_pinboards`. Confirm both `Content Outbox` and `Call Prep` now appear.

- [ ] **Step 3: Commit a note**

```bash
cd /Users/sttil-solutions/projects/signal
git add docs/superpowers/plans/2026-06-09-paste-phase1.md
git commit -m "Add Paste Phase 1 implementation plan"
```

---

### Task 3: Update linkedin-post Skill

**Files:**
- Modify: `/Users/sttil-solutions/.claude/skills/linkedin-post/SKILL.md`

The current Step 6 handles NocoDB update after Kisa confirms the post is live. A new step goes between Step 5 (Iterate) and Step 6 (Confirm and Update NocoDB) — it fires when the draft is approved, not after posting. The Outbox is a staging layer: Kisa pastes from Paste to LinkedIn, then confirms to Claude, who updates NocoDB.

- [ ] **Step 1: Add the Paste push step**

In `/Users/sttil-solutions/.claude/skills/linkedin-post/SKILL.md`, insert the following block **between** the `## Step 5: Iterate` section and `## Step 6: Confirm and Update NocoDB`:

```markdown
---

## Step 5.5: Push Approved Draft to Paste Content Outbox

When Kisa says the draft is good (approval signals: "that works", "perfect", "use that", "looks good", or similar) — before waiting for posting confirmation:

1. Call `mcp__paste__list_pinboards` to get the current pinboard list.
2. Find the pinboard named `Content Outbox` and get its `id`.
3. Call `mcp__paste__create_item` with:
   - `content`: the full approved post text (exactly as drafted — no extra formatting)
   - `list_id`: the Content Outbox id from step 2
4. Confirm with one line: "Draft saved to Paste Content Outbox — paste directly to LinkedIn when ready."

Do not push unreviewed drafts. Only push after Kisa signals approval.
```

- [ ] **Step 2: Verify the file change**

Read the file. Confirm the new Step 5.5 block appears between Step 5 and Step 6. Confirm Step 6 is unchanged.

- [ ] **Step 3: Smoke test**

Invoke linkedin-post with a test prompt: "draft a short test post about documentation gaps."
After it drafts and copy-review passes, say "that works."
Confirm the skill calls `mcp__paste__list_pinboards` and then `mcp__paste__create_item`.
Call `mcp__paste__search` with `pinboard_id` set to the Content Outbox id — confirm the test draft appears.
Delete the test item via `mcp__paste__delete_item`.

- [ ] **Step 4: Confirm file saved**

Read the first 10 lines of `/Users/sttil-solutions/.claude/skills/linkedin-post/SKILL.md` to confirm the edit persisted. No git commit needed — `.claude/skills` is not a git repo.

---

### Task 4: Update linkedin-carousel Skill

**Files:**
- Modify: `/Users/sttil-solutions/.claude/skills/linkedin-carousel/SKILL.md`

The carousel output is a rendered PDF. The Paste push captures the text copy (hook, per-slide headlines and body) — not the PDF file. This gives Kisa a reviewable text record and reusable caption copy.

- [ ] **Step 1: Find the final output step**

Read `/Users/sttil-solutions/.claude/skills/linkedin-carousel/SKILL.md` in full. Identify the last step — the one where the rendered PDF path is reported to Kisa.

- [ ] **Step 2: Add the Paste push block**

Immediately after the final output/delivery step, append:

```markdown
---

## Final Step: Push Slide Copy to Paste Content Outbox

After confirming the PDF has rendered:

1. Assemble the carousel text copy in this format:
   ```
   CAROUSEL: [Title]
   
   HOOK: [Hook text from slide 1]
   
   SLIDE 2: [Headline]
   [Body copy if any]
   
   SLIDE 3: [Headline]
   [Body copy if any]
   
   [... continue for all slides ...]
   
   CTA: [Final slide CTA text]
   ```
2. Call `mcp__paste__list_pinboards`. Find `Content Outbox` and get its `id`.
3. Call `mcp__paste__create_item` with:
   - `content`: the assembled text copy above
   - `list_id`: the Content Outbox id
4. Confirm with one line: "Carousel copy saved to Paste Content Outbox. PDF at [path]."
```

- [ ] **Step 3: Verify the file change**

Read the file. Confirm the new block appears after the final delivery step and the format template is intact.

- [ ] **Step 4: Confirm file saved**

Read the last 20 lines of `/Users/sttil-solutions/.claude/skills/linkedin-carousel/SKILL.md` to confirm the new block is present.

---

### Task 5: Update pilot-prep Skill

**Files:**
- Modify: `/Users/sttil-solutions/.claude/skills/pilot-prep/SKILL.md`

The current Step 5 is "Offer a Practice Question (Optional)." The Paste push is a new Step 6 that fires after the briefing is assembled and the practice question is offered — so the full briefing is in Paste before the call, not just the summary.

- [ ] **Step 1: Add the Paste push step**

In `/Users/sttil-solutions/.claude/skills/pilot-prep/SKILL.md`, add the following block **after** `## Step 5: Offer a Practice Question (Optional)`:

```markdown
---

## Step 6: Push Briefing to Paste Call Prep

After delivering the briefing and the Step 5 practice question offer:

1. Call `mcp__paste__list_pinboards`. Find `Call Prep` and get its `id`.
2. Call `mcp__paste__create_item` with:
   - `content`: the full briefing text (all sections from Step 3, exactly as delivered)
   - `list_id`: the Call Prep id
3. Confirm with one line: "Briefing saved to Paste Call Prep — available in your clipboard on any device before the call."

This step is not optional. Push every briefing. Kisa clears the pinboard after the call.
```

- [ ] **Step 2: Verify the file change**

Read the file. Confirm Step 6 appears after Step 5. Confirm Steps 1-5 are unchanged.

- [ ] **Step 3: Smoke test**

Invoke pilot-prep with: "prep for my call with Robert Robinson."
After the briefing is delivered, confirm the skill calls `mcp__paste__list_pinboards` and `mcp__paste__create_item`.
Call `mcp__paste__search` with `pinboard_id` set to the Call Prep id — confirm the briefing appears.
Do not delete the test item — this is a real prep if Robert Robinson's call is upcoming.

- [ ] **Step 4: Confirm file saved**

Read the last 20 lines of `/Users/sttil-solutions/.claude/skills/pilot-prep/SKILL.md` to confirm Step 6 is present.

---

### Task 6: End-to-End Verification

- [ ] **Step 1: Verify pinboard state**

Call `mcp__paste__list_pinboards`. Confirm:
- `Content Outbox` exists
- `Call Prep` exists
- `Useful Links` still exists (default pinboard unchanged)

- [ ] **Step 2: Verify skill descriptions are updated**

Check that the `description:` frontmatter in each updated SKILL.md still accurately describes the skill. No change needed unless the description explicitly said "does not save anywhere."

- [ ] **Step 3: Update the spec to mark Phase 1 complete**

In `/Users/sttil-solutions/projects/signal/docs/superpowers/specs/2026-06-08-paste-mcp-ambient-layer-design.md`, update the Phase 1 status line to:

```markdown
### Phase 1: Content Outbox + Call Prep
**Trigger:** ~~Implement now~~ **COMPLETE — 2026-06-09**
```

- [ ] **Step 4: Final commit**

```bash
cd /Users/sttil-solutions/projects/signal
git add docs/superpowers/specs/2026-06-08-paste-mcp-ambient-layer-design.md
git commit -m "Mark Paste MCP Phase 1 complete"
```

---

## Notes

- Skills are instruction files (markdown), not application code. No unit tests apply. Verification is behavioral: invoke the skill, observe Paste.
- The `.claude/skills` directory may not be a git repo. Check with `git -C /Users/sttil-solutions/.claude/skills status` before committing. If not a repo, commits are skipped — file changes are sufficient.
- Paste auth must be active for smoke tests to work. If tools are unavailable, re-authenticate via `/mcp` in a separate Claude Code window before running verification steps.
- Phase 2 (Brand Vault) does not start until Phase 1 has been used across at least 2-3 real posts and calls and confirmed working.
