---
name: product-line
description: Manage the portfolio of product paths — review, promote, prune, fork, and check revisit triggers across the product-path manifest
type: operations
version: v0.0
argument-hint: "review | promote <path-id> | prune <path-id> | fork <label> [--from <skill>] | triggers"
---

## Pack Availability Guard

Before telling the user to run a skill from another project-local pack, check `.agents/project.json.enabled_packs`. If the target pack is not enabled, recommend `$pack install <pack>` instead of the target skill. Global skills are always valid. Skills from this same pack are valid because the current skill is already running from that pack.

# Product Line — Product Path Portfolio Management

Invoke as `$product-line`.

Manage the portfolio of product paths tracked in `research/.progress.yaml`. This skill provides five modes for working with the product-path manifest: reviewing the portfolio, promoting deferred paths to active, pruning abandoned paths, forking new paths from mid-pipeline discoveries, and checking revisit triggers.

Product paths are research divergences — different ICPs, expansion candidates, pivots, competitive gaps — not git branches. Each path tracks its pipeline stage, evidence maturity, and revisit conditions.

## Prerequisites

`research/.progress.yaml` must exist for all modes except `fork` (which can create it). If missing, tell the user: "No product-path manifest found. Run `$idea-scope-brief` or `$icp` first — they create the manifest when multiple product directions emerge."

## Manifest Schema

The canonical manifest lives at `research/.progress.yaml`:

```yaml
active_paths:           # list of path IDs currently being researched
  - "path-id-1"
max_concurrent: 1       # max simultaneous active paths (default 1)
product_paths:
  - id: "path-id-1"
    label: "Human-readable name"
    source_skill: "icp"
    scope_path: "research/icp-smb.md"
    status: active       # active | deferred | revisit_candidate | promoted | abandoned
    reason: "Why this path exists"
    evidence_refs:
      - "research/icp.md"
    revisit_trigger: "Condition that should re-evaluate this path"
    next_skill: "$competitive-analysis"
    last_touched: "2026-05-27"
    pipeline_stage: "icp"  # last completed skill in the chain
```

### Backward Compatibility

When reading the manifest, handle the legacy singular `active_path` field:
- If `active_path` (string) exists and `active_paths` (list) does not, treat it as `active_paths: [<active_path value>]`.
- When writing, always use the plural `active_paths` form. Remove the singular `active_path` field on write to complete migration.

## Modes

### 1. `review` — Portfolio Dashboard

**Invocation**: `$product-line review`

Scan the manifest and present a dashboard comparing all paths:

| Path | Status | Pipeline Stage | Last Touched | Evidence Maturity | Revisit Trigger |
|------|--------|---------------|--------------|-------------------|-----------------|

**Evidence maturity** is derived from which research files exist under the path's `scope_path` or are listed in `evidence_refs`:
- **Early** — only concept brief or initial ICP
- **Developing** — ICP + competitive analysis or positioning
- **Mature** — journey map + metrics + GTM or monetization
- **Complete** — full pipeline through experiment or PMF assessment

**Pipeline stage** shows the last completed skill. Map common stages to a visual progress indicator:

```
idea-scope-brief → icp → competitive-analysis → positioning → journey-map → metrics → gtm → monetization → experiment
```

Group paths by status. For deferred and revisit_candidate paths, highlight the revisit trigger prominently.

When deferred paths accumulate (3+ deferred with no recent promotion), recommend: "Consider running `$product-line triggers` to check whether any deferred paths should be promoted."

### 2. `promote <path-id>` — Activate a Deferred Path

**Invocation**: `$product-line promote <path-id>`

1. Validate the path exists and has status `deferred`, `revisit_candidate`, or `abandoned`.
2. Check `max_concurrent` against current `active_paths` count.
   - If at capacity, present the user with options: deactivate an existing active path first, or increase `max_concurrent`.
3. Scan existing research files to determine the path's current pipeline stage.
4. Update the manifest:
   - Set `status: promoted` then `status: active`
   - Add the path ID to `active_paths`
   - Set `last_touched` to today
   - Set `pipeline_stage` from the scan
5. Present the promotion result and recommend the next skill based on where the path left off.

### 3. `prune <path-id>` — Abandon a Path

**Invocation**: `$product-line prune <path-id>`

1. Validate the path exists and is not already `abandoned`.
2. Ask the user for a rationale.
3. Update the manifest:
   - Set `status: abandoned`
   - Remove from `active_paths` if present
   - Append the rationale to `reason`
   - Set `last_touched` to today
4. Present confirmation with the documented rationale.

### 4. `fork <label> [--from <skill>]` — Create a New Path

**Invocation**: `$product-line fork "Enterprise vertical" --from competitive-analysis`

Create a new product path from a mid-pipeline discovery.

1. Generate a path ID from the label (lowercase, hyphenated slug).
2. Ask the user for evidence, revisit trigger, and active/deferred status.
3. Determine `scope_path` — suggest `research/{slug}/` for a new research subdirectory.
4. Create the manifest entry with all required fields.
5. If status is `active`, check `max_concurrent` capacity (same logic as promote).
6. Create the `research/.progress.yaml` file if it doesn't exist, or append to `product_paths` if it does.
7. Create the `research/{slug}/` directory if the path is active.

### 5. `triggers` — Check Revisit Conditions

**Invocation**: `$product-line triggers`

Scan all paths with `status: deferred` or `status: revisit_candidate` and evaluate their `revisit_trigger` conditions:
- **File-based triggers** → check if the referenced file exists
- **Evidence-based triggers** → check research files for relevant data
- **Time-based triggers** → compare against current date
- **External triggers** → flag as requiring manual check

Classify each trigger: **fired**, **pending**, or **manual**.

For fired triggers, recommend `$product-line promote <path-id>`.

## Output

This skill modifies `research/.progress.yaml` only. It does not create research documents.

## Constraints

- **Manifest-only mutations.** Reads and writes `research/.progress.yaml` only.
- **No automatic pipeline execution.** Recommend next skills but do not run them.
- **Backward compatible reads.** Handle both `active_path` (singular) and `active_paths` (plural).
- **Forward-only writes.** Always write `active_paths` (plural).
- **Prune rationale is required.** Never abandon without documented evidence.
- **Respect max_concurrent.** Do not exceed without user approval.
- **Use product-path terminology.** Never use "branch" to mean a product path.

## Default Shipping Contract

Follow the shared shipping contract convention in CLAUDE.md (adapted for Codex: commit and push changes to the repository primary branch).
