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:
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 andactive_paths(list) does not, treat it asactive_paths: [<active_path value>]. - When writing, always use the plural
active_pathsform. Remove the singularactive_pathfield 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>
- Validate the path exists and has status
deferred,revisit_candidate, orabandoned. - Check
max_concurrentagainst currentactive_pathscount.- If at capacity, present the user with options: deactivate an existing active path first, or increase
max_concurrent.
- If at capacity, present the user with options: deactivate an existing active path first, or increase
- Scan existing research files to determine the path's current pipeline stage.
- Update the manifest:
- Set
status: promotedthenstatus: active - Add the path ID to
active_paths - Set
last_touchedto today - Set
pipeline_stagefrom the scan
- Set
- 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>
- Validate the path exists and is not already
abandoned. - Ask the user for a rationale.
- Update the manifest:
- Set
status: abandoned - Remove from
active_pathsif present - Append the rationale to
reason - Set
last_touchedto today
- Set
- 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.
- Generate a path ID from the label (lowercase, hyphenated slug).
- Ask the user for evidence, revisit trigger, and active/deferred status.
- Determine
scope_path— suggestresearch/{slug}/for a new research subdirectory. - Create the manifest entry with all required fields.
- If status is
active, checkmax_concurrentcapacity (same logic as promote). - Create the
research/.progress.yamlfile if it doesn't exist, or append toproduct_pathsif it does. - 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.yamlonly. - No automatic pipeline execution. Recommend next skills but do not run them.
- Backward compatible reads. Handle both
active_path(singular) andactive_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).