pm-prep
Use this skill to prepare an existing hitl (human-in-the-loop) issue for autonomous execution and promote it to afk — interactively resolving the human-judgment gaps (design decisions, ambiguous file targets, untestable acceptance criteria), writing the resolved answers into the issue body, and retagging hitl→afk once it clears an explicit readiness bar. It is the bridge between pm-triage (which assigns the hitl/afk label) and the autonomous pm-issue-to-pr pipeline (which only works the afk backlog). Trigger when the user says "prep this issue", "prep the hitl backlog", "make FUNC-12 afk-ready", "promote this to afk", "/pm-prep", or whenever an already-hitl issue needs to be specified well enough to run unattended; also proactively before handing a hitl issue to pm-issue-to-pr. NOT for classifying a brand-new issue as hitl vs afk at creation (that is pm-triage), and NOT for issues already labeled afk (nothing to promote).
What this skill does
# PM Prep
Take a `hitl` issue — one that needs a human at the wheel — sit with the operator long enough to resolve *what* needs the human, write those resolutions into the issue body, and once the issue is specified well enough to run unattended, promote it `hitl → afk`.
## Usage
```
/pm-prep [<issue-id>]
```
- `<issue-id>` *(issue key, optional)* — the `hitl` issue to prepare, e.g. `FUNC-12` (Linear) or `#42` (GitHub). Omit to discover the whole `hitl` backlog and walk it one issue at a time.
No flags. The two writes — the body edit, then the `hitl→afk` retag — are each confirmed interactively; nothing is written without approval.
## Why this skill exists
The plugin already has the two ends of this pipeline:
```
pm-triage → ??? (the gap) → pm-issue-to-pr
(assigns hitl|afk (promote hitl→afk (autonomously works
at triage time) once it's ready) the afk backlog)
```
`pm-triage` labels an issue `hitl` when it needs design judgment, manual verification, or has gaps that block mechanical execution. `pm-issue-to-pr` only picks up `afk` issues, and bounces anything underspecified back to `hitl` with a comment. Nothing in between *moves an issue across that line.* That promotion has always been a manual judgment the operator makes in their head and applies with a label.
The thing that actually makes an issue afk-ready is **content in the body**: filled-in sections, testable acceptance criteria, pinned-down file targets, a chosen design path. And no existing skill writes to the body — `pm-review` scores it, `pm-improve` drafts questions as a comment, `pm-triage` only labels. `pm-prep` fills exactly that gap: it's the interactive, body-editing, promotion-gated workflow that turns "a human needs to think about this" into "an agent can grind through this."
## When NOT to use it
- The issue is already `afk` — nothing to promote. (Offer `pm-review` if they want a structural check, or just hand it to `pm-issue-to-pr`.)
- The issue has **no** execution-mode label at all — that's a triage gap, not a prep job. Route to `pm-triage` first; come back once it's labeled `hitl`.
- The operator only wants a review or only wants enrichment — that's `pm-review` / `pm-improve` directly. `pm-prep` is the whole interactive promotion pass, not one slice.
## The afk-readiness bar
This is the contract the whole skill turns on. An issue is afk-ready when an agent could pick it up cold and finish it without stopping to ask a human. Concretely, mirror what `pm-issue-to-pr` needs to call an issue "actionable":
- **AC is always present and testable (invariant).** pm-prep ALWAYS ensures a present, testable Acceptance Criteria checklist before promotion — it adds the section if absent, rewrites vague items into mechanically-verifiable ones, and NEVER promotes to afk without it. This is not advisory: the `hitl → afk` retag is backed by an `AFK_GATE_NO_AC` code gate (see Step 8) that hard-fails the promotion when `## Acceptance Criteria` is missing or placeholder-only.
- **Every required section is filled** with real content — not a bracketed placeholder, `TBD`/`TODO`, an empty `- [ ]`, or just the heading. (Required sections come from the issue's type tag in the templates manifest.)
- **Acceptance criteria are mechanically verifiable** — each item names a behavior a test or a reviewer could check pass/fail. Vague verbs with no target ("improve performance", "clean up the UX", "handle edge cases") fail the bar. The test: *would a tester know whether this passed?*
- **File targets are unambiguous** — if the work touches code, the issue points at the files/modules or describes them specifically enough that an agent isn't guessing which `foo.js` is meant.
- **The design path is chosen** — no "we could do A or B, depends what we want." If there were forks needing a preference, the operator's choice is now written down.
- **No dependency on a human-only or inaccessible step** — no "needs UX sign-off", "wait for the vendor", "verify on the physical device", "reconcile against the finance ledger" baked into the critical path. Watch for these disguised as verification steps: an acceptance criterion that reads like an automatable check ("confirm the output matches the records") but actually needs a human or a system the agent can't reach is still a human gate.
- **The premise holds against the code** — if the issue asserts a cause ("the filter isn't escaped", "there's no retry logic", "the function ignores X"), check it against the actual source *before* writing acceptance criteria around it. This is the highest-leverage check on the whole list, because a confident-but-wrong premise is the most dangerous thing you can hand an autonomous agent: it has no human to sanity-check it mid-run, so it will faithfully implement a fix for a bug that doesn't exist, or rebuild a feature that's already there. When the code contradicts the issue, that's a gap to resolve — not something to paper over by writing the issue's wrong assumption into the AC.
A false premise does **not** automatically mean "hold" — it means "decide based on whether an agent can still finish unattended":
- **Reproducible + behavioral AC → promote (with the premise corrected).** If the bug reproduces deterministically and you can write the acceptance criteria around the *observable behavior* ("delta-sync returns the project's real issue set for an apostrophe-containing name, asserted by a test") instead of the wrong mechanism, an agent can reproduce → diagnose → fix → verify on its own. Correct the premise in the body, frame the AC behaviorally, and it earns `afk`.
- **Can't be reproduced without a human → hold.** If the real failure is intermittent, environment-specific, or nobody yet knows how to trigger it, then *diagnosis itself* is the human work — no behavioral AC can rescue it, because an agent can't even get to a red test. It stays `hitl` until someone pins down a deterministic repro.
If all of these hold, the issue earns `afk`. If even one *irreducibly* needs a human at execution time, it stays `hitl` — and the skill says exactly which one and why. That honesty is the point: a wrongly-promoted issue wastes an autonomous run and lands a bad PR.
## The prep pipeline (one issue)
Steps 1–6 are read-only and run without confirmation — they cost only tokens, and the operator needs the full picture before deciding. Steps 7–8 are the writes, each confirmed on its own.
### Step 1: Fetch the issue (live)
Read it fresh from the tracker — the same fetch `pm-review` uses (`linear issue view <ID> --json` via the GraphQL helper / `gh issue view <NUM> --repo <org/repo> --json ...`). Never prep from cache: the cache can carry a stale body or label set, and every decision here hinges on the *current* content.
If the tracker is unreachable, stop with a transport error. Do not prep from stale state.
### Step 2: Confirm it's a hitl issue
Check the labels:
- Has `hitl` → continue.
- Has `afk` already → nothing to promote. Tell the operator; offer a `pm-review` pass if they want to double-check it's actually ready.
- Has neither → this is a triage gap. Don't guess the mode. Route to `pm-triage` and stop.
### Step 3: Assess readiness — find the gaps
Run `pm-review` against the issue at its type tag. Capture which required sections are present / missing / placeholder-only, and whether the acceptance criteria are testable.
Then add the judgment layer `pm-review` deliberately won't: read the body and name *what specifically requires a human* — an unmade design decision, an ambiguous target, a verification that can't be automated. These are the items the interactive loop has to resolve. Hold them as the **gap list**.
Crucially, also **check the issue's premise against the actual code** here, while you have the repo open. If the issue claims a root cause or a missing capability, open the file it points at (or grep for it) and confirm the claim is true. A surprisinRelated in Ads & Marketing
ads
IncludedMulti-platform paid advertising audit and optimization skill. Analyzes Google, Meta, YouTube, LinkedIn, TikTok, Microsoft, and Apple Ads. 250+ checks with scoring, parallel agents, industry templates, and AI creative generation.
banana
IncludedAI image generation Creative Director powered by Google Gemini Nano Banana models. Use this skill for ANY request involving image creation, editing, visual asset production, or creative direction. Triggers on: generate an image, create a photo, edit this picture, design a logo, make a banner, visual for my anything, and all /banana commands. Handles text-to-image, image editing, multi-turn creative sessions, batch workflows, and brand presets.
rpg-migration-analyzer
IncludedAnalyzes legacy RPG (Report Program Generator) programs from AS/400 and IBM i systems for migration to modern Java applications. Extracts business logic from RPG III/IV/ILE source code, identifies data structures (D-specs), file operations (F-specs), program dependencies (CALLB/CALLP), and converts RPG constructs to Java equivalents. Generates migration reports, complexity estimates, and Java implementation strategies with POJO classes, JPA entities, and service methods. Use when modernizing AS/400 or IBM i legacy systems, analyzing RPG source files (.rpg, .rpgle, .RPGLE), converting RPG to Java, mapping data specifications to Java classes, planning legacy system migration, or when user mentions RPG analysis, Report Program Generator, RPG III/IV/ILE, AS/400 modernization, IBM i migration, packed decimal conversion, or mainframe application rewrite.
brand-library-architect
IncludedBuild a complete brand library for a product — visual asset render pipeline, brand documentation set (BRAND, COPY, MANIFESTO, BIOS, FAQ, GLOSSARY, TONE, PRICING), open-source convention files (README, CONTRIBUTING, SECURITY, CODE_OF_CONDUCT), and a self-contained press kit. This skill should be used when the user asks to "build a brand library / brand kit / press kit / brand assets" for a product, "set up a brand library workflow," "create a positioning manifesto plus visual identity," or any combination of brand documentation + visual asset pipeline. Apply phase-by-phase or run end-to-end. Templates are product-agnostic and use {{TOKEN}} placeholders the skill prompts the user to fill.
writing-tech-post
IncludedAuthors engineering blog posts end-to-end: launch deep-dives, incident postmortems, architecture migrations, performance case studies, tutorials, AI/agent system writeups, security disclosures, and research-to-product translations. Picks the correct archetype, plans the abstraction ladder, enforces an evidence cadence (diagrams, benchmarks, profiles, traces, code, ablations), tunes voice against publisher house styles (Datadog, Vercel, GitHub, AWS, Meta, Cloudflare, Jane Street), and runs a pre-publish gate for narrative momentum and disclosure ethics. Use when drafting a new engineering post, restructuring a draft that feels flat, deciding which evidence form belongs where, validating that depth and product context are balanced, or preparing a postmortem, migration, or performance narrative for external publication. Do not use for API reference documentation, README authoring, marketing copy, release notes, generic SEO content, ghost-written executive thought leadership, or non-engineering long-form essays.
blog-google
IncludedGoogle API integration for blog performance: PageSpeed Insights, CrUX Core Web Vitals with 25-week history, Search Console performance, URL Inspection, Indexing API, GA4 organic traffic, NLP entity analysis for E-E-A-T, YouTube video search for embedding, and Google Ads Keyword Planner. Progressive feature availability based on credential tier (API key, OAuth/service account, GA4, Ads). Shares config with claude-seo at ~/.config/claude-seo/google-api.json. Use when user says "google data", "page speed", "core web vitals", "search console", "indexation", "GA4", "keyword research", "nlp entities", "blog performance", "youtube search", "google api setup".