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".From its SKILL.md
npx -y skills add rse/ase --skill ase-task-grillAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
SKILL.md
13.0 KB, ~3.1k tokens by cl100k_base, as published. Nobody here has run it
@${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
<skill name="ase-task-grill"> Iteratively Grill a Task Plan </skill><expand name="getopt" arg1="ase-task-grill" arg2="--next|-n=(none|DONE|EDIT|IMPLEMENT|PREFLIGHT)... --int-reuse-task"> $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
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>-
Determine Task:
-
Set <id><getopt-arguments/></id> initially. 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.
-
React on task id:
-
<if condition=" <id/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$` "> Set <ase-task-id><id/></ase-task-id> (set task id) and call the
<template> ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given** </template> </if>ase_task_id(id: "<ase-task-id/>", session: "<ase-session-id/>")tool from theaseMCP server to switch the task, and then only output the following <template/>: - <elseif condition="<id/> is NOT empty"> The argument is neither empty nor a valid task id. As this skill only accepts an optional `[<id>]` argument and *never* a free-text instruction, only output the following <template/> and then immediately *STOP* processing the entire current skill: <template> ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ ERROR: expected single `[<id>]` argument </template> </elseif>
-
-
-
Determine Task Plan:
-
Determine the current task plan content:
<if condition=" <getopt-option-int-reuse-task/> is equal `true` *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call exists earlier in the current session "> Set <text/> to the
textargument of the most recentase_task_save(id: '<ase-task-id/>', ...)tool call, without callingase_task_loadagain. Set <status>plan reused</status>. Do not output anything. </if> <else> Call thease_task_load(id: "<ase-task-id/>")tool of theaseMCP server to load the current task plan content and set <text/> to thetextoutput field of thisase_task_loadtool call. Do not output anything related to this MCP tool call. Set <status>plan loaded</status>. </else>-
If <text/> starts with
<template> ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ **<text/>** </template>ERROR:orWARNING:: Output the following <template/> and then immediately STOP processing the entire current skill: -
If <text/> starts NOT with
<template> ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<status/>** </template>ERROR:and NOT withWARNING:: Set <plan><text/></plan> (set plan to text). Calculate the number of words <words/> of <plan/>. Then output the following <template/>:
-
- <if condition="<plan/> is empty"> Complain and tell the user to use the `ase-code-resolve`, `ase-code-refactor`, `ase-code-craft`, or `ase-task-edit` skills first to create a task plan. Then immediately stop processing this skill. </if>
-
-
Iterate Over Task Plan Aspects:
Interactively interview the user relentlessly about every essential aspect of the task plan in <plan/> until reaching a shared understanding and no decisions/questions are left open.
This especially means, you MUST clarify as many aspects as necessary to ensure that for at least the most important decisions, during a subsequent implementation, no essential freedom of choices exist any longer.
For this process, determine the <n/> essential aspects <aspect-N/> (a one or two word long short identifier like
FooorBar-Baz) and the corresponding decision/question <question-N/> where a shared understanding is required.Honor also the following checks for identifying the problematic aspects:
-
Fuzzy Language: When the user uses vague or overloaded terms instead of a precise or canonical term.
-
Conflicting Terminology: When the user uses a term that conflicts with the existing terminology in the code base.
-
Conflicting Code: When the user states how something works, check whether the current code state really agrees.
-
Non-Concrete Scenarios: When domain relationships are being discussed, stress-test them with specific scenarios. Invent scenarios that probe edge cases and force the user to be precise about the boundaries between concepts.
Then create a decisions/questions tree for them. Walk down each branch of this decision tree, resolving dependencies between decisions one-by-one. Ask the questions <question-N/> and determine corresponding answer <answer-N/>, one at a time.
-
For each question <question-N/> in the iteration cycle <N/>:
-
Output the following <template/>:
<template> <ase-tpl-bullet-signal/> ASPECT <N/>/<n/>: **<aspect-N/>**, QUESTION: **<question-N/>** </template> -
Determine the answer alternatives:
-
Check the <plan/> for the answer <answer-N-1/>.
-
Check the code base and your world knowledge and use this information to find up to three grounded alternative answers <answer-N-K/> (K={2,3,4}), so there are between two and four answer options in total.
-
In the following, you MUST NOT use your built-in <user-dialog-tool/> tool! Instead, you MUST just show a custom dialog according to the expanded
custom-dialogdefinition. You MUST closely follow this definition.Let the user select the <answer-N/> out of the answer alternatives <answer-N-K/> by raising a question with the following custom dialog, where per alternative <answer-N-K/> you determine a brief label <answer-N-K-label/> and a description <answer-N-K-description/>, and you mark the <answer-N-1/> by prefixing its description with
<expand name="custom-dialog" arg1="--other"> <aspect-N/>: <question-N/> <answer-N-1-label/>: ⚝ **CURRENT PLAN** ⚝ - <answer-N-1-description/> <answer-N-K-label/>: <answer-N-K-description/> [...] </expand>⚝ **CURRENT PLAN** ⚝. Emit only the answer lines for the alternatives <answer-N-K/> you actually determined in the previous step (between two and four lines in total):Set <answer-N/> to the selected <result/>.
-
Output the following <template/>:
<template> <ase-tpl-bullet-normal/> ASPECT <N/>/<n/>: **<aspect-N/>**, ANSWER: **<answer-N/>** </template>
-
-
-
Finally, update the plan in <plan/> based on all answers <answer-N/>.
- <if condition="<plan/> contains '⎈ Created: <text/>'"> Set <timestamp-created><text/></timestamp-created> (set timestamp-created to extracted text) </if>
-
Call the
ase_timestamp(format: "yyyy-LL-dd HH:mm")tool of theaseMCP server and use thetextfield of its response for <timestamp-modified/> information. If <timestamp-created/> is still unset (because the previous <plan/> had noCreated:line), set <timestamp-created><timestamp-modified/></timestamp-created> (fall back to the modified timestamp). Then insert the current <ase-task-id/>, previous <timestamp-created/>, and refreshed <timestamp-modified/> information and calculate the number of words <words/> of <plan/>. -
Call the
ase_task_save(id: "<ase-task-id/>", text: "<plan/>")tool of theaseMCP server to save the updated task plan content. Do not output anything related to this MCP call. -
Only output the following <template/> and continue processing:
<template> ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated** </template>
-
-
Decide Next Step:
-
Determine next step:
-
If <getopt-option-next/> is not equal to
none: Treat <getopt-option-next/> as a comma-separated chronological list of pre-selected next-step tokens. Split it on,, take the first token as <head/>, and store the remaining tokens (joined back with,, ornoneif empty) into <getopt-option-next/> so downstream skills can consume the tail.-
If <head/> matches the regex
^(DONE|EDIT|IMPLEMENT|PREFLIGHT)$: Honor the pre-selected token. Set <result><head/></result>. -
else: Only output the following <template/> and then immediately STOP processing the entire current skill:
<template> ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ ERROR: invalid `--next` token: **<head/>** </template>
-
-
If <getopt-option-next/> is equal to
none:In the following, you MUST NOT use your built-in <user-dialog-tool/> tool! Instead, you MUST just show a custom dialog according to the expanded
<expand name="custom-dialog" arg1="--no-other"> Next Step: How would you like to proceed with the plan? DONE: Stop processing. EDIT: Hand off plan to editing. PREFLIGHT: Hand off plan to pre-flighting. IMPLEMENT: Hand off plan to implementation. </expand>custom-dialogdefinition. You MUST closely follow this definition:
-
-
Check the tool <result/> and dispatch accordingly:
-
If <result/> is
<template> ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- done** </template>DONEorCANCEL: Only output the following <template/> and then STOP, without output of any further information. -
If <result/> is
<template> ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- hand-off to edit** </template>EDIT: <expand name="handoff-args"/> Only output the following <template/> and then call the toolSkill(skill: "ase:ase-task-edit", args: "<args/>")to invoke thease:ase-task-editskill in order to edit the updated plan. Immediately stop processing the current skill once theSkilltool was used. -
If <result/> is
<template> ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- hand-off to pre-flight** </template>PREFLIGHT: <expand name="handoff-args"/> Only output the following <template/> and then call theSkill(skill: "ase:ase-task-preflight", args: "<args/>")tool to apply the plan. -
If <result/> is
<template> ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- hand-off to implementation** </template>IMPLEMENT: <expand name="handoff-args"/> Only output the following <template/> and then call theSkill(skill: "ase:ase-task-implement", args: "<args/>")tool to apply the plan.
-
-
What ships with it: 1 file
2.6 KB alongside SKILL.md
- help.md2.6 KB