From competitive-research
Mark past competitive-research recommendations as shipped, in-progress, rejected, or wontfix so future analyses filter them out of new shortlists. Walks through unmarked entries from ./competitive-research/history/seen-features.jsonl and updates their status. Only invoked explicitly via /competitive-research:track — never auto-triggered.
How this skill is triggered — by the user, by Claude, or both
Slash command
/competitive-research:trackThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this when the user wants to record what they did with past recommendations. Status updates feed into the next analysis run's Phase 7 dedupe step:
Use this when the user wants to record what they did with past recommendations. Status updates feed into the next analysis run's Phase 7 dedupe step:
shipped → never re-suggestwontfix → never re-suggestin-progress → don't re-suggest while work is happeningrejected → may re-suggest but tagged [REVISITED] with explanation of changed circumstancesWithout this skill, the analysis re-suggests features the user already shipped or explicitly killed, because there's no signal back from outcomes.
Look for ./competitive-research/history/seen-features.jsonl. If it doesn't exist:
No past recommendations to track yet. Run the analysis at least once first (say "run the competitive research") to generate history.
Then exit.
Read all entries. Each is one JSON object per line, e.g.:
{"date": "2026-04-17", "name": "Bulk CSV import", "description": "...", "scores": {...}, "status": "unmarked"}
Entries without a status field are treated as unmarked. If a JSONL line is malformed, skip it with a warning — don't crash.
Show a status summary up front:
History contains N entries
- Unmarked (need triage): N
- Shipped: N
- In-progress: N
- Rejected: N
- Wontfix: N
For each unmarked entry, in chronological order (oldest first), show:
scoresThen ask:
shipped/in-progress/rejected/wontfix/skip(decide later)
Follow-ups based on choice:
shipped_date.rejection_reason. Required, not optional — the reason is what makes the dedupe smarter next run.unmarked, move on.Process one entry at a time. Don't ask about all of them in one batch — the user needs to think about each.
After unmarked entries are done, ask:
Want to update any entries currently marked
in-progress,shipped,rejected, orwontfix? (e.g., something marked in-progress last month may now be shipped.)
If yes, walk through one at a time using the same flow as step 3.
Rewrite ./competitive-research/history/seen-features.jsonl with updated entries. For each entry the user updated:
date, name, description, scores, etc.) — never modify these.status, status_updated (today's ISO date), rejection_reason (if rejected/wontfix), shipped_date (if shipped).Also append change records to ./competitive-research/history/outcomes.jsonl (create if missing):
{"date": "2026-04-24", "feature_name": "Bulk CSV import", "old_status": "unmarked", "new_status": "shipped", "reason": null}
The outcomes log is append-only and never rewritten — it's the audit trail for how decisions changed over time.
Print:
[REVISITED] if circumstances change."skip.rejected / wontfix — that's the signal that improves next run.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub dharrishub/competitive-research-skill --plugin competitive-research