원클릭으로
ts-task-new
Scaffold a new task file in docs/developers/tasks/open/ and update OVERVIEW.md
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Scaffold a new task file in docs/developers/tasks/open/ and update OVERVIEW.md
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | ts-task-new |
| description | Scaffold a new task file in docs/developers/tasks/open/ and update OVERVIEW.md |
The user invokes this as /ts-task-new "Short task title" (optionally with
--effort S|M|L|XL, --complexity Junior|Medium|Senior,
--epic <EpicName>, --order <N>, and --assigned <username>).
Steps:
Determine the next task ID by reading docs/developers/tasks/OVERVIEW.md — the
<!-- GENERATED --> block lists every open and closed task ID. Find the highest
TASK-NNN number there and add 1. Do not scan individual task files for this;
OVERVIEW.md is the authoritative index and is always up to date.
Build the filename slug from the title: lowercase, spaces/special chars → hyphens,
max 50 chars, prefixed with the new ID (e.g. task-059-my-new-task.md).
Generate detailed suggestions for the task:
Soft nudge to split L/XL tasks. If --effort L or --effort XL
was supplied (or, when the user did not supply --effort, the
suggestion you arrived at in step 3 is L/XL), pause before writing
the file and propose a candidate split. Sketch 2–4 smaller tasks,
each ideally S or M, that together cover the same ground. Then
let the user choose one of three paths:
prerequisites: (each new task lists
the previous one), give them the same epic: as the original
proposal, and assign contiguous order: values starting from
whatever next_order was derived for the original. Skip step
4 (the split nudge) recursively for these children — they are already small.## Sizing rationale section to the body capturing the user's
one-line reason for keeping it whole. Ask the user for that
one-liner before writing the file.## Sizing rationale containing the single line:
Scope not yet decomposable.The nudge is a prompt to think, not a gate. Sometimes a Large task really is atomic (a refactor that breaks the build mid-way, a third-party migration, a single transactional change) — the rationale captures why the size is intentional so future readers do not have to re-litigate the decision.
Scope is scaffold time only: do not run this check at activation
time, do not warn from housekeep.py, do not block at pre-commit.
Effort that is bumped up to L/XL after creation is out of scope for
this nudge.
Present the suggestions to the user for review and correction
Write the file to docs/developers/tasks/open/ with this enhanced template:
---
id: TASK-NNN
title: <title>
status: open
opened: <YYYY-MM-DD>
effort: <effort label>
complexity: <complexity>
human-in-loop: <hil value>
epic: <EpicName> # omit entirely if no epic
order: <N> # omit entirely if no epic; integer execution order within the epic
assigned: <username> # omit entirely if not provided
prerequisites: [TASK-NNN, TASK-NNN] # omit entirely if none
---
## Description
<expanded description with context and purpose>.
## Acceptance Criteria
- [ ] <specific criterion 1>
- [ ] <specific criterion 2>
- [ ] <specific criterion 3>
## Test Plan
<See rules below — fill in the appropriate section(s)>
## Prerequisites
<!-- Omit this section entirely if the frontmatter prerequisites field is absent -->
- **TASK-NNN** — <one line: what this task delivers that the current task needs>
- **TASK-NNN** — <one line: what this task delivers that the current task needs>
## Sizing rationale
<!-- Include this section ONLY when effort is L or XL AND the user kept the
task whole (or skipped the split nudge per step 4). Omit otherwise. -->
<one line explaining why this task is intentionally sized L/XL and not split>
## Notes
<dependencies, risks, considerations, and other context>
Set opened to today's date in YYYY-MM-DD format.
Effort labels — --effort accepts only the canonical six t-shirt sizes:
| Flag value | Frontmatter label |
|---|---|
XS | XS (<30m) |
S | Small (<2h) |
M | Medium (2-8h) |
L | Large (8-24h) |
XL | Extra Large (24-40h) |
XXL | XXL (>40h) |
Never write any other string into effort:. Legacy labels like
Trivial (<30m), Small (1-2h), Small (1-3h), Small (2-4h), or
Large (>8h) may still appear in already-closed tasks — readers tolerate
them on input, but new files use only the canonical six.
Complexity values (--complexity): Junior, Medium, Senior.
human-in-loop values: No, Clarification, Support, Main.
epic: free-form epic name. Omit the field entirely if the task does not belong to an
epic. When provided, also set order to the integer execution sequence within the epic
(1 = first). Tasks in the same epic are displayed together in OVERVIEW.md, sorted by order.
Deriving order when --order is not supplied: scan every task file
across open/, active/, and closed/ for tasks belonging to this epic, take
the maximum order value, and add 1. Closed tasks must be included — orders
are not recycled when a task closes; they remain part of the epic's historical
execution sequence. Never derive order from "the most recently created task"
or "the highest open order" — both will collide with closed tasks. If the epic
has no tasks yet, use order: 1.
Concrete derivation command (run from repo root):
grep -l "^epic: <EpicName>$" docs/developers/tasks/*/*.md \
| xargs grep -h "^order:" \
| awk '{print $2}' | sort -n | tail -1
Then next_order = that_value + 1.
Collision check when --order <N> is supplied: run the same scan and verify
N does not already appear among existing orders for this epic. If it does, stop
and report the collision (which task already holds that order) instead of writing
a duplicate. Do not attempt to "shift" or renumber other tasks to make room.
assigned: optional username of the task owner. Omit the field entirely if not provided.
prerequisites: optional list of TASK-IDs that must be complete before this task starts.
Omit the field entirely if the task has no prerequisites. When present, also add a
## Prerequisites section in the body explaining what each predecessor delivers.
If the user does not supply required values, infer them from context or ask. Do not leave
these as ? — they must be set so the overview table is meaningful.
Run python scripts/housekeep.py --apply to regenerate OVERVIEW.md, EPICS.md,
and KANBAN.md.
Documentation check — after writing the task file, assess whether the work described would require updating user-facing or developer documentation:
docs/builders/, docs/musicians/, README.md): new
features, changed behaviour, new config keys, new CLI commands, new action types.docs/developers/ARCHITECTURE.md, TESTING.md, etc.):
new classes, changed interfaces, new test patterns, changed data-flow.docs/simulator/, docs/tools/config-builder/): new
action types or config keys that the simulator or builder need to support.Apply this rule:
| Situation | Action |
|---|---|
| The task explicitly says to update docs, or the scope obviously requires it (e.g. "add new action type") | Add a Documentation section to the task body listing which files need updating and what to add/change. |
| The task description is silent on docs and the impact is unclear | Ask the user: "Should this task include updating [specific doc files]? Or is that a separate follow-up task?" — then wait for the answer before writing the file. |
| The task is purely internal (tests, refactors, CI, infra) with no user-visible change | No documentation step needed — omit the section. |
When a Documentation section is warranted, add it to the task body after the Test Plan:
## Documentation
- `docs/builders/KEY_REFERENCE.md` — add a section for the new action type with a JSON example
- `docs/developers/ARCHITECTURE.md` — update the Action class hierarchy diagram
Report the new task ID and file path.
Do not commit.
Every task must include a Test Plan section. Use the decision table below to fill it in.
| The task changes… | Test layer |
|---|---|
Pure logic in lib/PedalLogic/ with no Arduino/GPIO calls | Host tests only (test/unit/) |
| GPIO, ISRs, interrupts, pin state, hardware timing | On-device tests (test/test_*_esp32/ or test/test_*_nrf52840/) |
| Both layers | Both |
| Only docs, config, scripts, or CI — no C++ logic | "No automated tests required — change is non-functional" |
## Test Plan
**Host tests** (`make test-host`):
- Add `test/unit/test_<feature>.cpp`
- Register in `test/CMakeLists.txt`
- Cover: <list key scenarios>
## Test Plan
**On-device tests** (`make test-esp32-button`):
- Extend `test/test_buttons_esp32/test_main.cpp`
- Cover: <list key scenarios>
- Requires: ESP32 connected via USB
## Test Plan
**Host tests** (`make test-host`):
- Add `test/unit/test_<feature>.cpp`
- Cover: <logic scenarios>
**On-device tests** (`make test-esp32-button`):
- Extend `test/test_buttons_esp32/test_main.cpp`
- Cover: <hardware scenarios>
- Requires: ESP32 connected via USB
Write Bash commands that don't trigger unnecessary permission prompts. Use Read/Edit/Grep instead of head/tail/sed/awk/cat/echo; split chained commands (&&, ;, ||) into separate Bash calls; drop diagnostic suffixes like `; echo "EXIT=$?"`. The allowlist matches whole command strings — every mismatch costs the user attention.
Commit user-named files atomically via scripts/commit-pathspec.sh (which wraps `git commit -m "..." -- <files>` and writes the provenance token the pre-commit hook validates). Applies the CLAUDE.md "Pre-commit hook failures on unrelated changes" protocol when the hook fails. Never adds --no-verify silently — explicit user approval is required.
Scaffold a new epic file in docs/developers/tasks/open/ and run housekeep
Scaffold a new idea file in docs/developers/ideas/open/ and regenerate the ideas OVERVIEW.md
Set a task to active — updates status, moves to active/, runs housekeep. Also resumes paused tasks (paused/ → active/ or active/ with closed prerequisites).
Mark a task as closed — writes effort_actual, moves the file to closed/, runs housekeep, and commits