ai/skills/write-task/SKILL.md
Skill on how to write a task. Use when user asks you to write a task (for Asana, Linear, Jira, Notion and equivalent). Also activates when user says "create task", "write task", or similar task creation workflow requests.
npx skillsauth add kurko/dotfiles write-taskInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Write a task using with the following sections:
If a Slack thread is passed in, use that as context for making it richer.
Use the short template (Background + Proposed changes) for:
Use the full template (Background + Why is it important? + Proposed changes) for:
When in doubt, use the full template. The "Why is it important?" section helps teams remember context when revisiting old tasks.
A good task title should be specific enough to distinguish from similar tasks and scannable in a list of 50+ items.
Solution-focused titles start with a verb (Fix, Add, Update, Remove). Use when the approach is known:
Problem-focused titles describe the issue without prescribing a solution. Use when you want engineers to determine the approach:
Avoid vague titles like "Checkout issues" or "Webhooks" that don't distinguish the task from others.
Don't bury the action in vague language Bad: "We should probably consider maybe looking into potentially improving..." Good: "Update the payment processor to retry failed transactions"
Don't use corporate speak Bad: "Leverage synergies to optimize the data pipeline infrastructure" Good: "Fix the slow database queries in the reporting system"
Don't make tasks too abstract Bad: "Improve user experience in the checkout flow" Good: "The checkout flow times out when users have more than 50 items in their cart"
The Background section should progress from high-level to detailed:
This progressive structure ensures anyone can understand the basics before encountering technical specifics.
Here's one template you can use:
The tl;dr is a single line at the very top that lets someone understand the core issue without reading the full task. It should capture the gap between expectation and reality, or the core problem in plain terms.
The "tl;dr" label must always be bold in non-plaintext output. In markdown,
use **tl;dr**. In Asana HTML, use <b>tl;dr</b>. Only omit bold when the
output is strictly plaintext (e.g., the Asana notes field fallback).
Examples:
**tl;dr** [One-line summary of the core issue]
## Background
[Explanation that makes the importance self-evident]
## Proposed changes
[What needs to happen]
Use this when the task involves non-engineering stakeholders, new features, or needs context preservation.
**tl;dr** [One-line summary of the core issue]
## Background
[Explanation]
## Why is it important?
[Cost of not doing it]
## Proposed changes
[What needs to happen]
Add this section only when explicitly requested. Many teams prefer to let engineers determine implementation details and testing approaches.
## Acceptance criteria
- Criterion 1
- Criterion 2
**tl;dr** login form shows "Invalid credentials" for timeouts, confusing users who think their password is wrong.
## Background
The login form shows "Invalid credentials" when the authentication service times
out, confusing users who think their password is wrong. This causes unnecessary
support tickets and password reset requests.
## Proposed changes
Update the authentication service to distinguish between authentication failures
and network errors. Show "Unable to connect, please try again" for timeout
errors instead of the generic credentials message.
**tl;dr** customers can't tell if a webhook failed on our side or theirs because we don't log delivery attempts.
## Background
When customers report missing or incorrect webhook notifications, we currently
have no way to verify what data was actually sent to their endpoints. We rely on
application logs which get rotated after 7 days and don't always capture the
full request/response cycle. This makes debugging webhook delivery issues time
consuming and often impossible if the issue happened more than a week ago.
## Why is it important?
We have spent considerable engineering time investigating webhook issues due
to lack of proper records, effort which could be spent on new features or
improving reliability. Support tickets about webhooks take hours to investigate
without proper records, leading to frustrated customers.
Customers rely on our webhook delivery for their integrations, yet we can't
prove whether an issue was on our side or the customer's endpoint when they
report missing webhooks.
## Proposed changes
- Create a new `WebhookDelivery` model to store outbound webhook attempts.
This should capture the request payload, headers, response status, response
body, and timestamp. The model could reference the triggering event (like an
Article or Comment) through a polymorphic association.
Store at least 90 days of webhook history to cover most support cases. Consider
adding an index on organization_id and created_at for quick lookups. We should
also add a simple admin interface to search webhook deliveries by organization,
date range, and status code.
For the actual implementation, we'd modify our existing webhook service (likely
in app/services/webhook_service.rb) to create a WebhookDelivery record after
each attempt. This gives us the full picture when customers ask "did you send a
webhook for order X?" or "why didn't we receive the gift.created event
yesterday?"
When multiple approaches are valid, present them as options:
**tl;dr** use_new_vendor is confusing because the name suggests it controls all card types, but it only affects prepaid cards, not debit.
## Background
We have a config called `use_new_vendor` that controls whether prepaid cards use the new vendor or the legacy one. The name is misleading because it suggests it controls all card types, but it actually only affects prepaid cards. Debit cards use a completely different mechanism and are not affected by this config.
During a recent incident, this caused confusion and required multiple people to clarify what the config actually did.
## Why is it important?
The current name caused real confusion during incident response. While it's tacitly known by some engineers, others will need to verify whether debit cards would be affected by toggling this config (and some would assume its name is what it does). Future engineers will likely make the same incorrect assumptions.
## Proposed changes
Options:
- Rename `use_new_vendor` to something that clearly indicates it only controls prepaid card vendor selection, such as `prepaid_use_new_vendor`, or
- Make `use_new_vendor` cover debit card situations as well.
When the user provides a Slack thread (or similar conversation context):
The goal is to transform the conversational thread into a well-structured, standalone task that captures the discussion's value.
When the user mentions file paths, class names, method names, or other code references while requesting a task:
Search the codebase to locate the mentioned code:
Gather context by examining:
Enrich the task with findings:
Reduce ambiguity: The goal is to make the task clearer and more actionable by grounding it in the actual codebase, reducing the chance of vague or incorrect technical descriptions.
This investigation should be done before writing the task to ensure accuracy and completeness.
After creating the task:
Explain your template choice: Tell the user which template you used (short or full) and why. This helps identify when the wrong template was chosen so the skill can be improved. For example:
Copy to clipboard: Attempt to copy the task description to the user's clipboard using a heredoc (more reliable with multi-line content and quotes):
cat << 'EOF' | pbcopy followed by the content and EOFcat << 'EOF' | xclip -selection clipboard or xsel --clipboardpbpaste | head -3 to confirm it workedChoose the output format based on the project's task tracker:
Markdown example:
cat << 'EOF' | pbcopy
**tl;dr** The task content goes here...
## Background
More content with `inline code`...
EOF
Asana HTML example:
cat << 'EOF' | pbcopy
<b>tl;dr</b> The task content goes here...
<b>Background</b>
More content with <code>inline code</code>...
Relevant link: <a href="https://example.com">Example</a>
EOF
When creating tasks directly in Asana via the MCP tool, use the html_notes
parameter. Key formatting rules:
Use <b> instead of <h2> for section headers. Asana renders <h2> tags
with built-in margin/padding that creates extra vertical spacing you cannot
control. Using <b> gives tighter, cleaner formatting:
<!-- Creates extra spacing above and below (Asana's built-in h2 styling) -->
<h2>Background</h2>
<!-- Tighter spacing - preferred -->
<b>Background</b>
Use newlines, not <br/>. The <br/> tag is no longer supported in Asana.
Use actual newline characters for line breaks. Double newlines create paragraph
breaks.
Keep headers and content adjacent. Put the section header and its first paragraph on consecutive lines (single newline between them):
<b>Background</b>
When a payout fails with an NSF error...
Supported tags: <strong>, <em>, <b>, <u>, <s>, <code>, <ol>,
<ul>, <li>, <a>, <blockquote>, <pre>, <h1>, <h2>, <hr/>.
Reference: https://developers.asana.com/docs/rich-text
tools
Create a GitHub pull request from the current branch. Use when user asks to create a PR, open a PR, submit a PR, push and create PR, or similar pull request workflows. Activates for phrases like "create a PR", "open a pull request", "submit PR", "push and PR", "make a PR for this", "open a draft PR".
data-ai
Merge the current worktree branch into main and sync main back. Use when the user says "merge to main", "ship it", "merge and continue", or after completing a task in a worktree and wanting to continue with the next one.
tools
Synchronize AI agent skills, commands, configs, permissions, hooks, and instructions across Claude Code, Codex CLI, and other Agent Skills-compatible tools. Use when the user asks to pull skills from Claude into Codex, sync Codex work back to Claude, migrate agent commands, reconcile frontmatter, update permissions, or keep agent setup files in parity.
testing
Write or update UI-independent use cases for QA. Use when the user says "write use cases", "add use cases", "QA use cases", "update use cases", "compose use cases", or when starting implementation of a new feature (after plan approval). Also activates for "what should we test", "regression cases", or "use cases for QA".