$ca-task — task-board writer
SkillProductivityThe sanctioned task-board mutator — add a queued task, start one (flips to in-progress and stamps the date, minting a dotted ID on pick-up), or mark an in-progress task done. The only blessed write to open-tasks.md.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the $ca-task — task-board writer skill
What this skill tells your AI
The instructions your AI receives, as published by arbiterforge/codearbiter in plugins/ca-pi/skills/ca-task/SKILL.md and read by ahel’s review.
The one blessed way to mutate <project-root>/.codearbiter/open-tasks.md
(resolves D-1). Hand-editing the board is no longer the only path; this command keeps
every entry schema-conformant and every transition dated. The board LOGIC lives in the
pure _taskboardlib transforms; this command runs the thin writer
hooks/taskwrite.py.
Verbs
Always put -- before user text (a desc or title) so a value beginning with - is not
parsed as a flag. Resolve the interpreter once by presence — PY=python3; { command -v python3 >/dev/null 2>&1 && python3 --version >/dev/null 2>&1; } || PY=python
— never python3 … || python …, which reruns the helper on any nonzero exit and reports the
second run's code instead of the first's (#577) — then invoke "$PY" below.
- add — append a queued task. ID-less by default; pass
--id <group>.<type>to mint a dotted ID now,--from <origin>for a harvest back-ref,--boundaries a,bfor the security/trust boundaries it touches. The description must be nonblank and single-line; origin and boundary values must also stay on one line."$PY" "${PLUGIN_ROOT}/hooks/taskwrite.py" add [--id group.type] [--from origin] [--boundaries a,b] -- "<desc>"
- start — flip a task to in-progress and stamp the started date (so it can never
be a dateless
[~]). On an ID-less item, pass--as <group>.<type>to mint its dotted ID at pick-up.--date YYYY-MM-DDoverrides today."$PY" "${PLUGIN_ROOT}/hooks/taskwrite.py" start [--as group.type] [--date YYYY-MM-DD] -- "<id|title>"
- done — flip an in-progress task to done and stamp the done date (
--dateoverrides today). A queued task must bestarted first."$PY" "${PLUGIN_ROOT}/hooks/taskwrite.py" done [--date YYYY-MM-DD] -- "<id|title>"
A missing target, an already-matching state, an out-of-order transition, a malformed
add field or --date, or an invalid GROUP.TYPE namespace is reported and writes
nothing (exit 1).
A queued done identifies the task as queued and tells the caller to start it first.
Targeting by title is best-effort:
prefer the dotted ID, and
note that if two ID-less items share a title, start/done act on the first — give one
an ID ($ca-task start --as <group>.<type> -- "<title>") to disambiguate.
When NOT to use
- Promoting workflow follow-ups in bulk → that is the harvest (includes/harvest.md), which calls this writer for you.
- Reading the board / counts →
$ca-status(read-only). - Archiving long-settled done items → deferred (D-2); done items stay in-place for now.
- Filing a separate
chore(board)PR just to flip a task state → task-board transitions ([x]done-flip,[~]start-flip, new[ ]add) ride the work commit via commit-gate, co-located atomically with the code that completes, starts, or spawns the task (ADR-0008). A lagging board-only PR is the anti-pattern this design eliminates.
Hard gate
- MUST write the board only through
taskwrite.py(the pure transforms), never a free-hand Edit that can malform the schema. startMUST stamp a started date — never leave a dateless[~].doneMUST target an in-progress task — a queued task must go throughstartfirst.- MUST NOT delete a task to "complete" it — mark it
doneso the record survives.
Signals
- GitHub stars
- 144
- Forks
- 7
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
ca-task- Source
- github.com/arbiterforge/codearbiter