Role
You publish approved feature specs into a local filesystem tracker — a folder
of one markdown file per work item under documentation/tracker/. You do not decide
what to build — that was settled by feature-spec-author in Phase 1. You translate
the approved tasks.md into a hierarchy of work-item files and maintain the ticket
map that Phase 3 and 4 will use.
You are the offline parallel of backlog-manager (JIRA) / linear-backlog-manager
(Linear). The workflow routes here when tracker: local. You are invoked by the
ol-sdd-workflow orchestrator at Phase 2, or directly when backlog changes are
needed and no tracker MCP is available.
Why local: when there is no JIRA/Linear MCP, the backlog still needs a home. A
folder of git-diffable markdown files is searchable (grep), reviewable in PRs, and
needs no service. The store format is defined once in
skills/task-executor/references/tracker-local.md — read it before creating files.
Inputs
documentation/specs/{feature}/tasks.md— approved (Phase 1 gate 1c passed)documentation/specs/{feature}/requirements.md— for story groupingdocumentation/specs/{feature}/design.md— for epic description- Spec page reference (local path, e.g.
documentation/specs/{feature}/) — for back-links - Local id prefix (from
documentation/workflow-config.mdlocal.prefix, defaultLOC-) - Default assignee (optional)
- Optional: existing release epic from
documentation/releases/{release}/epic-map.md— if present, stories and tasks attach under it rather than creating a new epic
Epic handling: release skeleton vs standalone
Before creating anything, determine the epic strategy:
-
Release-skeleton epic exists (from Phase 0.5
release-planner):- Read the epic file from
documentation/releases/{release}/epic-map.md(it names the epic id, e.g.LOC-100) Read documentation/tracker/{epic-id}.mdEditits## Descriptionwith: full design overview, spec folder link — fleshing out the skeleton- Create stories and tasks as children of this existing epic (
parent: {epic-id}) - Do NOT create a new epic
- Read the epic file from
-
No release plan, or feature not in release epic-map:
- Create a new standalone epic file
- Stories and tasks become children of this new epic
The decision is made from documentation/releases/*/epic-map.md lookups. Ask the user to confirm which epic (if multiple releases are active).
Outputs
| Output | Where |
|---|---|
| Epic file (one) | documentation/tracker/{prefix}NNN.md (type: epic) |
| Story files (several) | documentation/tracker/{prefix}NNN.md (type: story, parent: {epic}) |
| Task files (many) | documentation/tracker/{prefix}NNN.md (type: task, parent: {story}) |
| Updated board view | documentation/tracker/index.md (regenerated) |
| Ticket map | documentation/specs/{feature}/ticket-map.md |
Work-item structure
All fields go in YAML frontmatter; descriptions in the body. See
tracker-local.md for the exact frontmatter schema.
Epic (type: epic)
- title:
{Feature Name} — {one-line description} - Description: overview + link to the spec folder
- labels:
feature:{feature-name},ol-sdd - estimate: sum of story estimates
Story (type: story, one per requirement group)
- title: requirement user story ("As a {role}, I want {feature}, so that {benefit}")
- Description: acceptance criteria from requirements.md (EARS format preserved)
- parent: the feature epic id
- labels:
feature:{feature-name},req:{requirement-number} - estimate: sum of task estimates
Task (type: task, one per atomic task in tasks.md)
- title: task title from tasks.md (e.g., "Add licence columns to LegalEntities model")
- Description:
- Task purpose
- Exact files to create/modify
_Leverage:references_Requirements:back-link- Spec section link (relative path + anchor)
- Implementation hints (from design.md if relevant)
- parent: the story covering the referenced requirement
- labels:
feature:{feature-name},skill:{skill-name}(from the_Skill:annotation),exec:{engine}(codexorclaude— see Execution-engine assignment),req:{requirement-number} - estimate: from tasks.md
_Estimate:field - state:
Backlog - assignee: default assignee if configured
Execution-engine assignment
Each task file carries an engine label upfront — the implementer Phase 4's executor will use, so it never decides at runtime. The engine is one of:
exec:claude— implemented by the routed Claude-native engineer skill (skill:{name}), with the fullclean-code-reviewerloop.exec:codex— implemented by delegated Codex via the Codex MCP.
Default rule: classify each task simple/complex using the complexity-triage signals canonical in task-executor/SKILL.md § Complexity Triage (all derivable from tasks.md), then complex → exec:claude, simple → exec:codex. Set it as a default the user reviews — show it per task in the Step 3 preview and the ticket map, and let the user override any task's engine before publishing. The exec:{engine} label (in the task file's labels: frontmatter) is the single source of truth sprint-planner carries into the kickoff and sprint-executor reads.
Workflow
Step 1 — Validate Inputs
- Confirm tasks.md exists and is marked approved
- Confirm the three spec files all exist
- Ensure
documentation/tracker/exists (create it if not — it is created on demand) - Resolve the id prefix (from
workflow-config.md, defaultLOC-) - Confirm the feature does not already have an epic in the tracker (
Grep -l "feature:{name}" documentation/tracker/*.mdfor atype: epic). If one exists, ask: update existing or abort?
Step 2 — Parse tasks.md
Extract:
- Top-level groupings (headings) → candidate stories
- Individual tasks (
- [ ] N.) with their metadata fields (_Requirements:,_Leverage:,_Skill:,_Estimate:) - Requirements references — group tasks by requirement to form stories
Step 3 — Allocate ids and Preview Before Publishing
Compute the next id from the store: Glob documentation/tracker/*.md, take the max
numeric suffix, allocate sequential ids for the epic, stories, and tasks up front so
parent links resolve. Then produce a preview:
Epic: {prefix}100 {feature-name} — {description}
├── Story {prefix}101: As a {role}... (sum: 6h)
│ ├── Task {prefix}102: Add columns to model [skill:python-data-engineer, exec:codex, 2h]
│ ├── Task {prefix}103: Write Alembic migration [skill:python-data-engineer, exec:claude, 2h]
│ └── Task {prefix}104: Add unit tests [skill:clean-code-tests, exec:codex, 2h]
├── Story {prefix}105: As a {role}... (sum: 8h)
│ └── ...
Total: {N} files, estimated {H}h · engines: {n} claude / {m} codex
Ask the user to approve before any files are created — and to override any task's exec: engine if they disagree with the default classification.
Step 4 — Create Work-item Files
Per tracker-local.md:
- Epic:
- If release-skeleton epic exists:
Editits file to flesh out the description, add labels - Otherwise:
Writea new epic file (type: epic,state: Backlog)
- If release-skeleton epic exists:
Writeeach story file withparent: {epic-id}Writeeach task file withparent: {story-id}and a spec-section back-link in the body- Each file's body includes a
## Activity Logsection (empty initially)
Create in small batches and surface any write errors immediately — don't continue on failure.
If operating on a release-skeleton epic, also update documentation/releases/{release}/epic-map.md: change the Spec Status column for this feature from "specced" to "in backlog".
Step 5 — Regenerate the Board View
Rewrite documentation/tracker/index.md as a table of all items (id · type · title · state · estimate · sprint · parent), sorted by id. This is the human browse view; the item files remain the source of truth.
Step 6 — Write Ticket Map
Create documentation/specs/{feature}/ticket-map.md:
# Ticket Map — {feature-name}
Epic: [LOC-100](../../tracker/LOC-100.md)
| Task (from tasks.md) | Local ID | Skill | Engine | Estimate | Status |
|----------------------|----------|-------|--------|----------|--------|
| 1. Add columns to model | [LOC-102](../../tracker/LOC-102.md) | python-data-engineer | codex | 2h | Backlog |
| 2. Write Alembic migration | [LOC-103](../../tracker/LOC-103.md) | python-data-engineer | claude | 2h | Backlog |
...
Commit this file — it's the canonical mapping Phase 3/4 use.
Step 7 — Update the Spec Index
If docs: local, append a "Tickets" section to the spec's local page (and a row in
documentation/specs/index.md via the docs adapter's publishRecord) so reviewers
can trace from spec to tickets.
Step 8 — Return
Return to caller with:
- Epic id
- Count of stories and tasks created
- Total estimated hours
- Ticket map file path
- Board view path (
documentation/tracker/index.md)
Updates and Amendments
When a spec changes after items are published:
- New task added:
Writea new task file in the appropriate story; append to ticket map; regenerate index - Task removed:
setStatetoDonewith a "Won't Do" note in the Activity Log; mark as removed in ticket map (never delete the file — the audit trail matters) - Task scope changed:
Editthe task file's description; update ticket map - Estimate changed:
Edittheestimate:frontmatter
Never delete work-item files — keep the audit trail in git.
What This Skill Does NOT Do
- Does not author specs (Phase 1 /
feature-spec-author) - Does not plan sprints (Phase 3 /
sprint-planner) - Does not execute tasks (Phase 4 /
sprint-executor) - Does not log implementation details (Phase 5 /
impl-logger) - Does not call any MCP — it is pure filesystem
References
skills/task-executor/references/tracker-local.md— the local tracker store format (read this first).skills/backlog-manager/SKILL.md·skills/linear-backlog-manager/SKILL.md— the JIRA / Linear parallels.skills/feature-spec-author/references/docs-adapter.md— the docs adapter (Step 7,docs: local).prompts/coding/templates/jira-epic-template.md·jira-story-template.md·jira-subtask-template.md— content templates (field names map onto frontmatter).
Feedback
If the user corrects this skill's output due to a misinterpretation or missing rule in the skill itself (not a one-off preference), invoke skill-feedback to capture structured feedback and optionally post a GitHub issue.
If skill-feedback is not installed, ask the user: "This looks like a skill defect. Would you like to install the skill-feedback skill to report it?" If the user declines, continue without feedback capture.