|
|
|
@@ -10,23 +10,23 @@ description: |
|
|
|
|
|
- "prepare for implementation"
|
|
|
|
|
- "decompose tests", "test decomposition"
|
|
|
|
|
category: build
|
|
|
|
|
tags: [decomposition, tasks, dependencies, jira, implementation-prep]
|
|
|
|
|
tags: [decomposition, tasks, dependencies, work-items, implementation-prep]
|
|
|
|
|
disable-model-invocation: true
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# Task Decomposition
|
|
|
|
|
|
|
|
|
|
Decompose planned components into atomic, implementable task specs with a bootstrap structure plan through a systematic workflow. All tasks are named with their Jira ticket ID prefix in a flat directory.
|
|
|
|
|
Decompose planned components into atomic, implementable task specs with a bootstrap structure plan through a systematic workflow. All tasks are named with their work item tracker ID prefix in a flat directory.
|
|
|
|
|
|
|
|
|
|
## Core Principles
|
|
|
|
|
|
|
|
|
|
- **Atomic tasks**: each task does one thing; if it exceeds 5 complexity points, split it
|
|
|
|
|
- **Atomic tasks**: each task does one thing; if it exceeds 8 complexity points, split it
|
|
|
|
|
- **Behavioral specs, not implementation plans**: describe what the system should do, not how to build it
|
|
|
|
|
- **Flat structure**: all tasks are Jira-ID-prefixed files in TASKS_DIR — no component subdirectories
|
|
|
|
|
- **Flat structure**: all tasks are tracker-ID-prefixed files in TASKS_DIR — no component subdirectories
|
|
|
|
|
- **Save immediately**: write artifacts to disk after each task; never accumulate unsaved work
|
|
|
|
|
- **Jira inline**: create Jira ticket immediately after writing each task file
|
|
|
|
|
- **Tracker inline**: create work item ticket immediately after writing each task file
|
|
|
|
|
- **Ask, don't assume**: when requirements are ambiguous, ask the user before proceeding
|
|
|
|
|
- **Plan, don't code**: this workflow produces documents and Jira tasks, never implementation code
|
|
|
|
|
- **Plan, don't code**: this workflow produces documents and work item tickets, never implementation code
|
|
|
|
|
|
|
|
|
|
## Context Resolution
|
|
|
|
|
|
|
|
|
@@ -35,12 +35,14 @@ Determine the operating mode based on invocation before any other logic runs.
|
|
|
|
|
**Default** (no explicit input file provided):
|
|
|
|
|
- DOCUMENT_DIR: `_docs/02_document/`
|
|
|
|
|
- TASKS_DIR: `_docs/02_tasks/`
|
|
|
|
|
- TASKS_TODO: `_docs/02_tasks/todo/`
|
|
|
|
|
- Reads from: `_docs/00_problem/`, `_docs/01_solution/`, DOCUMENT_DIR
|
|
|
|
|
- Runs Step 1 (bootstrap) + Step 2 (all components) + Step 3 (blackbox tests) + Step 4 (cross-verification)
|
|
|
|
|
|
|
|
|
|
**Single component mode** (provided file is within `_docs/02_document/` and inside a `components/` subdirectory):
|
|
|
|
|
- DOCUMENT_DIR: `_docs/02_document/`
|
|
|
|
|
- TASKS_DIR: `_docs/02_tasks/`
|
|
|
|
|
- TASKS_TODO: `_docs/02_tasks/todo/`
|
|
|
|
|
- Derive component number and component name from the file path
|
|
|
|
|
- Ask user for the parent Epic ID
|
|
|
|
|
- Runs Step 2 (that component only, appending to existing task numbering)
|
|
|
|
@@ -48,6 +50,7 @@ Determine the operating mode based on invocation before any other logic runs.
|
|
|
|
|
**Tests-only mode** (provided file/directory is within `tests/`, or `DOCUMENT_DIR/tests/` exists and input explicitly requests test decomposition):
|
|
|
|
|
- DOCUMENT_DIR: `_docs/02_document/`
|
|
|
|
|
- TASKS_DIR: `_docs/02_tasks/`
|
|
|
|
|
- TASKS_TODO: `_docs/02_tasks/todo/`
|
|
|
|
|
- TESTS_DIR: `DOCUMENT_DIR/tests/`
|
|
|
|
|
- Reads from: `_docs/00_problem/`, `_docs/01_solution/`, TESTS_DIR
|
|
|
|
|
- Runs Step 1t (test infrastructure bootstrap) + Step 3 (blackbox test decomposition) + Step 4 (cross-verification against test coverage)
|
|
|
|
@@ -99,8 +102,8 @@ Announce the detected mode and resolved paths to the user before proceeding.
|
|
|
|
|
|
|
|
|
|
**Default:**
|
|
|
|
|
1. DOCUMENT_DIR contains `architecture.md` and `components/` — **STOP if missing**
|
|
|
|
|
2. Create TASKS_DIR if it does not exist
|
|
|
|
|
3. If TASKS_DIR already contains task files, ask user: **resume from last checkpoint or start fresh?**
|
|
|
|
|
2. Create TASKS_DIR and TASKS_TODO if they do not exist
|
|
|
|
|
3. If TASKS_DIR subfolders (`todo/`, `backlog/`, `done/`) already contain task files, ask user: **resume from last checkpoint or start fresh?**
|
|
|
|
|
|
|
|
|
|
**Single component mode:**
|
|
|
|
|
1. The provided component file exists and is non-empty — **STOP if missing**
|
|
|
|
@@ -108,8 +111,8 @@ Announce the detected mode and resolved paths to the user before proceeding.
|
|
|
|
|
**Tests-only mode:**
|
|
|
|
|
1. `TESTS_DIR/blackbox-tests.md` exists and is non-empty — **STOP if missing**
|
|
|
|
|
2. `TESTS_DIR/environment.md` exists — **STOP if missing**
|
|
|
|
|
3. Create TASKS_DIR if it does not exist
|
|
|
|
|
4. If TASKS_DIR already contains task files, ask user: **resume from last checkpoint or start fresh?**
|
|
|
|
|
3. Create TASKS_DIR and TASKS_TODO if they do not exist
|
|
|
|
|
4. If TASKS_DIR subfolders (`todo/`, `backlog/`, `done/`) already contain task files, ask user: **resume from last checkpoint or start fresh?**
|
|
|
|
|
|
|
|
|
|
## Artifact Management
|
|
|
|
|
|
|
|
|
@@ -117,31 +120,33 @@ Announce the detected mode and resolved paths to the user before proceeding.
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
TASKS_DIR/
|
|
|
|
|
├── [JIRA-ID]_initial_structure.md
|
|
|
|
|
├── [JIRA-ID]_[short_name].md
|
|
|
|
|
├── [JIRA-ID]_[short_name].md
|
|
|
|
|
├── ...
|
|
|
|
|
└── _dependencies_table.md
|
|
|
|
|
├── _dependencies_table.md
|
|
|
|
|
├── todo/
|
|
|
|
|
│ ├── [TRACKER-ID]_initial_structure.md
|
|
|
|
|
│ ├── [TRACKER-ID]_[short_name].md
|
|
|
|
|
│ └── ...
|
|
|
|
|
├── backlog/
|
|
|
|
|
└── done/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Naming convention**: Each task file is initially saved with a temporary numeric prefix (`[##]_[short_name].md`). After creating the Jira ticket, rename the file to use the Jira ticket ID as prefix (`[JIRA-ID]_[short_name].md`). For example: `01_initial_structure.md` → `AZ-42_initial_structure.md`.
|
|
|
|
|
**Naming convention**: Each task file is initially saved in `TASKS_TODO/` with a temporary numeric prefix (`[##]_[short_name].md`). After creating the work item ticket, rename the file to use the work item ticket ID as prefix (`[TRACKER-ID]_[short_name].md`). For example: `todo/01_initial_structure.md` → `todo/AZ-42_initial_structure.md`.
|
|
|
|
|
|
|
|
|
|
### Save Timing
|
|
|
|
|
|
|
|
|
|
| Step | Save immediately after | Filename |
|
|
|
|
|
|------|------------------------|----------|
|
|
|
|
|
| Step 1 | Bootstrap structure plan complete + Jira ticket created + file renamed | `[JIRA-ID]_initial_structure.md` |
|
|
|
|
|
| Step 1t | Test infrastructure bootstrap complete + Jira ticket created + file renamed | `[JIRA-ID]_test_infrastructure.md` |
|
|
|
|
|
| Step 2 | Each component task decomposed + Jira ticket created + file renamed | `[JIRA-ID]_[short_name].md` |
|
|
|
|
|
| Step 3 | Each blackbox test task decomposed + Jira ticket created + file renamed | `[JIRA-ID]_[short_name].md` |
|
|
|
|
|
| Step 1 | Bootstrap structure plan complete + work item ticket created + file renamed | `todo/[TRACKER-ID]_initial_structure.md` |
|
|
|
|
|
| Step 1t | Test infrastructure bootstrap complete + work item ticket created + file renamed | `todo/[TRACKER-ID]_test_infrastructure.md` |
|
|
|
|
|
| Step 2 | Each component task decomposed + work item ticket created + file renamed | `todo/[TRACKER-ID]_[short_name].md` |
|
|
|
|
|
| Step 3 | Each blackbox test task decomposed + work item ticket created + file renamed | `todo/[TRACKER-ID]_[short_name].md` |
|
|
|
|
|
| Step 4 | Cross-task verification complete | `_dependencies_table.md` |
|
|
|
|
|
|
|
|
|
|
### Resumability
|
|
|
|
|
|
|
|
|
|
If TASKS_DIR already contains task files:
|
|
|
|
|
If TASKS_DIR subfolders already contain task files:
|
|
|
|
|
|
|
|
|
|
1. List existing `*_*.md` files (excluding `_dependencies_table.md`) and count them
|
|
|
|
|
2. Resume numbering from the next number (for temporary numeric prefix before Jira rename)
|
|
|
|
|
1. List existing `*_*.md` files across `todo/`, `backlog/`, and `done/` (excluding `_dependencies_table.md`) and count them
|
|
|
|
|
2. Resume numbering from the next number (for temporary numeric prefix before tracker rename)
|
|
|
|
|
3. Inform the user which tasks already exist and are being skipped
|
|
|
|
|
|
|
|
|
|
## Progress Tracking
|
|
|
|
@@ -176,11 +181,11 @@ The test infrastructure bootstrap must include:
|
|
|
|
|
- [ ] Test runner configuration matches the consumer app tech stack from environment.md
|
|
|
|
|
- [ ] Data isolation strategy is defined
|
|
|
|
|
|
|
|
|
|
**Save action**: Write `01_test_infrastructure.md` (temporary numeric name)
|
|
|
|
|
**Save action**: Write `todo/01_test_infrastructure.md` (temporary numeric name)
|
|
|
|
|
|
|
|
|
|
**Jira action**: Create a Jira ticket for this task under the "Blackbox Tests" epic. Write the Jira ticket ID and Epic ID back into the task header.
|
|
|
|
|
**Tracker action**: Create a work item ticket for this task under the "Blackbox Tests" epic. Write the work item ticket ID and Epic ID back into the task header.
|
|
|
|
|
|
|
|
|
|
**Rename action**: Rename the file from `01_test_infrastructure.md` to `[JIRA-ID]_test_infrastructure.md`. Update the **Task** field inside the file to match the new filename.
|
|
|
|
|
**Rename action**: Rename the file from `todo/01_test_infrastructure.md` to `todo/[TRACKER-ID]_test_infrastructure.md`. Update the **Task** field inside the file to match the new filename.
|
|
|
|
|
|
|
|
|
|
**BLOCKING**: Present test infrastructure plan summary to user. Do NOT proceed until user confirms.
|
|
|
|
|
|
|
|
|
@@ -224,11 +229,11 @@ The bootstrap structure plan must include:
|
|
|
|
|
- [ ] Environment strategy covers dev, staging, production
|
|
|
|
|
- [ ] Test structure includes unit and blackbox test locations
|
|
|
|
|
|
|
|
|
|
**Save action**: Write `01_initial_structure.md` (temporary numeric name)
|
|
|
|
|
**Save action**: Write `todo/01_initial_structure.md` (temporary numeric name)
|
|
|
|
|
|
|
|
|
|
**Jira action**: Create a Jira ticket for this task under the "Bootstrap & Initial Structure" epic. Write the Jira ticket ID and Epic ID back into the task header.
|
|
|
|
|
**Tracker action**: Create a work item ticket for this task under the "Bootstrap & Initial Structure" epic. Write the work item ticket ID and Epic ID back into the task header.
|
|
|
|
|
|
|
|
|
|
**Rename action**: Rename the file from `01_initial_structure.md` to `[JIRA-ID]_initial_structure.md` (e.g., `AZ-42_initial_structure.md`). Update the **Task** field inside the file to match the new filename.
|
|
|
|
|
**Rename action**: Rename the file from `todo/01_initial_structure.md` to `todo/[TRACKER-ID]_initial_structure.md` (e.g., `todo/AZ-42_initial_structure.md`). Update the **Task** field inside the file to match the new filename.
|
|
|
|
|
|
|
|
|
|
**BLOCKING**: Present structure plan summary to user. Do NOT proceed until user confirms.
|
|
|
|
|
|
|
|
|
@@ -252,19 +257,19 @@ For each component (or the single provided component):
|
|
|
|
|
4. Do not create tasks for other components — only tasks for the current component
|
|
|
|
|
5. Each task should be atomic, containing 0 APIs or a list of semantically connected APIs
|
|
|
|
|
6. Write each task spec using `templates/task.md`
|
|
|
|
|
7. Estimate complexity per task (1, 2, 3, 5 points); no task should exceed 5 points — split if it does
|
|
|
|
|
8. Note task dependencies (referencing Jira IDs of already-created dependency tasks, e.g., `AZ-42_initial_structure`)
|
|
|
|
|
9. **Immediately after writing each task file**: create a Jira ticket, link it to the component's epic, write the Jira ticket ID and Epic ID back into the task header, then rename the file from `[##]_[short_name].md` to `[JIRA-ID]_[short_name].md`.
|
|
|
|
|
7. Estimate complexity per task (1, 2, 3, 5, 8 points); no task should exceed 8 points — split if it does
|
|
|
|
|
8. Note task dependencies (referencing tracker IDs of already-created dependency tasks, e.g., `AZ-42_initial_structure`)
|
|
|
|
|
9. **Immediately after writing each task file**: create a work item ticket, link it to the component's epic, write the work item ticket ID and Epic ID back into the task header, then rename the file from `todo/[##]_[short_name].md` to `todo/[TRACKER-ID]_[short_name].md`.
|
|
|
|
|
|
|
|
|
|
**Self-verification** (per component):
|
|
|
|
|
- [ ] Every task is atomic (single concern)
|
|
|
|
|
- [ ] No task exceeds 5 complexity points
|
|
|
|
|
- [ ] Task dependencies reference correct Jira IDs
|
|
|
|
|
- [ ] No task exceeds 8 complexity points
|
|
|
|
|
- [ ] Task dependencies reference correct tracker IDs
|
|
|
|
|
- [ ] Tasks cover all interfaces defined in the component spec
|
|
|
|
|
- [ ] No tasks duplicate work from other components
|
|
|
|
|
- [ ] Every task has a Jira ticket linked to the correct epic
|
|
|
|
|
- [ ] Every task has a work item ticket linked to the correct epic
|
|
|
|
|
|
|
|
|
|
**Save action**: Write each `[##]_[short_name].md` (temporary numeric name), create Jira ticket inline, then rename the file to `[JIRA-ID]_[short_name].md`. Update the **Task** field inside the file to match the new filename. Update **Dependencies** references in the file to use Jira IDs of the dependency tasks.
|
|
|
|
|
**Save action**: Write each `todo/[##]_[short_name].md` (temporary numeric name), create work item ticket inline, then rename to `todo/[TRACKER-ID]_[short_name].md`. Update the **Task** field inside the file to match the new filename. Update **Dependencies** references in the file to use tracker IDs of the dependency tasks.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
@@ -285,18 +290,18 @@ For each component (or the single provided component):
|
|
|
|
|
- In default mode: blackbox test tasks depend on the component implementation tasks they exercise
|
|
|
|
|
- In tests-only mode: blackbox test tasks depend on the test infrastructure bootstrap task (Step 1t)
|
|
|
|
|
5. Write each task spec using `templates/task.md`
|
|
|
|
|
6. Estimate complexity per task (1, 2, 3, 5 points); no task should exceed 5 points — split if it does
|
|
|
|
|
7. Note task dependencies (referencing Jira IDs of already-created dependency tasks)
|
|
|
|
|
8. **Immediately after writing each task file**: create a Jira ticket under the "Blackbox Tests" epic, write the Jira ticket ID and Epic ID back into the task header, then rename the file from `[##]_[short_name].md` to `[JIRA-ID]_[short_name].md`.
|
|
|
|
|
6. Estimate complexity per task (1, 2, 3, 5, 8 points); no task should exceed 8 points — split if it does
|
|
|
|
|
7. Note task dependencies (referencing tracker IDs of already-created dependency tasks)
|
|
|
|
|
8. **Immediately after writing each task file**: create a work item ticket under the "Blackbox Tests" epic, write the work item ticket ID and Epic ID back into the task header, then rename the file from `todo/[##]_[short_name].md` to `todo/[TRACKER-ID]_[short_name].md`.
|
|
|
|
|
|
|
|
|
|
**Self-verification**:
|
|
|
|
|
- [ ] Every scenario from `tests/blackbox-tests.md` is covered by a task
|
|
|
|
|
- [ ] Every scenario from `tests/performance-tests.md`, `tests/resilience-tests.md`, `tests/security-tests.md`, and `tests/resource-limit-tests.md` is covered by a task
|
|
|
|
|
- [ ] No task exceeds 5 complexity points
|
|
|
|
|
- [ ] No task exceeds 8 complexity points
|
|
|
|
|
- [ ] Dependencies correctly reference the dependency tasks (component tasks in default mode, test infrastructure in tests-only mode)
|
|
|
|
|
- [ ] Every task has a Jira ticket linked to the "Blackbox Tests" epic
|
|
|
|
|
- [ ] Every task has a work item ticket linked to the "Blackbox Tests" epic
|
|
|
|
|
|
|
|
|
|
**Save action**: Write each `[##]_[short_name].md` (temporary numeric name), create Jira ticket inline, then rename to `[JIRA-ID]_[short_name].md`.
|
|
|
|
|
**Save action**: Write each `todo/[##]_[short_name].md` (temporary numeric name), create work item ticket inline, then rename to `todo/[TRACKER-ID]_[short_name].md`.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
@@ -338,23 +343,23 @@ Tests-only mode:
|
|
|
|
|
|
|
|
|
|
- **Coding during decomposition**: this workflow produces specs, never code
|
|
|
|
|
- **Over-splitting**: don't create many tasks if the component is simple — 1 task is fine
|
|
|
|
|
- **Tasks exceeding 5 points**: split them; no task should be too complex for a single implementer
|
|
|
|
|
- **Tasks exceeding 8 points**: split them; no task should be too complex for a single implementer
|
|
|
|
|
- **Cross-component tasks**: each task belongs to exactly one component
|
|
|
|
|
- **Skipping BLOCKING gates**: never proceed past a BLOCKING marker without user confirmation
|
|
|
|
|
- **Creating git branches**: branch creation is an implementation concern, not a decomposition one
|
|
|
|
|
- **Creating component subdirectories**: all tasks go flat in TASKS_DIR
|
|
|
|
|
- **Forgetting Jira**: every task must have a Jira ticket created inline — do not defer to a separate step
|
|
|
|
|
- **Forgetting to rename**: after Jira ticket creation, always rename the file from numeric prefix to Jira ID prefix
|
|
|
|
|
- **Creating component subdirectories**: all tasks go flat in `TASKS_TODO/`
|
|
|
|
|
- **Forgetting tracker**: every task must have a work item ticket created inline — do not defer to a separate step
|
|
|
|
|
- **Forgetting to rename**: after work item ticket creation, always rename the file from numeric prefix to tracker ID prefix
|
|
|
|
|
|
|
|
|
|
## Escalation Rules
|
|
|
|
|
|
|
|
|
|
| Situation | Action |
|
|
|
|
|
|-----------|--------|
|
|
|
|
|
| Ambiguous component boundaries | ASK user |
|
|
|
|
|
| Task complexity exceeds 5 points after splitting | ASK user |
|
|
|
|
|
| Task complexity exceeds 8 points after splitting | ASK user |
|
|
|
|
|
| Missing component specs in DOCUMENT_DIR | ASK user |
|
|
|
|
|
| Cross-component dependency conflict | ASK user |
|
|
|
|
|
| Jira epic not found for a component | ASK user for Epic ID |
|
|
|
|
|
| Tracker epic not found for a component | ASK user for Epic ID |
|
|
|
|
|
| Task naming | PROCEED, confirm at next BLOCKING gate |
|
|
|
|
|
|
|
|
|
|
## Methodology Quick Reference
|
|
|
|
@@ -366,24 +371,24 @@ Tests-only mode:
|
|
|
|
|
│ CONTEXT: Resolve mode (default / single component / tests-only)│
|
|
|
|
|
│ │
|
|
|
|
|
│ DEFAULT MODE: │
|
|
|
|
|
│ 1. Bootstrap Structure → [JIRA-ID]_initial_structure.md │
|
|
|
|
|
│ 1. Bootstrap Structure → [TRACKER-ID]_initial_structure.md │
|
|
|
|
|
│ [BLOCKING: user confirms structure] │
|
|
|
|
|
│ 2. Component Tasks → [JIRA-ID]_[short_name].md each │
|
|
|
|
|
│ 3. Blackbox Tests → [JIRA-ID]_[short_name].md each │
|
|
|
|
|
│ 2. Component Tasks → [TRACKER-ID]_[short_name].md each │
|
|
|
|
|
│ 3. Blackbox Tests → [TRACKER-ID]_[short_name].md each │
|
|
|
|
|
│ 4. Cross-Verification → _dependencies_table.md │
|
|
|
|
|
│ [BLOCKING: user confirms dependencies] │
|
|
|
|
|
│ │
|
|
|
|
|
│ TESTS-ONLY MODE: │
|
|
|
|
|
│ 1t. Test Infrastructure → [JIRA-ID]_test_infrastructure.md │
|
|
|
|
|
│ 1t. Test Infrastructure → [TRACKER-ID]_test_infrastructure.md │
|
|
|
|
|
│ [BLOCKING: user confirms test scaffold] │
|
|
|
|
|
│ 3. Blackbox Tests → [JIRA-ID]_[short_name].md each │
|
|
|
|
|
│ 3. Blackbox Tests → [TRACKER-ID]_[short_name].md each │
|
|
|
|
|
│ 4. Cross-Verification → _dependencies_table.md │
|
|
|
|
|
│ [BLOCKING: user confirms dependencies] │
|
|
|
|
|
│ │
|
|
|
|
|
│ SINGLE COMPONENT MODE: │
|
|
|
|
|
│ 2. Component Tasks → [JIRA-ID]_[short_name].md each │
|
|
|
|
|
│ 2. Component Tasks → [TRACKER-ID]_[short_name].md each │
|
|
|
|
|
├────────────────────────────────────────────────────────────────┤
|
|
|
|
|
│ Principles: Atomic tasks · Behavioral specs · Flat structure │
|
|
|
|
|
│ Jira inline · Rename to Jira ID · Save now · Ask don't assume│
|
|
|
|
|
│ Tracker inline · Rename to tracker ID · Save now · Ask don't assume│
|
|
|
|
|
└────────────────────────────────────────────────────────────────┘
|
|
|
|
|
```
|
|
|
|
|