Create Work Item
Overview
Create a new work item (backlog entry) in /backlog/ with consistent structure, YAML metadata, and conventions. Work items track features, bugs, spikes, and tasks with clear goals, dependencies, and acceptance criteria.
When to Use
Create a work item when:
-
Starting a new feature, spike, or task
-
Documenting a well-scoped request or bug
-
Breaking down larger epics into tracked subtasks
-
Proposing architectural changes or experiments
-
Establishing clear success criteria before implementation
When NOT to Use
Skip work items for:
-
Trivial one-off fixes (can be done directly)
-
Exploratory work without clear scope (start with spike first)
-
Time-critical hotfixes (commit directly, backlog after)
-
Duplicate items (update existing instead, see update-work-item skill)
Work Item Lifecycle
Created (not_started) ↓ Implementation (in_progress) ↓ Review + Testing (testing) ↓ Completed (completed) ↓ Archived (to archive/)
Backlog Structure
Directory: /backlog/ (current items) or /backlog/archive/ (completed/superseded)
Naming Convention: <number>_<slug>.md where:
-
<number> : Sequential integer (e.g., 54, 55, 56)
-
<slug> : Kebab-case description (e.g., complete_temple_native , implement_adapter_spec )
Numbering: Continue from highest existing number in /backlog/ (not archive)
File Structure
- YAML Frontmatter
title: "Human-readable work item title" id: <number> status: not_started | in_progress | testing | completed state_reason: null # Set only when status = completed (success | obsolete | redundant | superseded | cancelled) priority: low | medium | high | critical complexity: low | medium | high estimated_hours: <number> actual_hours: null # Set when completed completed_date: null # Set when completed related_commit: [] # Array of commit hashes/refs test_results: null # URL or description of test results dependencies:
- "[[<other_item_number>_<slug>.md]]" related_backlog:
- "archive/<number>_<slug>.md" related_spike:
- "archive/<number>_<slug>.md" notes:
- timestamp: 2024-06-01T12:00:00Z user: @john note: | Optional additional context or implementation notes
- Content Sections
Goal
One-paragraph summary of what this work item achieves. Answer: "What is the end state?"
Background
Context, motivation, or prior work. Answer: "Why are we doing this?"
Tasks
Numbered list of implementation steps or subtasks:
-
Task Name: Brief description
- Sub-point if needed
- Code example if helpful
-
Next Task: Description
Deliverables
What artifacts or code changes will result:
- New file/module:
path/to/file.py - Modified behavior: "CLI now accepts --flag"
- Documentation: "Updated architecture guide"
Acceptance Criteria
Clear, verifiable markers of completion:
- All new tests pass (test_*.py)
- Code coverage > 80%
- Documented in docs/ (README or ADR)
- Reviewed and merged to main
Workflow: Creating a Work Item
- Determine Next ID
-
Check highest numbered file in /backlog/ (not archive)
-
Next ID = max existing + 1
Example: If 56_jinja2_adapter_prototype.md is highest, next = 57_*
- Draft Frontmatter
title: "Implementation feature name" id: 57 status: not_started state_reason: null priority: high # or medium/low/critical complexity: medium # or low/high estimated_hours: 24 actual_hours: null completed_date: null related_commit: [] test_results: null dependencies:
- "[[54_complete_temple_native.md]]" # Links to other work items related_backlog:
- "archive/06_rendering_engine.md" # If refining prior work notes:
- timestamp: 2024-06-01T12:00:00Z user: @john note: Any additional context or decision points
Status Values:
-
not_started : Ready to begin
-
in_progress : Active work
-
testing : Implementation done, awaiting review/test results
-
completed : Finished (may have different reasons—see state_reason )
state_reason (used only when status: completed ):
-
success : Work completed successfully, all criteria met
-
obsolete : Item no longer relevant (market/approach changed)
-
redundant : Duplicate of another work item
-
superseded : Made moot by another item (note which one)
-
cancelled : Work stopped, won't implement (note why)
Priority:
-
low : Nice-to-have, can be deferred
-
medium : Standard work item
-
high : Important, plan next
-
critical : Blocking other work
Complexity:
-
low : ≤6 hours, isolated change
-
medium : 6-20 hours, affects multiple areas
-
high : 20+ hours, architectural or cross-cutting
- Write Goal Section
One sentence to one paragraph:
Goal
Implement FilterAdapter interface in the core temple package to provide built-in filters for data transformation: selectattr, map, join, default, with type annotations.
- Add Context Sections
Background: Why this matters, prior decisions, linked research
Background
Filter support is required for ADR-003 (adapter architecture). Current prototype has hardcoded filter logic; ADR-005 proposes a pluggable FilterAdapter contract. This work implements the concrete contract in temple/sdk/adapter.py with 4 core filters and test coverage.
Tasks: Numbered, actionable steps
Tasks
-
Design FilterAdapter contract
- Extend
temple/sdk/adapter.pywithFilterAdapterclass - Define
apply(input: Any, filter_name: str, args: List) -> Any - Create
FilterSignaturewith type hints
- Extend
-
Implement core filters in FilterRegistry
selectattr(objects, attr, value)→ List[T] where T.attr == valuemap(objects, attr)→ List[extracted]join(items, separator)→ strdefault(value, fallback)→ value if truthy else fallback
-
Add type annotations and validation
- Each filter registers
FilterSignaturewith parameter types - Validate filter arguments at parse time
- Each filter registers
-
Write unit and integration tests
- Test each filter behavior
- Test error cases (type mismatches, missing attributes)
-
Add Deliverables
Deliverables
temple/sdk/adapter.pyextended withFilterAdapterandFilterSignaturetemple/sdk/filters.pywith core filter implementations- Unit tests in
tests/test_filters.py(>80% coverage) - Integration test in
tests/test_renderer_filters.py - Updated API docs in
docs/ADAPTER_SPEC.md
- Add Acceptance Criteria
Acceptance Criteria
- All filter functions are type-annotated and pass mypy
- 100% of filter branches tested (unit + integration)
- Filters integrate seamlessly with renderer
- Code review approved
- Merged to main branch
- Release notes updated
Examples
Example 1: Feature Work Item
title: "Implement JSON Schema validation in template linter" id: 57 status: not_started priority: high complexity: high estimated_hours: 20 dependencies:
- "[[54_complete_temple_native.md]]"
- "[[44_implement_semantic_validation.md]]"
Goal
Add JSON Schema validation to temple-linter to catch schema violations in templates at lint time, catching type mismatches and missing required fields before runtime.
...
Example 2: Spike/Research Work Item
title: "Evaluate expression engine alternatives for complex filters" id: 58 status: not_started priority: medium complexity: medium estimated_hours: 16 notes:
- timestamp: 2024-06-01T12:00:00Z user: @john note: | Spike to evaluate JMESPath vs. custom expression engine for advanced filters. Decision will inform ADR-006 (expression language).
Goal
Research and document three expression engine approaches for advanced data filtering in templates, with proof-of-concept for each.
...
Example 3: Bug/Fix Work Item
title: "Fix elif grammar parsing edge case" id: 59 status: not_started priority: high complexity: low estimated_hours: 4 dependencies:
- "[[54_complete_temple_native.md]]"
Goal
Fix parser to correctly handle consecutive {% elif %} blocks without requiring {% else %} at the end.
Tasks
- Add test case for multiple elif without else
- Update grammar in
token_parser.py - Verify fixture tests pass
Acceptance Criteria
- Edge case test passes
- No regression in existing tests
- Merged to main
Tips & Conventions
Dependency Linking
Link to related work items using [[filename]] syntax:
dependencies:
- "[[54_complete_temple_native.md]]"
- "[[43_implement_template_syntax_validation.md]]"
The double-bracket syntax creates wiki-link references that tools can parse.
Commit Tracking
Record commits that implement this work:
related_commit:
- 6d8c044 # feat(parser): canonicalize control-flow end tokens
- f00459b # fix(renderer): handle filter signature validation
Add these incrementally as work progresses, then complete the item.
Effort Estimation
Use fibonacci-like estimates:
-
1-2 hours: Trivial fixes
-
4-6 hours: Small feature or bug
-
8-12 hours: Medium feature
-
16-24 hours: Large feature
-
32+ hours: Epic or major refactor
Positioning in Backlog
Not all work needs an item:
-
Skip for: Inline changes, trivial docs fixes, emergency hotfixes
-
Create for: Features, spikes, architectural changes, tracked bugs
When in doubt, create the item—it's easier to abandon than to recreate.
Archiving
When a work item is completed:
-
Move file from /backlog/ to /backlog/archive/
-
Set completed_date: YYYY-MM-DD
-
Ensure actual_hours is recorded
-
Document related_commit with all implementation commits
Example: After completing #57, move 57_implement_json_schema_validation.md to archive/57_implement_json_schema_validation.md
Related Skills
-
update-work-item : For changing status, effort, and adding test results during work
-
feature-branch-management : Automatically invoked by update-work-item to create feature branches
-
create-pr : Automatically invoked to create pull requests when item status → testing
-
handle-pr-feedback : For addressing PR review feedback
-
finalize-work-item : For completing and archiving items after PR merged
-
git-commit : For recording implementation commits that reference work items