From grep-research-skills
Continue an existing Grep research job with a follow-up question, building on the prior job's findings without re-running the entire investigation. Use when the user says "follow up on that research", "continue the X investigation", "go deeper on the third finding", or references a previous job by id/slug ("continue grep.ai/research/foo-bar-baz with: ...").
How this skill is triggered — by the user, by Claude, or both
Slash command
/grep-research-skills:grep-continueThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Submits a follow-up against a completed Grep job — re-runs inference at the user's chosen effort tier, but inherits the prior job's research context so it doesn't re-investigate the same ground. Cheaper and faster than starting fresh when the new question genuinely builds on the old one.
Submits a follow-up against a completed Grep job — re-runs inference at the user's chosen effort tier, but inherits the prior job's research context so it doesn't re-investigate the same ground. Cheaper and faster than starting fresh when the new question genuinely builds on the old one.
| User wants | Use |
|---|---|
| New, unrelated research | /research, /quick-research, /grep-domain-expert |
| Follow-up on a previous job | /grep-continue (you are here) |
| Multi-step end-to-end (orient → deep → build) | /grep-research-workflow (uses --reference-jobs= programmatically) |
| Build a different artifact from the same research | /grep-continue <slug> "..." --output-type=... (this skill, with output_type) |
Concrete signals: "follow up on that", "continue the X investigation", "go deeper on the third finding", "now make me a deck from that", "what about Y based on the previous research", "that report you just did, but for region Z". Especially when the user references a previous job by slug or URL.
node "$SCRIPTS_DIR/update-check.js" 2>/dev/null &
node "$SCRIPTS_DIR/auth.js" status
If "authenticated": false, automatically invoke /grep-login.
Continue costs the same as a fresh job at the same effort tier ($2 for medium, $10 for high, $2 for build). The savings come from inheritance — the model spends its budget on the new question instead of re-establishing context.
SCRIPTS_DIR="$(dirname "$(dirname "$(dirname "$(readlink -f "${CLAUDE_SKILL_DIR}/SKILL.md")")")")/scripts"
The user can refer to the parent in three forms — extract the id_or_slug from any of them:
b19421e9-1234-5678-9abc-def012345678anthropic-revenue-strategy-2026https://grep.ai/research/anthropic-revenue-strategy-2026 — strip the path prefix# Extract from URL or accept slug/UUID directly
PARENT="${1:-}"
PARENT="${PARENT##*/research/}" # strip URL prefix if present
PARENT="${PARENT%%\?*}" # strip query string
PARENT="${PARENT%%\#*}" # strip URL fragment (e.g. #third-finding)
If the user didn't provide a slug/UUID, look at recent conversation. If still ambiguous, ask:
Header: "Which job?" Question: "Which prior research job should I continue?" Options: list any slugs/UUIDs from recent conversation, plus "List my recent jobs" (which runs
node grep-api.js jobs)
completeSTATUS=$(node "$SCRIPTS_DIR/grep-api.js" status "$PARENT" \
| node -e "let d='';process.stdin.on('data',c=>d+=c).on('end',()=>{const j=JSON.parse(d);process.stdout.write(j.status||'')}")
case "$STATUS" in
completed|complete)
: # OK
;;
running|pending|queued)
echo "Job is still running. Wait for it to complete before continuing."
exit 1
;;
failed|cancelled)
echo "Job is in '$STATUS' state — can't continue. Start a fresh job."
exit 1
;;
*)
echo "Unexpected status: $STATUS"
exit 1
;;
esac
The API will 422 on a failed or cancelled parent. Better to fail fast with a clear message than to surface a confusing API error.
The user's raw follow-up is often terse ("go deeper on the third finding"). Refine it:
Example:
Default by user signal:
lowmediumhigh (use /ultra-research's polling pattern)If the follow-up is asking for an artifact (deck, spreadsheet, app), pass --output-type=... instead of just --effort=. The sugar pins effort=build automatically.
continue POSTs to /research/{id_or_slug}/continue with {question, effort?, context?} and returns immediately with {job_id, slug, status: "queued"} — it does NOT poll. Treat it as a non-blocking submit, capture the new slug, then call result <slug> (which polls until complete) under Monitor.
The submit command differs by effort tier; the polling step is the same shape for all of them. Pick the matching block:
Low / medium effort (synchronous via Monitor):
SUBMIT=$(node "$SCRIPTS_DIR/grep-api.js" continue "$PARENT" "<refined follow-up>" \
--effort=<low|medium>)
NEW_SLUG=$(echo "$SUBMIT" | node -e "let d='';process.stdin.on('data',c=>d+=c).on('end',()=>{const j=JSON.parse(d);process.stdout.write(j.slug||j.job_id||j.id||'')}")
[ -z "$NEW_SLUG" ] && { echo "Continue submit failed: $SUBMIT"; exit 1; }
# `result` polls until complete and prints the report
node "$SCRIPTS_DIR/grep-api.js" result "$NEW_SLUG" 2>&1
Run the result call with Monitor (timeout_ms: 560000, persistent: false). The 20s slack lets Node flush the report.
Build effort / artifact follow-up (synchronous, longer):
SUBMIT=$(node "$SCRIPTS_DIR/grep-api.js" continue "$PARENT" "Build me a slidedeck from these findings" \
--output-type=slidedeck)
NEW_SLUG=$(echo "$SUBMIT" | node -e "let d='';process.stdin.on('data',c=>d+=c).on('end',()=>{const j=JSON.parse(d);process.stdout.write(j.slug||j.job_id||j.id||'')}")
[ -z "$NEW_SLUG" ] && { echo "Continue submit failed: $SUBMIT"; exit 1; }
node "$SCRIPTS_DIR/grep-api.js" result "$NEW_SLUG" 2>&1
Run the result call with Monitor (timeout_ms: 1800000, persistent: false). Build jobs take 10-15 min.
High effort (async — cannot block-wait):
effort=high runs up to 1 hour, exceeding the bash 10-min cap and any reasonable Monitor budget. Submit non-blocking, then schedule a /loop cron that polls every 5 min:
SUBMIT=$(node "$SCRIPTS_DIR/grep-api.js" continue "$PARENT" "<refined follow-up>" --effort=high)
NEW_SLUG=$(echo "$SUBMIT" | node -e "let d='';process.stdin.on('data',c=>d+=c).on('end',()=>{const j=JSON.parse(d);process.stdout.write(j.slug||j.job_id||j.id||'')}")
[ -z "$NEW_SLUG" ] && { echo "Continue submit failed: $SUBMIT"; exit 1; }
Then schedule the same /loop cron that /ultra-research uses (5-min interval, polls result <NEW_SLUG>, presents on completion, calls CronDelete to stop).
| Effort | Polling pattern | Monitor timeout_ms |
|---|---|---|
low | submit + result <slug> (synchronous) | 560000 (~9 min) |
medium | submit + result <slug> (synchronous) | 560000 (~9 min) |
build (with --output-type=) | submit + result <slug> (synchronous) | 1800000 (30 min) |
high | submit + /loop cron (async, like /ultra-research) | n/a |
"Follow-up job
<new-slug>started, building on<parent-slug>. ~5 min."
When the Monitor notification fires:
Lead with the chain: "I built on the prior research:"
Present the new report cleanly
Link both jobs at the bottom (use $GREP_UI_BASE, auto-derived from $GREP_API_BASE, so preview / staging links render correctly):
Trace:
- Prior research:
${GREP_UI_BASE:-https://grep.ai}/research/<parent-slug>- This continuation:
${GREP_UI_BASE:-https://grep.ai}/research/<new-slug>
This makes the lineage obvious for future follow-ups.
If the user might want to keep going, suggest:
/grep-continue <new-slug> "<another follow-up>"/grep-continue <new-slug> "Build a <X>" --output-type=<X>/research (no continue — start clean)Don't continue indefinitely. After 3-4 levels of nesting, the user usually wants either a fresh investigation or a build artifact — suggest those instead.
failed or cancelled job. The API will 422. Verify status before submitting.--reference-jobs= alongside continue — continue already sets the parent reference internally. Adding extra reference_jobs is allowed (chains additional context) but rarely needed.anthropic-revenue-strategy-2026). Only strip URL prefixes and query strings; never split on -.If the user wants to "continue" research they didn't submit (e.g. a public Grep example URL someone shared), the API will 403 / 404. Tell the user:
"I can only continue jobs you submitted yourself. If you want to investigate this topic, I can start a fresh
/researchjob and reference the public report's findings as context."
Then offer to run /research with the public URL pasted into --context-file= so the new job has the same starting point — without trying to use the unauthorized continue endpoint.
Same pattern as /research: exit 2 + slug returned. Use result <slug> later, or switch to /loop polling for very long continuations.
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 parcha-ai/grep-research-skills --plugin grep-research-skills