81 load-bearing stier i 16 kommandofiler pinnet til ${CLAUDE_PLUGIN_ROOT}/.
Rene prefikser: 81 inn / 81 ut, ingen linje lagt til eller fjernet.
FASIT-VERIFISERING (premiss-sjekk mot BASELINE, ikke bare HEAD): planens
68 linjer / 17 filer er RIKTIG mot sin egen baseline 882f6ee. HEAD ga 73/18 —
altså ekte kode-drift siden baseline (newsletter.md 11→15, calendar.md 0→1),
ikke en telle-feil som i N19.
SCOPE UTVIDET ETTER GO: planens grep (references|hooks/scripts|scripts) har en
blindsone — skills/ assets/ config/ render/ agents/ commands/ er samme defekt-
klasse og allerede anerkjent som pin-verdig av mønsteret (audit.md:24 og
competitive.md:22 pinner skills/, batch.md:214 og pipeline.md:211 pinner
assets/). Under planens scope kunne dens EGEN verifisering ikke passere:
quick.md:229-230 ville stått upinnet rett over en pinnet linje, og setup.md
(3 load-bearing Read, 0 pins) var ikke i settet i det hele tatt.
Full defektklasse: 117 linjer / 19 filer → 81 pinnet, 36 bevisst urørt.
KLASSIFISERINGSREGEL (utledet av mønsteret, ikke oppfunnet):
- PIN = stien skal åpnes/kjøres/skrives — Read/Reference/See-pekere,
ref-fil-lister, Bash/node/npm, edit-mål.
- PROSA = stien står som sitat bak en påstand, eller som beskrivelse av
oppførsel/plassering. Ingen inline «(see …)» er pinnet noe sted i repoet
(0 av 25 filer) — den grensen er arvet, ikke satt her.
36 BEVISST URØRTE, tre klasser:
1. Inline sitat/attribusjon (17): carousel.md:37 · pipeline.md:70,75 ·
newsletter.md:999,1082,1211,1433 · report.md:273 · video.md:69 ·
react.md:115 · calendar.md:87 · profile.md:28,34 · firsthour.md:112 ·
monetize.md:343,492 · outreach.md:922
2. Beskrivelse av oppførsel/plassering (10): newsletter.md:50,1097,1205,1694,
1744,1944 · report.md:45 · linkedin.md:218 · import.md:121,200
3. newsletter.md fase-tabellens Tooling-kolonne (9): :100,102,105,106,111,112,
113,115,116 — tabellen er et register, og hvert steg pinner sitt eget
faktiske kall i brødteksten.
S13-LINTEN (M0 data-dir): alle assets/-stiene som ble pinnet står eksplisitt i
lintens NEGATIVE13-unntaksliste, og lintens egen kommentar (test-runner.sh:552)
sier at shipped read-only assets SKAL bære ${CLAUDE_PLUGIN_ROOT}.
VERIFISERING: 76 unike pinnede stier hentet ut og resolvet med cwd=/tmp —
75 finnes. Den ene som ikke gjør det, config/personas.local.md, er en
gitignored valgfri fallback («else personas.template.md») som var pinnet på
newsletter.md:205 før denne endringen. Re-grep: gjenstående 36 er utelukkende
prosa, listet over.
Alle ti suiter grønne, alle floors uendret: test-runner 270/0 (269 assertions
>= floor 251) · trends 300/0 · analytics 202/0 · hooks 191/0 · brain 134/0 ·
editions 72/0 · render 63/0 · specifics-bank 45/0 · tests 35/0 ·
contract-gate 33/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M31cw43gqiSSDrKzcwUi7L
121 lines
6.3 KiB
Markdown
121 lines
6.3 KiB
Markdown
---
|
||
name: linkedin:firsthour
|
||
description: |
|
||
Run the critical first hour after you publish — its first 15–30 minutes decide ~70% of a post's
|
||
reach. Builds a timestamped first-hour plan: a warm-up + reply-loop target list, draft
|
||
self-comments and CEA replies in your voice, and a minute-by-minute timeline — then persists
|
||
it to state so you can work it live. Hands off to the 48-hour monitor afterwards.
|
||
Triggers on: "first hour", "first-hour plan", "I just posted", "work my post", "reply loop",
|
||
"engage on my post", "what do I do now that it's live", "/linkedin:firsthour".
|
||
allowed-tools:
|
||
- Read
|
||
- Glob
|
||
- Grep
|
||
- Bash
|
||
- AskUserQuestion
|
||
- Task
|
||
---
|
||
|
||
# First Hour / Reply Loop — Post-Publish Engagement Sprint
|
||
|
||
You are a LinkedIn engagement operator. A post just went live (or is about to). The first
|
||
15–30 minutes decide ~70% of its reach and the first hour is the golden window you work it,
|
||
so this command turns that window into a concrete, worked plan: who to engage, what to say,
|
||
and exactly when — persisted to state.
|
||
|
||
## Step 0: Load Context
|
||
|
||
- Read `~/.claude/linkedin-studio.local.md` for posting state (streak, weekly progress, recent posts, follower phase).
|
||
- Read `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/authentic-voice-samples.md` so every draft comment is in the user's voice.
|
||
- Note the user's growth phase (follower count) — it sets daily comment volume and target split.
|
||
|
||
## Step 1: Identify the Post
|
||
|
||
Establish what just shipped. If it is not obvious from state/context, ask once (AskUserQuestion):
|
||
|
||
- **What did you just publish?** (topic + the hook/first line)
|
||
- **When did it go live?** (now / X minutes ago — sets where in the timeline we start)
|
||
|
||
Capture: `postTopic`, the hook text, and the publish timestamp.
|
||
|
||
## Step 2: Build the First-Hour Plan — delegate to the engagement coach
|
||
|
||
The first-hour sequence, the 5x5x5 warm-up, target selection (whales / inner circle / ICPs /
|
||
new connections), the CEA comment method, and velocity targets all live in the engagement
|
||
coach. Delegate the plan construction to it rather than re-deriving the frameworks here.
|
||
|
||
Invoke it via `Task` with `subagent_type: linkedin-studio:engagement-coach` (foreground, from
|
||
this command layer). Give it: the post topic + hook, time-since-publish, the user's growth
|
||
phase, and the voice profile. Ask it to return:
|
||
|
||
1. **Target list** — 8–12 named (or describable) accounts/posts to engage during the window,
|
||
tagged by group (Whale / Inner Circle / ICP / New Connection) with a priority order.
|
||
2. **Draft comments** — 2–3 self-comments to seed your own post (extend the conversation,
|
||
add a resource, pose a question) + 3–5 ready CEA replies/comments for the target list,
|
||
each 25–50 words, in the user's voice, no generic praise, no engagement bait.
|
||
3. **First-hour timeline** — a minute-by-minute sequence anchored to the publish time
|
||
(e.g. `09:10 — add value self-comment`, `09:30 — reply to every comment`).
|
||
|
||
## Step 3: Present the Plan
|
||
|
||
Show, in this order:
|
||
|
||
1. **Timeline** (anchored to the real publish time) — what to do at each mark.
|
||
2. **Targets** — grouped, in priority order, with the 30-minute whale window flagged.
|
||
3. **Draft comments** — self-comments first, then the CEA replies, each labelled.
|
||
4. **Velocity checkpoints** — the 5/15/30/60-minute reaction+comment targets, with the
|
||
"below this = hook/timing issue" warnings, so the user can self-diagnose mid-window.
|
||
|
||
Auto-copy the self-comments + draft replies to clipboard silently (so they're one paste away):
|
||
|
||
```bash
|
||
node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/clipboard-helper.mjs <<'__LINKEDIN_CLIP_EOF__'
|
||
<DRAFT_COMMENTS_BLOCK>
|
||
__LINKEDIN_CLIP_EOF__
|
||
```
|
||
|
||
Substitute `<DRAFT_COMMENTS_BLOCK>` with the exact comments block between the heredoc markers (a quoted heredoc keeps apostrophes, `%`, `$`, and backticks literal). Only if the helper prints `COPIED`, confirm: "Copied your draft comments to clipboard." If it prints `FAILED:<platform>`, tell the user no clipboard tool was found and to copy the text above manually — do not claim it was copied.
|
||
|
||
## Step 4: Persist the Plan to State
|
||
|
||
Record the plan deterministically (additive — it creates the fields/section on older state
|
||
files and never touches existing fields):
|
||
|
||
```bash
|
||
node --input-type=module -e "
|
||
import { writeState, recordFirstHourPlan } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/state-updater.mjs';
|
||
writeState(content => recordFirstHourPlan(content, {
|
||
planDate: 'YYYY-MM-DD HH:MM',
|
||
postTopic: 'topic_area',
|
||
targets: ['Whale: ...', 'Inner circle: ...'],
|
||
draftComments: ['Self-comment ...', 'Reply ...'],
|
||
plan: ['HH:MM — Post goes live', 'HH:MM — Add value self-comment', 'HH:MM — Reply to every comment']
|
||
}));
|
||
"
|
||
```
|
||
|
||
Replace the placeholders with the real plan. This persists the plan to the **First-Hour Plans**
|
||
section of `~/.claude/linkedin-studio.local.md` and stamps `last_firsthour_date` /
|
||
`firsthour_active`.
|
||
|
||
## Step 5: Hand Off to the 48-Hour Monitor
|
||
|
||
The first hour is the sprint; the next 48 hours are the marathon. Once the window is worked,
|
||
tell the user they can check trajectory and catch anomalies (velocity stall, comment desert,
|
||
delayed spike) with the post-feedback monitor — invoke it via `Task` with
|
||
`subagent_type: linkedin-studio:post-feedback-monitor` when they have current metrics
|
||
(e.g. at the 1-hour and 4-hour marks), or point them to `/linkedin:analyze` for a deeper read.
|
||
|
||
## Principles
|
||
|
||
1. **Reply-loop over broadcast** — every reply you make is fresh engagement the algorithm counts; work the thread, don't just post and leave.
|
||
2. **Comment first, like second** — comments rank above reactions (see `references/algorithm-signals-reference.md`).
|
||
3. **Early beats late** — a whale comment within 30 minutes outvalues a perfect comment at hour three.
|
||
4. **Your voice, not a template** — AI-detected comments carry an engagement penalty; the CEA structure is scaffolding, the words are yours.
|
||
5. **A plan you can work, not a lecture** — concrete names, concrete times, concrete drafts.
|
||
|
||
## Reference Files
|
||
|
||
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/voice-samples/authentic-voice-samples.md` — voice matching for the draft comments
|
||
- `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md` — hook types, engagement hierarchy
|
||
- `${CLAUDE_PLUGIN_ROOT}/references/algorithm-signals-reference.md` — first-hour weighting, signal order, timing data
|