From ai_dev
Manage the project task backlog as plain markdown files in tasks. Use for broad backlog work including create, list, query, update, triage, implement, audit, finish, defer, archive, lint, split, or repair tasks.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ai_dev:taskThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
<task_skill>
<task_skill>
The task skill is the hub and source of truth of the `task_*` family: the **project-local backlog** that manages a project's upcoming work and todos as plain-markdown task files living next to the code. The concept behind the whole system: every task file is written to be **self-sufficient** — the file alone is enough to implement the work from, including in a later session with no memory of the task's creation. That sufficiency is a floor, never a filter: at implementation time the implementer draws on everything actually available — the codebase, the project's standing-instruction baseline, the user in the loop.<when_to_activate> Activate this skill when the user:
finished.deferred.<not_in_scope>
The wiki skill captures durable knowledge (concepts, procedures, references). The task skill captures upcoming work on this project. When a user message is about recording what they learned or how something works, route to wiki instead. When they want to track what still needs doing, this skill is right.
</not_in_scope>
The filing convention has one canonical split: material directly about the task system lives under tasks/, and project-wide standing material lives at the repo root as optional UPPERCASE.md docs. Two root-doc roles exist there: harness-loaded rule files (CLAUDE.md / AGENTS.md / GEMINI.md and equivalents) provide the project's standing-instruction baseline, while family-consulted guardrail docs (CHARTER.md / ARCHITECTURE.md / FEATURES.md / TESTING.md) add task-family-specific constraints and context. The task tree stays intentionally two layers — tasks/ for live work, tasks/archive/ for closed work. No further task nesting. Scope sits in the filename, not in a folder. A bare project with only tasks/ remains complete.
<standing_doc_consumption>
Resolve the project root from the base <discover> step. The project's standing instructions start with the harness-loaded root rule files: CLAUDE.md / AGENTS.md / GEMINI.md and equivalents. When present, the harness loads those files before the skill runs, and the task family follows that baseline at every touchpoint independent of whether any family guardrail doc exists. The task family adds no separate presence-gated read for those harness files because the harness already supplies them.
Family-consulted guardrail docs are the additive layer over that baseline. Gate each optional family guardrail doc read with POSIX test -f "$root/<DOC>.md". On a hit, the consuming skill or agent reads the doc for the purpose named at its touchpoint; on a miss, it continues unchanged and raises no missing-doc error.
CHARTER.md is the highest-order guardrail: any skill or agent about to write or change task content validates the proposed content against the charter's boundaries and invariants and stops on a violation. The harness baseline governs wherever the family guardrail docs are silent. When a harness rule conflicts with a softer guardrail doc (ARCHITECTURE.md / FEATURES.md / TESTING.md), surface the conflict for human review instead of auto-resolving it. The softer docs inform work without blocking it: FEATURES.md and ARCHITECTURE.md provide prior-art and design context for task creation, TESTING.md provides project-specific testing details for implementation and audit, and ARCHITECTURE.md is refreshed during finish when completed work extends the design.
</standing_doc_consumption>
<file_format>
`_.md`. One underscore — exactly one — separates scope from name. Inside each side, words use `-`. Both sides are lowercase `a-z 0-9 -`. Examples:wiki-fix_split-page-anatomy.mdtasks-skill_initial-implementation.mdauth_session-token-rotation.mdinfra_grafana-dashboard-cleanup.mdPick scope from the project's natural shared groupings — a skill family, sub-project, module, topic, feature area, or service. Pick name to be compact, unique within the tasks tree (open and archive), and self-explanatory at a glance. Before creating, list the tasks directory and archive/ once to confirm the chosen name does not collide.
---
description: One-line compact summary of what this task delivers.
scope: plugins/ai_dev/skills/task
created: 2026-05-28T19:49:23
updated: 2026-05-28T19:49:23
status: open
reported-by: default_user
---
Fields:
description — compact one-liner. Compose to roughly 180 characters; the linter warns above 200, and that gap is headroom for a later broadening edit rather than length to write at. The body carries the full context.scope — either a relative path under the project root pointing at the directory the task targets (unquoted; e.g. scope: plugins/ai_dev/skills/task), or a short descriptive label when no single directory fits (quoted; e.g. scope: "project xyz"). The linter resolves an unquoted value against the project root and blocks if the path is missing or escapes the root; a quoted value is accepted as text. Paths win when one fits — the filesystem stays the source of truth.created — ISO 8601 datetime, set once when the task is created.updated — ISO 8601 datetime, bumped on every edit and on every status change. See <bump_updated> for the legacy-backfill exception.status — one of:
open — created and not yet checked.checked — task_check ran and found blocking issues, either directly or as the gate inside task_auto_check.ready — implementation-ready, either from a clean task_check verdict, from task_auto_check reaching that verdict, or from the user declaring readiness through the apply-findings update flow.implemented — task_implement built the work.audited — task_audit confirmed every body item, acceptance check, and required test over a current implemented task.finished — closed out as done and archived.deferred — parked or dropped and archived.reported-by — the user who created the task, written by the create path and resolved via <user_name_chain>. See <bump_updated> for legacy backfill.implemented-by — the user who built the work, written by task_implement when it stamps implemented, required on implemented, audited, and finished, and resolved via <user_name_chain>. Deferred tasks omit it because they were never implemented. See <bump_updated> for legacy backfill.Status matches location: open, checked, ready, implemented, and audited live in tasks/; finished and deferred live in tasks/archive/.
<user_name_chain>
Resolve a recorded user name by reading git config user.name; when that is empty or the project is not a git repo, ask the user which name to record; when the ask goes unanswered, write the literal string default_user.
</user_name_chain>
Obtain the timestamp by running the shell command below and copy its output verbatim — the model has no clock, so a hand-written time is a guess:
date +%Y-%m-%dT%H:%M:%S # local time, e.g. 2026-05-28T19:49:23
Both created (set once, on a fresh task) and updated (bumped on every edit, status change, and archive move) take their value from this command's output. When creating several tasks in one turn, run date once and reuse the captured value across the batch rather than re-running it per file.
<lifecycle_responsibility>
Each stage records the furthest lifecycle point it establishes: task_create writes open; task_check writes ready on a clean verdict and checked when blocking findings remain; task_auto_check edits the task body and reuses task_check for those ready / checked stamps; the apply-findings update flow writes ready only when the user declares readiness before implementation; task_implement writes implemented; task_audit writes audited only for a clean, complete verdict over a current implemented; task_finish writes finished for done work or deferred for parked work.
</lifecycle_responsibility>
<backward_move_guard>
Before a stage writes a status that could move a task backward, read the current status and compare it to the target. The guarded writers are exactly task_check and task_implement: task_check may otherwise overwrite implemented, audited, or finished with checked or ready, and task_implement may otherwise overwrite audited or finished with implemented. On a regression, warn, name the current→target move, and ask the user to confirm the move is intended unless the session context already makes that intent clear, then proceed only when confirmed. Forward moves, same-status stamps, task_check revising ready back to checked, and parking as deferred proceed without this guard.
</backward_move_guard>
<markdown_policy> Task bodies are 100% CommonMark-standard markdown. The YAML frontmatter at the top is the only allowed extension. The linter blocks on non-standard syntax so the tasks tree stays portable to any renderer and the filesystem stays the source of truth:
[^name] references and [^name]: … definitions are non-standard. Place attribution inline as a normal markdown link next to the claim.[[target]] is an Obsidian extension. Use [text](relative-path.md) for cross-references..md links to other task files (under tasks/ or tasks/archive/) must resolve on disk — the linter blocks broken targets.:N suffix on a file path, a bare line N, an around lines N–M range, and an ordinal list-position reference such as "step 6", "item 3", or "the second bullet" all locate by a position that rots silently as the target evolves. When the referencing task inserts, removes, or reorders items in the target list, anchor to the item's own verbatim label rather than to its ordinal position.Simplicity, single-topic scope, and standard tooling beat every non-standard extension. </markdown_policy>
The body starts with a single `# Title` H1 on the first non-blank line, followed by the rest of the task content. Write the body to be **self-sufficient**: the file carries everything the work needs that the project itself does not already hold, while whatever exists at implementation time — the codebase, the project's standing-instruction baseline, the user in the loop — stays in play and gets used. Self-sufficiency is what lets a task outlive its origins: the conversation that created it is the one context guaranteed to be gone by then. Corollary: content a standing project instruction (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md` and equivalents, plus the applicable family guardrail docs) already mandates is cited from the task as a standing repo rule, with the rule's text staying in its source document. Fill these sections:**Out of scope:** block the Declare exclusions as an Out of scope boundary rule defines.make lint, a deploy dry-run, the full test suite — which run at their standing moments; name a gate only when the task changes what it verifies, such as a new lint rule proven on a staged fixture or a new scenario added to a suite.Write the body positive and action-oriented: the primary carrier of every section is what the work does — Goal, Approach, and Acceptance lead with the action taken and what "done" looks like. Negatives earn their place where they carry content of their own: a genuine out-of-scope entry, a guardrail, or the task-specific gate the Acceptance contract defines. Keep rejected-option debate out of the body: a brief out-of-scope entry or guardrail stays, while the rationale for options weighed and rejected lives in the change's commit or pull-request description, or in the wiki when it is durable design knowledge. Frame the body as current state to target — what exists, what is not there yet, and the state the work reaches — and let Rewrite in place, don't append define the target when an existing passage is affected.
Further rules govern the body's structure:
<standing_doc_consumption>, with CHARTER.md a hard boundary and the softer docs subordinate; (c) related and older tasks, both linked live siblings and archived precedent; (d) the already-implemented codebase. Adopt the reconciled path when the evidence settles it — the fitting path is determinable from that evidence without introducing a change the context cannot settle — with a stage that can write recording the resolution and a read-only stage recommending it. Surface when the evidence leaves the path underdetermined, so adopting one would risk an unintended change not derivable from context alone: hand the decision to the user with its options and at least one suggested path with rationale, rather than choosing arbitrarily. At authoring time this surface is one labeled "Open decision:" that lists the options and names the default an implementer takes without further input, and one labeled open decision is the authoring ceiling because every other fork was reconciled from the material available while writing. Each stage that meets an open decision applies this one procedure at its own point in the lifecycle.## Approach led by the verbatim label **Out of scope:**, one statement per exclusion. Each entry is one of two kinds. A rejection stands alone — work this task never does, which the positive, action-oriented authoring rule already lets a task state directly, optionally citing the standing repo rule or CHARTER.md boundary that motivates it. A deferral names its owner — work recognized but pushed out of this task links the sibling task that owns it per the <markdown_policy> cross-link discipline, keeps the implementable detail in that owner, and stays a one-line pointer; the pointer marks ownership, never ordering, and imposes no prerequisite on either side. Scope trimmed from a task at creation, update, or repair lands as a deferral naming its owner or as an explicit rejection, never as a silent drop. Existing tasks converge on this form opportunistically as they pass through update, check, and auto-repair; the convention mandates no migration sweep.Keep each task scoped to one atomic item. Size by cohesion when one change spans many parts of one system: if the work shares one rationale, one edit surface, and one acceptance story, keep it one task even when part count is high. When atomicity and part count pull apart, cohesion decides; the 300-line ceiling still wins. Split independent items, expandable tangents, and tasks that grow past 300 lines into siblings before continuing.
</file_format>
<dependency_signals>
The family's single definition of when one task is a prerequisite of another and how that relationship is read from the backlog. The single-task front ends inherit this block rather than each carrying a copy: task_select uses it to sequence candidates during ranking, and task_implement uses it to gate a build behind unbuilt prerequisites. The relationships stay inferred from existing task content — no frontmatter dependency field exists.
A prerequisite is a live eligible task — frontmatter status open, checked, or ready — that is not yet done and must ship before the task depending on it. A relationship pointing at an implemented, audited, finished, deferred, or archived task is already satisfied and imposes no order.
Read the relationship from four signals already present in the task data:
depends on, blocked by, must follow, after, or a companion reference naming another task file.<markdown_policy> Link to another task file when the cross-reference carries weight rule, rather than a relatedness-only "see also".A relationship runs in both directions. A task is a prerequisite either by its own outbound signal — its body names what it waits on — or by another live task's inbound declaration — another live task's body names a first-ship order over it or forward-references an artefact it creates. Read both directions: a task silent about its own ordering can still be blocked by an inbound note authored in another live task, including one outside a user-applied scope filter.
Split the relationship strength two ways:
<readiness_checklist>
The readiness lens for one task file, judged against the self-sufficiency bar <body> defines. It lives here as the family's single source: judge a draft against it before writing the file, and judge an existing task against it before handing it to an implementer.
CHARTER.md exists at the project root, validate the task content against its boundaries and invariants. Surface every conflict as a readiness issue, leave the task body unchanged, and keep the task out of ready until the conflict is resolved.# Title and carries the ## Goal / ## Context / ## Approach / ## Acceptance sections, with valid frontmatter, per <body> and <file_format>. A one-shot implementer follows structure literally, so a structural gap is high-severity — run this before the content lens.deferred through task_finish or the <archive> workflow is one honest option beside re-scoping the intent or refuting the finding with evidence — a checking or repairing surface presents these options and never applies one itself. Drifted — the motivation still holds while described details have moved on: files renamed or relocated, cited passages reworded, part of the work meanwhile shipped. Each drifted detail is an ordinary readiness issue whose repair refreshes the body against the current codebase.scope, the files cited in Context and Approach — and derive the concrete touch-points its change would create, rename, remove, or consume: symbols, function and type names, config keys, rule or tag names, file states, and behaviours.**Out of scope:** block excludes is a contradiction finding, and an entry readable as either a rejection or a deferral — so an implementer cannot tell whether the work is dropped or owned elsewhere — is a finding on the same rank. Route a confirmed boundary finding's disposition through Decide or label rather than defining a new one: reconcile against the evidence when it settles which side wins, else surface with options.description name the deliverable set the body now carries. Flag either one when its named scope is narrower than the body's deliverables or sections; for example, a title naming two workflow threads over a five-thread body flips the finding on, while a title that covers those five threads flips it off. Fix by widening the stale field in place per Rewrite in place. Keep this distinct from Structural check, which checks presence, and Contradictions, which checks consistency rather than under-coverage.:N path suffix, a bare line N, or an around lines N–M range, or an ordinal list-position anchor such as "step 6", "item 3", or "the second bullet" — is flagged against the <markdown_policy> soft-pointer rule.<body> corollary says belongs in a standing project instruction; this is a readiness issue, not wording polish, because copied rules drift from their source. Replace the copy with a standing-rule citation, or drop it when the surrounding text carries nothing else. Keep this distinct from Over-specification, which narrows an implementation choice, and apply the Task-specific gates only acceptance clause for generic project-gate items: a generic gate is a restatement, while a task-specific executable check remains valid.<path_resolution>
The bundled scripts (discover_tasks.sh, init_tasks.sh, lint.py) live in scripts/ next to this SKILL.md. Resolve each script's absolute path by combining the directory of this SKILL.md with scripts/<script-name> and invoke that absolute path — never a bare scripts/..., which resolves against the current working directory (the target project) rather than the skill, and so finds the project's own scripts/ or nothing. Every agentic IDE that surfaces a skill exposes the file path it loaded the skill from, so the parent directory is always knowable. If the first invocation reports a missing file, re-resolve the absolute path once before treating the script as failed; never conclude the script is absent because of perceived path uncertainty.
</path_resolution>
<verification_economy>
Each linter, test suite, or named check runs to produce evidence about the current state of what it inspects, so run it once per that state rather than once per workflow step. One run's output is evidence for every later step in the same session that faces the identical state, so the family reuses it instead of repeating the run on unchanged inputs. This trims cost and latency while preserving coverage: a re-run skipped on unchanged inputs would surface exactly what the prior run on that same state already surfaced, so the rule keeps every finding available and stays within the project coverage guardrail a CHARTER.md sets when present (consulted through <standing_doc_consumption>).
Running is the default, and three runs are always sound:
Skipping a run is the exception and carries the burden of proof. Skip only when both grounds hold — the prior run's output is visible in the current session, and neither the tool nor anything it inspects has changed since that run — and name the relied-on run when you skip. Run when either ground is uncertain. Skipping a check whose inputs changed, or a standing gate at its moment, stays out of bounds.
Expensive or stochastic surfaces need one more provision. For costly or sampling-noisy checks — LLM evals, long integration runs — repetition on unchanged inputs adds cost and noise rather than assurance, so record the graded result where the project's testing conventions keep it and let a later stage accept that recorded result as evidence when it postdates every artifact under test, re-running only when the record predates an artifact under test or is missing. TESTING.md, when present at the project root, names which surfaces count as expensive and where their recorded results live.
</verification_economy>
if TASKS=$(scripts/discover_tasks.sh); then
: # tasks/ already scaffolded
else
rc=$?
if [[ $rc -eq 1 ]]; then
scripts/init_tasks.sh "$TASKS" # scaffold tasks/ + tasks/archive/
else
exit "$rc"
fi
fi
init_tasks.sh is idempotent: safe to call again on an existing tasks directory.
When FEATURES.md and/or ARCHITECTURE.md exist at the project root, read them before the prior-art codebase scan: FEATURES.md supplies higher-signal existing behaviour, and ARCHITECTURE.md supplies design context. When either doc is absent, continue unchanged.
For an incident-shaped request — a failure case, an error, a "when X happens it breaks" — settle the altitude as part of gathering, as a decision rather than a question: decide from the request and the surrounding code whether the task delivers the point-fix for the reported case or the general behaviour whose absence caused it, and default to the point-fix when the evidence supports nothing more. Record the choice as an explicit clause in the task's ## Goal — the point-fix for the named case, or the behaviour definition with the incident as its motivating case — and surface it among the assumptions the create report names, so the user's reply is the correction point.
Generalize from the motivating instance when a concrete episode is mined to improve a reusable artifact: for example, a working session with a skill that exposed a rough edge yields a task to improve that skill. The altitude is the general rule the episode argues for, not the point-fix, and the originating episode rides along only as the brief illustration the <body> Illustrate rule provides.
When a user-specific or sensitive specific might be necessary and it is unclear whether to include it, ask the user for the level of detail rather than silently including or dropping it.
<prior_art> Before naming and writing, confirm the request is not already captured or already built — a two-tier gate that stays cheap until there is a reason to dig.
Tier 1 — fast scan, always. Derive a few distinctive terms from the task's intent and rg them across both tasks/ and tasks/archive/ (the <query> search). This is a quick keyword pass over every existing task file, open and closed.
<scope>. Stop here; do not escalate.Tier 2 — in-depth analysis, only when Tier 1 hits. Investigate whether the requested work is genuinely new, partly done, or fully done. Read each matched task file in full, and inspect the project itself — the code, modules, and docs the request would touch — to judge the real implementation state rather than trusting a task's stated status. Classify the request as one of:
<scope>.tasks/ already captures this work.finished/deferred task, or already in the codebase) and some is genuinely new. When a hit lands on archived finished work or code already in place, re-derive the genuinely-new delta before recommending any file write: identify what is redundant, what extends shipped work, and what remains unrelated and new.finished work already covers the full request.deferred task already weighed this and parked it.Surface, never auto-resolve. Report the classification with concrete evidence — the matched file paths and the specific code that already covers the work — then surface the overlap and proposed split before asking the user how to proceed: create as new anyway, fold the fitting delta into an open task, file a follow-up that extends and cross-links the shipped finished task, narrow this task to only the genuinely-new remainder, reopen the deferred task, or skip creation when overlap is total. Write a file only after the user's call. When they choose to proceed anyway, cross-link the related task(s) in ## Context.
</prior_art>
<lint_after_create>
Run python3 scripts/lint.py --quiet and fix every blocking finding before declaring the task created.
</lint_after_create>
<batch_creation> When the user hands over multiple tasks in one go, write each as its own atomic file. Pause and split when any single task threatens to exceed 300 lines, or when several items overlap but each is independently expandable. </batch_creation>
<lossless_conversion>
Whenever a task is derived from source material, hold a lossless-conversion contract — and run it on your own, without the user asking. A source is any pre-existing body of meaning being mined into tasks: an AI chat session, a pasted note, a todo.md, a spec, a PDF, a meeting transcript, a file on disk. The trigger is the presence of a source being mined — never its medium, and never how many tasks result. Producing a single task does not skip the check: one source can carry far more than one task's worth of meaning, so the lone task must still capture all of what's relevant. Source volume scales only how much the coverage pass has to walk, never whether it runs.
<gather>, the relevant unit is the general lesson; the episode's specifics become illustration rather than content to retain verbatim.Applying check findings is a first-class update flow: when the user replies with issue numbers and per-number decisions — accept, reject, or modify — apply each accepted finding's minimum fix to the task file, leave each rejected finding's passage as it is, and fold a user-modified instruction in over the report's suggestion. Numbers index the most recent task_check report in the conversation; when no report is in context, ask for the issue list instead of guessing. When the user declares the task ready over remaining findings, stamp status: ready. The whole round is one update: bump updated once in the same edit round and re-run the linter once at the end.
status in the frontmatter to finished (work is done and shipped) or deferred (parked, not pursued for now).updated to the current datetime.<tasks>/ to <tasks>/archive/ with git mv (or plain mv if the project is not a git repo). The filename does not change.archive/, covering all three outbound classes: a live sibling still at <tasks>/ (foo.md becomes ../foo.md), an already-archived sibling (archive/foo.md becomes foo.md), and a target outside the tasks tree, now one ../ deeper (../plugins/… becomes ../../plugins/…). Then scan the whole tasks tree — tasks/ and tasks/archive/ alike (e.g. rg the moving filename across both) — for inbound links to the moving file, and rewrite every hit to either point at the archived location or convert to plain text plus (archived) when the link is no longer load-bearing.finished, ARCHITECTURE.md exists at the project root, and the completed work extended the system's design, update ARCHITECTURE.md in the same archive pass. When the doc is absent or the task did not change the design, continue unchanged.python3 scripts/lint.py --include-archive --quiet so the just-moved file is checked in its new location, and resolve every blocking finding for that file before declaring the archive complete; findings in other archived files are pre-existing context for task_fix rather than blockers of this close-out.
python3 scripts/lint.py # auto-discover via discover_tasks.sh
python3 scripts/lint.py /custom/path # explicit tasks directory
python3 scripts/lint.py --quiet # blocking + warn only
python3 scripts/lint.py --include-archive # archive-inclusive: task_fix maintenance + close-out verify
Findings come in three buckets:
path:N, path ~N, capitalized or lowercase line N / line ~N / around lines N-M, and parenthesized (~N) / (~N-M) shapes, while skipping size extents such as ~16 KB, 512 bytes, and 100 MB. Treat each soft-pointer warn as a candidate, not a verdict: read the hit in surrounding context, rewrite a genuine line anchor to a verbatim greppable label, and leave a false positive such as a size, version, count, or quoted claim-shape untouched.The mechanically fixable lint finding set is the authoritative type list for task-family siblings that auto-repair linter output. Apply only the entries whose target is determinable in the current scope, and surface the rest:
<user_name_chain>, or already present in the task context; normalise an unambiguous non-ISO created or updated value; repair status/location mismatches and archived non-terminal statuses through the lifecycle workflow that owns that move.description into one compact canonical line within the linter budget while preserving the named scope, important nouns, and user-visible deliverable; remove the stale over-budget wording rather than appending a second summary.Mechanical lint repair preserves task intent and file semantics. It bumps updated once for a content-changing edit group, leaves updated unchanged when it makes no change, and reports every surfaced judgement call with the linter category and reason.
<one_task_per_file> One task per file. Atomic scope. When new material is expandable but tangential, file a sibling task and cross-link rather than folding it in. </one_task_per_file>
<split_at_300>
Split at 300 lines. Below this ceiling, apply the scope-sizing rule in <body> before slicing by part count. Past the ceiling, the task has stopped being a single implementable unit. Slice it into siblings that each carry full context.
</split_at_300>
<status_matches_location>
Status matches location. open, checked, ready, implemented, and audited live in tasks/; finished and deferred live in tasks/archive/. The linter blocks on a terminal status under tasks/; archive-inclusive maintenance migrates a non-terminal archived status to finished.
</status_matches_location>
<bump_updated>
Bump updated on every change. Body edit, frontmatter edit, status change, archive move — all bump updated to the current datetime. Legacy provenance backfill and legacy status migration leave updated unchanged when they are the only edits in the file; when the same pass also makes a content fix, bump updated for that content fix and let the legacy backfill ride along.
</bump_updated>
<single_shot_ready> Write for a single-shot implementer. The task file carries everything the work needs that the project itself does not already hold; everything available at implementation time — codebase, the standing-instruction baseline named in the standing-doc consumption section, the user — stays in play. A body that leans on its birth conversation fails this bar: that conversation is the one context certain to be gone. </single_shot_ready>
<not_a_wiki>
Tasks are not wiki pages. Upcoming work goes here; durable subject knowledge goes in the wiki skill. If a task taught a lasting lesson, capture that lesson separately in the wiki when archiving.
</not_a_wiki>
task_create — write one task filetask_check — readiness gate before building (read-only)task_auto_check — autonomously repair one task until task_check reports readytask_explain — explain one task at a high level (read-only)task_select — choose and rank the next eligible task/action (read-only)task_implement — do the worktask_audit — verify a believed-done task against the codebase (read-only)task_finish — close out: set status, bump updated, archivetask_fix — audit and repair the whole tasks treeThese ship together as a family; any sibling may be absent if a deployment excluded it. The family layers as a graduated drift-prevention spectrum: the plain manual chain follows the harness-loaded standing-instruction baseline and adds no autonomous hard gate; task_auto_check adds the optional readiness loop; autonomous writers, including future implementer and shaper surfaces, carry the hard CHARTER.md guardrail; and softer standing docs inform work through the verified test-discipline rule, the descriptive ARCHITECTURE.md, and the FEATURES.md ledger. ARCHITECTURE.md describes goals, stack, and design decisions; it is distinct from the charter's falsifiable boundary role and from any status-board, stage-index, or build-order view. The default manual chain is create → check → implement → audit → finish, with task_auto_check as an opt-in readiness repair loop, task_select a read-only chooser for what to work on next, and task_fix maintaining the tree.
</task_skill>
npx claudepluginhub theafh/ai-modules --plugin ai_devDefines conventions for TASKS.md files: structure with optional sections, status symbols ([ ] todo, [/] ongoing, [x] done, [-] backlog), task descriptions, and testable acceptance criteria. Use for creating, editing, updating tasks or tracking progress.
Creates implementation plans for new features, archives completed tasks, and updates the task index from conversation context.