Skip to content
Back to skills

Product Spine

ASecurity

Help an engineer act as product owner: suggest parallel work threads (features, improvements, fixes) from the repo, then draft, review, and capability-check the one-pager, epics, and briefs that land them. Writes artefacts, never code. Answers "can the platform do X?" from the project's own primer.

  • 7 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 22, 2026
ai-agentsgo

Works with

  • claude code
  • cursor

Security analysis

A100/100

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

Scanned October 22, 2026

npx -y skills add renzrollon/shippable-skills --skill product-spine --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Product Spine?

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

Security grade badge for Product Spine
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/renzrollon-product-spine/badge)](https://www.skillsdirectory.com/skills/renzrollon-product-spine)

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: product-spine
description: >-
  Help an engineer act as product owner: suggest parallel work threads
  (features, improvements, fixes) from the repo, then draft, review, and
  capability-check the one-pager, epics, and briefs that land them. Writes
  artefacts, never code. Answers "can the platform do X?" from the project's
  own primer.
license: MIT
argument-hint: "threads | draft <one-pager|epic|brief> | review <file> | capability \"<question>\""
disable-model-invocation: true
metadata:
  version: 0.3.0
---

**Bare invocation runs threads, this turn, with no question.** If the
invocation has no arguments (bare `/product-spine`) or the only argument is
`threads`, you are already in threads mode: do **not** ask "which mode?", do
**not** print a mode menu, do **not** wait for confirmation. Go straight to
Step 2, gather, and output the mermaid `## Thread map` with cards before you
stop. Only an explicit `draft`, `review`, or `capability` argument (or its
natural-language equivalent) selects another mode. A bare invocation is never a
prompt to disambiguate.

Help an **engineer act as product owner**. Default is **threads**: look at
the repo, fan out read-only gathers, and propose several next pieces of work
(features, improvements, fixes) on a mermaid map. Picking a thread **lands**
it on the product spine: a live **one-pager** (strategy), **epics** (features
in flight, each named against a strategy bet), and **briefs** (what / why
for a change proposal). Three paths:

- `docs/product/one-pager/current.md`
- `docs/product/epics/*.md` (sibling folder `docs/product/epics/<slug>/`)
- `docs/product/briefs/*.md`

```
one-pager   docs/product/one-pager/current.md
            §3 strategy bets · §4 roadmap initiatives
                ^
                |  Ladders to: ... §4 <initiative heading>
epics       docs/product/epics/*.md
            features in flight, each named against a bet
                ^
                |  Part of: <epic path>
                |  or Ladders to: the one-pager initiative (no epic yet)
briefs      docs/product/briefs/*.md
            what / why / ladder / primer for a change proposal
```

Cite the **heading text** on ladder lines, not only a section number, so a
project template with other numbering still greps. This skill is
**host-neutral**: it runs on Cursor, Copilot, Codex, Claude Code, and any
other Agent Skills host. It does not name a vendor agent, a platform product,
or a host slash for executing work. Call the Task tool for fan-out (or the
host's equivalent subagent tool). Do not Call the Skill tool with another
user-invoked skill.

Threads are **chat-only** until the user picks one. Draft writes a file plus
a short chat reply. Never re-dump the file into chat.

Templates, Status, threads fan-out, and draft question ladders live in
[references/](references/threads-mode.md). Org-specific platform vocabulary
lives in `docs/product/context/` if the project supplied it; this skill
never invents it. See [references/context-folder.md](references/context-folder.md).

---

## Firm rules (non-negotiable)

1. **Never writes code** and never edits outside `docs/product/**`. Never
   write `openspec/changes/**`. A request to implement gets a one-line
   refusal pointing at the brief (or epic): this skill's job is the artefact,
   not the implementation. If the turn asks to implement (in `src/`, a
   patch, a function, "then build it"), refuse and stop. Do not
   draft-and-then-code in the same turn. Threads mode writes **no** files.
2. **Never invents** metrics, baselines, capabilities, or platform vocabulary.
   Absent input is stated as absent (`baseline: unknown`, `primer absent`,
   `thin`), never filled in.
3. **Decisions live inline** (brief §4, epic §5, one-pager §1 change log). No
   separate decisions log, no ADR, no threads file on disk.
4. **New briefs and epics are always saved `Status: draft`.** This skill never
   flips a file to `ready` or `ready-to-propose`. Review reports whether the
   user could.
5. **One question per turn** in draft mode, capped per artefact. Inline
   context counts as answered (including a picked threads card), never
   re-asked. Empty-handed is fine: start the ladder. When the remaining
   fields have a legal TBD / unknown form and the required ones are present,
   write the file this turn instead of blocking.
6. **Never block on I/O.** Every read, list, and write in this skill is
   best-effort. If a call is denied, errors, or the file is absent, treat it as
   unavailable and proceed immediately from what you already hold. Do not retry
   a denied or failed call, and do not guess alternate paths for it.
7. **Lo-fi first.** Never generate a hi-fi mockup. Point at the epic's sibling
   folder (`docs/product/epics/<slug>/mockups/`) for a lo-fi mockup. Do not
   create mockup files.
8. **Threads cite evidence** (paths on disk) or mark `Confidence: thin`.
   Fan-out subagents are read-only. The visual is a mermaid diagram in chat,
   not a vendor canvas.

---

## Output contract (non-negotiable)

Downstream greps these strings. Keep the parsed tokens exact.

**Threads reply** (no file write) always includes:

- a fenced mermaid diagram (language tag `mermaid`)
- `## Thread map` and `## Threads`
- at least one of `Feature`, `Improvement`, `Fix` as a kind label
- numbered cards starting at `1.`
- a closer telling the user to pick a number to draft, or name `review` /
  `capability`

Never write `Status: ready` or `ready-to-propose` in this mode.

**Draft file** (brief or epic) always contains `Status: draft` and exactly one
of `Part of:` / `Ladders to:`. Never write `Status: ready` or
`ready-to-propose`. A brief also has `Suggested change:` (kebab-case).

**Draft chat reply** (do not paste the file body) always includes:

- the path written
- the line `Status: draft`
- the `Part of:` or `Ladders to:` line copied verbatim
- exactly one open item
- for a brief: tell the user to pass this path to their change-proposal
  skill (do not Call that skill)

**Review reply** is the block only:

```
## Review: <path>

**Strong**
**Missing**
**Ladder**
**Platform pieces**
<ready line>
**Next step**
```

Ready line is exactly one of:

- brief: `**Ready to propose: yes**` or `**Ready to propose: no** (<reason>)`
- epic: `**Ready to flip: yes**` or `**Ready to flip: no** (<reason>)`

Omit it for a one-pager. **Next step** is exactly one item. Put the yes/no
inside the bold label so the greps `Ready to propose: no` and
`Ready to flip: no` match.

**Capability reply** is the block only:

```
**Answer**: Yes today | No today | Partly | Cannot confirm
**From the primer**
**Nearest alternative that works today**
**Gap to record**
```

`Gap to record` is a proposed one-line entry for `capability-gaps.md`. Do not
write that file unless asked. With **no primer on disk**, Answer is
`Cannot confirm`, name the missing path
`docs/product/context/platform-primer.md`, and assert nothing else (no
`Yes today`, no invented alternative). Offer the skeleton in
[references/context-folder.md](references/context-folder.md).

---

## Input

| Arg / mode | Meaning |
|------------|---------|
| _(none)_ or `threads` | Engineer-as-PO: fan out, mermaid map, numbered threads. No file write. |
| `draft one-pager` / `draft epic` / `draft brief` | Write that artefact. `draft task` maps to `draft brief`. |
| `draft N` / `land N` | Draft the Nth card from this conversation's threads reply. |
| `review <file>` | Read-only checklist on that path. |
| `capability "<question>"` | Can the platform do this today, from the primer only. |

Natural language maps to the same modes: "what should we build next" /
"suggest features" (`threads`), "draft an epic for X" (`draft epic`),
"draft a brief for Y" / "draft a task for Y" (`draft brief`), "review
`docs/product/briefs/foo.md`" (`review`), "can users retry a payment?"
(`capability`). These phrasings **are** invocations of this skill, not
free-form PM chat.

---

## Steps

### 0. Mode and code gate (before any write)

Parse the mode from the args or the natural-language map. If the turn asks for
implementation (code, a patch, `src/`, "then implement", "build it"), **make
no code edits**. Reply in one line that this skill writes the artefact, not
code, point at the brief path if one exists, and stop. Skip later steps.

- `draft` / `review` / `capability` when those words (or their map) are
  present, including `draft N` after a threads reply.
- **Otherwise** (no args, bare `/product-spine`, `threads`, "what's next",
  "suggest features"): run **threads** now, this turn. Never reply with a mode
  menu or a "which mode?" question: bare invocation **is** threads, not a
  prompt to disambiguate. Gather (fan-out, or sequential if the host has no
  subagent tool), then emit the mermaid `## Thread map` and cards. Empty-handed
  still emits a map, marked `thin`. Do **not** list modes and stop.

### 1. Gather

**Threads:** skip a parent-only crawl. Follow
[references/threads-mode.md](references/threads-mode.md): Call the Task tool
2 to 4 times in one turn (Spine, Surfaces, Friction). If the host has no
subagent tool, run those briefs sequentially this turn.

**Draft / review / capability:** best-effort, **one plain command per call**,
literal paths: no `$HOME` / `~` expansion, no `for` loops, no `;`-chaining.
Skip any call that is denied, errors, or is absent, the first time. State
which inputs are absent.

Read or list, each once:

- `docs/product/one-pager/current.md` (and `docs/product/one-pager/TEMPLATE.md`
  if present: then use **that** file's headings and numbering)
- list `docs/product/epics/*.md`
- list `docs/product/briefs/*.md`
- directory names under `openspec/changes/` (absence is fine; do not write)
- `docs/product/context/platform-primer.md`
- `docs/product/context/capability-gaps.md`
- list `docs/product/context/golden-path/*.md`
- this skill's `references/*.md` (resolve relative to **this skill
  directory**)

Do not invent a fourth context path. Golden Path docs are optional; if the
folder is missing, say so and continue.

### 2. Threads mode

Read [references/threads-mode.md](references/threads-mode.md) and follow it.
Synthesize 4 to 8 cards mixing Feature / Improvement / Fix (fewer if evidence
is thin, at least two). Each card: kind, title, need, evidence paths,
artefact (`brief` or `epic`), ladder, `grounded` or `thin`.

Emit the Thread map mermaid (subgraphs `now`, `next`, `later`) then the
cards, then the pick-to-draft closer. Write nothing to disk.

### 3. Draft mode

Read [references/draft-mode.md](references/draft-mode.md) for question
ladders, write paths, and "write this turn" rules. Always `Status: draft`.
Exactly one of `Part of:` / `Ladders to:`. A picked threads card counts as
inline context.

### 4. Review mode (read-only, never edits)

Read the named file once. Run the matching checklist. Emit the Review block.
Do not edit the file, and do not flip `Status`.

**Brief**

- Status line present.
- Exactly one ladder line, and its target exists on disk (epic file, or a
  §4 heading in `current.md` whose text matches).
- `Suggested change:` is kebab-case.
- §1 names who, friction, outcome.
- §2 uses primer vocabulary and invents nothing (flag invented platform
  words; if primer absent, §2 must say so).
- §3 names In and Out (not only TBD) for ready-to-propose.
- §4 records a trade-off or says none.
- No implementation step list and no acceptance checkboxes (wrong artefact:
  a **Missing** item).
- Optional `Change:`: if present, the matching `openspec/changes/<slug>/`
  folder may exist (claimed but absent is **Missing**, not a write).

**Epic**

- Ladder to a real §4 heading in `current.md`.
- Three-line problem.
- Out of scope named.
- §4 brief list versus `docs/product/briefs/*.md` that claim `Part of:` this
  epic.
- Sibling folder `docs/product/epics/<slug>/` present (missing is a
  **Missing** item, not a write).

**One-pager**

- Sections present (or the project's TEMPLATE headings).
- §2.3 metrics carry a baseline or `unknown`.
- Every §4 initiative maps to a §3 bet.
- §1 has dated entries.
- Orphaned epics: an epic `Ladders to:` a heading that no longer exists.

Ready-to-propose (brief): `yes` only if the checklist is clean enough that
the **user** could set `Status: ready-to-propose`. Ready-to-flip (epic):
`yes` only if the user could set `Status: ready`. Otherwise
`**Ready to propose: no**` or `**Ready to flip: no**` with a reason. Next
step: exactly one action the user can take.

### 5. Capability mode

Read `platform-primer.md` and `capability-gaps.md` once each (golden-path
files if present: extra colour, not a second source of "can we"). Classify
the question:

- **Yes today**: the primer describes it as available.
- **No today**: the primer does not, or it names the gap.
- **Partly**: the primer covers some of the asked behaviour.
- **Cannot confirm**: no primer on disk.

Cite the primer section under **From the primer**. When `No today`, give the
**Nearest alternative that works today** from the primer, or from
`capability-gaps.md` if the primer is silent on an alternative. Propose a
**Gap to record** one-liner if the question exposes an unrecorded gap. Do not
write `capability-gaps.md` unless asked.

If no primer: `**Answer**: Cannot confirm`, name
`docs/product/context/platform-primer.md`, offer the skeleton, stop asserting.

### 6. Chat reply

- **Threads**: Thread map, mermaid, numbered cards, pick-to-draft closer. No
  file dump.
- **Draft**: path written, `Status: draft`, the ladder line, one open item
  (briefs: also the change-proposal closer). Never re-dump the file.
- **Review**: the Review block only.
- **Capability**: the capability block only.
- **Refusal** (code gate): one line, contains `artefact` and that this is
  not code. No code fence, no `export function`, no implementation patch.

---

## Rules

- Artefacts only, never code, never outside `docs/product/**`, never
  `openspec/changes/**`.
- Threads write no files; they cite evidence or `thin`.
- Never invent metrics, capabilities, or platform vocabulary.
- Decisions inline; no decisions folder; no threads folder.
- New work is `Status: draft`; the user flips to `ready-to-propose` (brief)
  or `ready` (epic).
- One draft question per turn; inline context counts; empty-handed is fine.
- Never block on I/O: unavailable, once, no retry, no alternate-path guessing.
- Lo-fi pointer only; do not generate mockups.
- Visual is mermaid in chat, not a vendor canvas.
- Host-neutral: Task tool for fan-out, no host-only execute slashes.

---

## Related

- Threads (fan-out, mermaid, cards): [references/threads-mode.md](references/threads-mode.md)
- Draft question ladders: [references/draft-mode.md](references/draft-mode.md)
- One-pager template: [references/one-pager-template.md](references/one-pager-template.md)
- Epic template: [references/epic-template.md](references/epic-template.md)
- Brief template: [references/brief-template.md](references/brief-template.md)
- Ladder and Status: [references/ladder-and-status.md](references/ladder-and-status.md)
- Context folder: [references/context-folder.md](references/context-folder.md)

Files in this skill

  • .gitignore91 B
  • CHANGELOG.md744 B
  • README.md1.3 KB
  • SKILL.md14.8 KB
  • agents/openai.yaml205 B
  • evals/cases/capability-from-gaps.yaml1.2 KB
  • evals/cases/capability-no-primer.yaml660 B
  • evals/cases/draft-brief-stays-draft.yaml1.8 KB
  • evals/cases/refuse-code.yaml1.2 KB
  • evals/cases/review-brief-verdict.yaml1.5 KB
  • evals/cases/threads-default-map.yaml1.7 KB
  • evals/cases/threads-no-spine-files.yaml834 B
  • evals/eval.yaml934 B
  • references/brief-template.md2.5 KB
  • references/context-folder.md1.7 KB
  • references/draft-mode.md3.8 KB
  • references/epic-template.md1.2 KB
  • references/ladder-and-status.md2.4 KB
  • references/one-pager-template.md1.7 KB
  • references/threads-mode.md5.4 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.