/ase-task-grill
Interview the user relentlessly about the task plan until reaching a shared understanding, resolving each branch of the question decision tree. Use when the user wants to stress-test a plan, get grilled on their plan, or mentions "grill me" or "grill plan".
Claude Code
$ npx -y skills add rse/ase --skill ase-task-grill --agent claude-code
Codex
$ npx skills add rse/ase --skill ase-task-grill -a codex -y
Cursor
$ npx skills add rse/ase --skill ase-task-grill -a cursor -y
Gemini CLI
$ npx skills add rse/ase --skill ase-task-grill -a gemini-cli -y
GitHub Copilot
$ npx skills add rse/ase --skill ase-task-grill -a github-copilot -y
OpenCode
$ npx skills add rse/ase --skill ase-task-grill -a opencode -y
Windsurf
$ npx skills add rse/ase --skill ase-task-grill -a windsurf -y
SKILL.md
ase-task-grill.SKILL.mdname: ase-task-grill
argument-hint: "[--help|-h] [--rounds|-r <n>] [--until|-u MUST|SHOULD|MAY] [--perspective|-p <perspective>] [--ground|-G] [--auto|-a] [--focus|-f <section>[,...]] [--force|-F] [--quiet|-q] [--diff|-d] [--next|-n <option>[,...]] [<id>]"
description: >
Interview the user relentlessly about the task plan until reaching a
shared understanding, resolving each branch of the question decision
tree. Use when the user wants to stress-test a plan, get grilled on
their plan, or mentions "grill me" or "grill plan".
user-invocable: true
disable-model-invocation: false
effort: high@${CLAUDE_SKILL_DIR}/../../meta/ase-control.md @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
<purpose name="ase-task-grill"> Iteratively Grill a Task Plan </purpose>
<expand name="getopt" arg1="ase-task-grill" arg2="--rounds|-r=1 --until|-u=(MUST|SHOULD|MAY) --perspective|-p= --ground|-G --auto|-a --focus|-f=(all|SPECIFICATION|SPEC|WHAT|DESIGN|DES|HOW|VERIFICATION|VERIFY|VER|WHEN)... --force|-F --quiet|-q --diff|-d --next|-n=(none|DONE|GRILL|EDIT|IMPLEMENT|DRAFT)... --int-reuse-task --int-interactive"> $ARGUMENTS </expand>
<objective> Interview the user relentlessly about every essential aspect of the task plan until reaching a shared understanding. </objective>
@${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md @${CLAUDE_SKILL_DIR}/../../meta/ase-common-task.md @${CLAUDE_SKILL_DIR}/../../meta/ase-common-ground.md @${CLAUDE_SKILL_DIR}/../../meta/ase-common-grill.md
Procedure ---------
<define name="handoff-args"> Set <args>--int-reuse-task</args>. <if condition="<getopt-option-next/> is not equal `none`"> Set <args><args/> --next <getopt-option-next/></args> </if> </define>
1. **Determine Task:**
1. Set <instruction><getopt-arguments/></instruction> initially, with any leading and trailing whitespace stripped. Inherit the always existing <ase-task-id/> from the current context. Inherit the always existing <ase-session-id/> from the current context. Do not output anything.
2. If <getopt-option-rounds/> is not a positive integer, only output the following <template/> and then immediately *STOP* processing the entire current skill:
<template> ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ ERROR: invalid `--rounds` value: **<getopt-option-rounds/>** </template>
3. Resolve the plan sections under focus:
<expand name="task-focus" arg1="ase-task-grill"></expand>
Each section in <sections/> selects its *focus areas* of the grilling: `SPECIFICATION` selects `DOMAIN` and `INTERFACE`, `DESIGN` selects `ARCHITECTURE` and `IMPLEMENTATION`, and `VERIFICATION` selects `REGRESSION` and `CONFIRMATION`. Do not output anything.
4. React on task id:
<expand name="task-react-id" arg1="ase-task-grill"></expand>
2. **Determine Task Plan:**
1. Determine the current task plan content:
<expand name="task-load-content"></expand>
2. <if condition="<task-content/> is empty"> Complain and tell the user to use the `ase-task-edit` skill first to create a task plan. Then immediately stop processing this skill. </if>
<if condition="<getopt-option-diff/> is equal `true`"> Set <body-before/> to the *body* of <task-content/>: its lines from the `# TASK:` title line up to, but excluding, the `---` line opening its first backmatter block (or up to its end, if it has none), i.e., without its frontmatter and backmatter. This remembers the plan *before* all rounds for step 4. Do not output anything. </if>
3. Determine the *grilling scope* of each section in <sections/>, in order to grill an *already grilled* section again *only* where questions are still *open*:
- If <getopt-option-force/> is `true`, *ignore* any
`grilled:<section/>` tag: the scope of *every* section is the *entire* section, so already grilled sections are *re-grilled* completely. Skip the following two cases.
- If the `Tags:` frontmatter key of <task-content/> carries
the tag `grilled:<section/>` (with <section/> being the *lower-case* name of the section) and the section contains *no* bullet-point in checkbox state `[?]`, the section is *already grilled* and nothing is open: *remove* it from <sections/> and only output the following <template/>:
<template> ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **section <section/> already grilled -- skipped (use `--force` to re-grill)** </template>
- If the `Tags:` frontmatter key carries the tag
`grilled:<section/>` and the section contains *at least one* bullet-point in checkbox state `[?]`, *restrict* the scope of the section to *exactly* these `[?]` bullet-points, so the grilling re-asks only the *still open* questions.
- Otherwise, the scope of the section is the *entire* section.
Independent of the scope, bullet-points in checkbox state `[-]` (cancelled) or `[>]` (deferred) are *inert*: they are *never* subject of a question and their checkbox is *never* changed.
<if condition="<sections/> is empty afterwards"> Skip the entire step 3 below -- the plan is *neither* updated *nor* saved -- and continue directly with step 4. </if>
3. **Iterate Over Task Plan Aspects:**
1. Understand what "grilling" is about:
<expand name="grill-understanding" arg1="the task plan in <task-content/>" arg2="<getopt-option-perspective/>" arg3="<getopt-option-ground/>"></expand>
<if con
Read more
name: ase-task-grill
argument-hint: "[--help|-h] [--rounds|-r <n>] [--until|-u MUST|SHOULD|MAY] [--perspective|-p <perspective>] [--ground|-G] [--auto|-a] [--focus|-f <section>[,...]] [--force|-F] [--quiet|-q] [--diff|-d] [--next|-n <option>[,...]] [<id>]"
description: >
Interview the user relentlessly about the task plan until reaching a
shared understanding, resolving each branch of the question decision
tree. Use when the user wants to stress-test a plan, get grilled on
their plan, or mentions "grill me" or "grill plan".
user-invocable: true
disable-model-invocation: false
effort: high@${CLAUDE_SKILL_DIR}/../../meta/ase-control.md @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
<purpose name="ase-task-grill"> Iteratively Grill a Task Plan </purpose>
<expand name="getopt" arg1="ase-task-grill" arg2="--rounds|-r=1 --until|-u=(MUST|SHOULD|MAY) --perspective|-p= --ground|-G --auto|-a --focus|-f=(all|SPECIFICATION|SPEC|WHAT|DESIGN|DES|HOW|VERIFICATION|VERIFY|VER|WHEN)... --force|-F --quiet|-q --diff|-d --next|-n=(none|DONE|GRILL|EDIT|IMPLEMENT|DRAFT)... --int-reuse-task --int-interactive"> $ARGUMENTS </expand>
<objective> Interview the user relentlessly about every essential aspect of the task plan until reaching a shared understanding. </objective>
@${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md @${CLAUDE_SKILL_DIR}/../../meta/ase-common-task.md @${CLAUDE_SKILL_DIR}/../../meta/ase-common-ground.md @${CLAUDE_SKILL_DIR}/../../meta/ase-common-grill.md
Procedure ---------
<define name="handoff-args"> Set <args>--int-reuse-task</args>. <if condition="<getopt-option-next/> is not equal `none`"> Set <args><args/> --next <getopt-option-next/></args> </if> </define>
1. **Determine Task:**
1. Set <instruction><getopt-arguments/></instruction> initially, with any leading and trailing whitespace stripped. Inherit the always existing <ase-task-id/> from the current context. Inherit the always existing <ase-session-id/> from the current context. Do not output anything.
2. If <getopt-option-rounds/> is not a positive integer, only output the following <template/> and then immediately *STOP* processing the entire current skill:
<template> ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ ERROR: invalid `--rounds` value: **<getopt-option-rounds/>** </template>
3. Resolve the plan sections under focus:
<expand name="task-focus" arg1="ase-task-grill"></expand>
Each section in <sections/> selects its *focus areas* of the grilling: `SPECIFICATION` selects `DOMAIN` and `INTERFACE`, `DESIGN` selects `ARCHITECTURE` and `IMPLEMENTATION`, and `VERIFICATION` selects `REGRESSION` and `CONFIRMATION`. Do not output anything.
4. React on task id:
<expand name="task-react-id" arg1="ase-task-grill"></expand>
2. **Determine Task Plan:**
1. Determine the current task plan content:
<expand name="task-load-content"></expand>
2. <if condition="<task-content/> is empty"> Complain and tell the user to use the `ase-task-edit` skill first to create a task plan. Then immediately stop processing this skill. </if>
<if condition="<getopt-option-diff/> is equal `true`"> Set <body-before/> to the *body* of <task-content/>: its lines from the `# TASK:` title line up to, but excluding, the `---` line opening its first backmatter block (or up to its end, if it has none), i.e., without its frontmatter and backmatter. This remembers the plan *before* all rounds for step 4. Do not output anything. </if>
3. Determine the *grilling scope* of each section in <sections/>, in order to grill an *already grilled* section again *only* where questions are still *open*:
- If <getopt-option-force/> is `true`, *ignore* any
`grilled:<section/>` tag: the scope of *every* section is the *entire* section, so already grilled sections are *re-grilled* completely. Skip the following two cases.
- If the `Tags:` frontmatter key of <task-content/> carries
the tag `grilled:<section/>` (with <section/> being the *lower-case* name of the section) and the section contains *no* bullet-point in checkbox state `[?]`, the section is *already grilled* and nothing is open: *remove* it from <sections/> and only output the following <template/>:
<template> ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **section <section/> already grilled -- skipped (use `--force` to re-grill)** </template>
- If the `Tags:` frontmatter key carries the tag
`grilled:<section/>` and the section contains *at least one* bullet-point in checkbox state `[?]`, *restrict* the scope of the section to *exactly* these `[?]` bullet-points, so the grilling re-asks only the *still open* questions.
- Otherwise, the scope of the section is the *entire* section.
Independent of the scope, bullet-points in checkbox state `[-]` (cancelled) or `[>]` (deferred) are *inert*: they are *never* subject of a question and their checkbox is *never* changed.
<if condition="<sections/> is empty afterwards"> Skip the entire step 3 below -- the plan is *neither* updated *nor* saved -- and continue directly with step 4. </if>
3. **Iterate Over Task Plan Aspects:**
1. Understand what "grilling" is about:
<expand name="grill-understanding" arg1="the task plan in <task-content/>" arg2="<getopt-option-perspective/>" arg3="<getopt-option-ground/>"></expand>
<if con
Other skills on ase.
More skills from other plugins.
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
ask-matt
Ask which skill or flow fits your situation. A router over the skills in this repo.
Questions about ase-task-grill.
- Which coding agents can use ase-task-grill?
- ase-task-grill installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

