Welcome back. In the previous lesson, you reviewed an AI-generated implementation plan as a change hypothesis against architecture, testing, observability, and rollback constraints. Once a plan passes that review, the next challenge is execution: turning a coherent plan into work that can be performed in parallel where safe, integrated early, and tracked without losing the reasoning behind it.
This lesson focuses on partitioning an approved plan into dependency-aware tasks. You will learn to make each task small but meaningful, assign one clearly accountable owner, distinguish genuine prerequisites from convenient sequencing, and define integration checkpoints that demonstrate the system—not merely individual pull requests—still works.
From an approved plan to an executable work system
A plan is usually written in the language of change:
“Add a feature-flagged, tenant-safe response cache to the search endpoint, validate isolation, instrument cache behavior, and release progressively.”
That is a useful direction, but it is not yet executable. Several questions remain:
- What must be decided before code can be safely written?
- Which parts can proceed independently?
- What output does each person or agent produce?
- When do separately completed changes meet in a running system?
- Who is accountable when integration fails?
A task partition answers these questions. It is not merely a list of files to edit, nor a set of tickets generated one per bullet from an AI plan.
A good task has five properties:
- A concrete outcome. It produces a verified artifact, behavior, decision, or operational capability.
- A bounded scope. Its owner can understand and complete it without carrying the whole feature mentally.
- Explicit dependencies. It names only the prerequisites that are genuinely necessary.
- Clear ownership. One person or role is accountable for driving it to its definition of done.
- An integration destination. Its result has a known place to meet other work: mainline, a shared test environment, a contract suite, or a release gate.
This is especially important when AI is helping generate or implement tasks. A model is very capable of producing a plausible sequential checklist. It is less reliable at recognizing which order is imposed by a real technical constraint, which work can be parallelized, and which “finished” changes have never been exercised together.
The distinction between scope decomposition and execution planning is useful:
| Artifact | Main question | Typical shape |
|---|---|---|
| Work breakdown | What must exist when this change is complete? | A structured list of deliverables or capabilities |
| Task list | What concrete work produces those deliverables? | Small, verb-led work items |
| Dependency graph | What must be available before another item can proceed? | A directed graph of prerequisites |
| Delivery board | Who owns work, what is blocked, and what has integrated? | Status and ownership view |
A work breakdown helps ensure that testing, deployment configuration, documentation, and operational readiness are not forgotten. Individual tasks then describe actions such as “implement,” “validate,” “deploy,” or “verify.” The dependency graph prevents the team from pretending that everything can begin at once.
A Tale of Slicing and Imagination | Agile Alliance
Read this Agile Alliance experience report for a practical account of splitting complex work into releasable slices. Although its examples involve a banking application, its distinction between vertical value slices and horizontal architectural layers applies directly to .NET services, Node.js applications, Elasticsearch changes, and Kubernetes delivery work.
In Section 3.1, read vertical versus horizontal slicing. Focus on why a task grouping based only on frontend, backend, and infrastructure can make integration and usable feedback arrive too late. Then read Section 3.3 from the walking skeleton example. Notice how the first release exercises an end-to-end path while deliberately limiting risk, rather than waiting for the entire product surface to be complete. Finally, in Section 4, read the developer-involvement lesson. The important point is not that every task needs every specialist; it is that a technically informed person must test whether a proposed slice is actually viable.
Prefer vertical slices, but do not deny enabling work
A vertical slice reaches across the layers necessary to demonstrate a narrow, valuable behavior. For example, “search returns authorized results with the feature flag disabled by default” can involve endpoint handling, authorization, Elasticsearch querying, configuration, tests, and deployment wiring.
A horizontal slice organizes work by technical layer:
- “Build the cache library”
- “Create the Helm chart values”
- “Update the API”
- “Add tests”
Horizontal tasks are sometimes necessary, particularly for shared infrastructure or a hard external dependency. The problem arises when they become the only plan. Then no one can demonstrate an integrated behavior until every layer is “done,” and defects accumulate at the end.
Use this rule:
Partition around a small demonstrable system behavior whenever possible. Create an enabling task only when it produces a reusable prerequisite, a required decision, or an environmental capability that cannot sensibly be embedded in one vertical slice.
For example, adding a reusable Kubernetes secret-mount convention may be enabling work. “Create a Helm values file” is not automatically a useful task by itself; its definition of done must state what workload configuration it enables and how it is verified.
Design tasks as verifiable contracts
The fastest way to create vague tickets is to ask an AI, “Break this plan into tasks.” It will often produce titles such as “Update backend,” “Add tests,” and “Deploy to Kubernetes.” Those are work categories, not independently reviewable commitments.
Instead, make every task a compact contract.
| Field | What it must say |
|---|---|
| ID and outcome | A short identifier and the observable result, not a file-edit instruction |
| Scope boundary | What is included and deliberately excluded |
| Inputs and evidence | Constraint-ledger items, repository artifacts, contracts, or decisions the owner must use |
| Deliverable | Code, test suite, decision record, dashboard, runbook update, deployment configuration, or another reviewable artifact |
| Definition of done | The specific checks that make the task complete |
| Dependencies | IDs of genuine prerequisite tasks, plus the required output from each |
| Owner | One directly responsible individual or role |
| Integration checkpoint | The next point at which the work must operate with other changes |
The word owner does not mean “the only contributor.” It means the person or role accountable for keeping the work visible, resolving or escalating blockers, arranging review, and ensuring the stated definition of done is met.
A useful minimal ownership model is:
- DRI: directly responsible individual; accountable for completion.
- Contributors: people or agents supplying a bounded input.
- Approver: the person or group with authority to accept a sensitive decision or release.
- Integration owner: accountable for proving that combined work operates correctly.
In a small team—or if you are the primary engineer across a client engagement—the same person may hold several of these roles. Naming them still matters. It reveals, for example, that a platform-team approval or security review is a real dependency rather than an optimistic assumption.
A task card example
Suppose evidence has now established that search requests repeat frequently enough to justify a cache, that results can be cached for a short agreed freshness window, and that tenant identity and authorization scope must constrain every cache entry.
A vague task would be:
Add caching to search.
A task contract is more useful:
T2 — Implement authorization-safe cache-key and eligibility policy
Owner: API engineer
Inputs: cache-policy decision, tenant-isolation invariant A1, approved freshness requirement
Deliverable: a tested module that determines cache eligibility and creates the cache key from tenant identity, authorization-relevant scope, normalized request fields, and policy version
Excluded: cache-provider configuration and handler integration
Done when: unit tests prove equivalent requests normalize consistently; requests differing in tenant or authorization scope never share a key; non-cacheable requests bypass the policy
Depends on: T1, the cache-policy decision
Integrates at: CP2, the shared service integration checkpoint
Notice that the task does not prescribe the internal implementation beyond necessary boundaries. It tells an AI or a collaborator what must be true, what evidence governs the work, and how success is determined.
Choose the right granularity
Tasks that are too large conceal risk:
- “Implement the search-cache feature”
- “Migrate all Node services to the new AI client”
- “Add retrieval to the repository assistant”
Tasks that are too small create tracking theater:
- “Add one constructor parameter”
- “Rename a variable”
- “Create a folder”
A practical stopping point is: one owner can take the item from ready to reviewable without requiring undisclosed decisions or an extended handoff. For code work, this often maps to one coherent pull request, though a task may produce a decision record, dashboard, test environment, or rollout artifact rather than code.
If a task requires several days of uncertain exploration, split out a bounded discovery task. Its result is not “research performed”; it is a decision supported by evidence, with alternatives and unresolved risks recorded.
Identify real dependencies without serializing everything
A dependency exists when task B cannot be correctly started, completed, tested, or reviewed without a defined output from task A.
That definition is deliberately stricter than “it would be convenient to do A first.” Overstating dependencies creates a long serial queue. Understating them creates integration surprises.
Four kinds occur frequently in application and platform work:
| Dependency type | Example | Required output |
|---|---|---|
| Decision dependency | The cache implementation needs an agreed freshness policy and safe key dimensions. | Decision record or accepted design constraint |
| Artifact dependency | The endpoint cannot use a new client abstraction until that abstraction exists. | Reviewed API, package, migration, or interface |
| Environment dependency | A service cannot prove Redis connectivity without a provisioned endpoint and workload configuration. | Accessible environment plus non-secret configuration contract |
| Contract dependency | A Node.js consumer cannot safely use a revised API response until compatibility behavior is specified. | Versioned contract and passing contract tests |
There is also a fifth category that teams often confuse with a dependency: a risk gate. For example, a production canary should not expand until error rate, latency, and correctness checks remain within agreed bounds. This is not simply “the next task.” It is a controlled decision point with evidence and authority.
A dependency test
Before adding an edge between two tasks, state the sentence explicitly:
“T5 depends on T3 because it needs this defined output in order to perform this verification or implementation.”
If you cannot fill in both blanks, do not impose the dependency. The work may be parallelizable with an agreed interface or a temporary stub.
Dependencies should form an acyclic graph. If you find a cycle such as “API integration needs infrastructure configuration, but infrastructure configuration needs final API integration,” do not merely assign both tickets to one person and hope. Resolve it by introducing a small shared contract or design checkpoint:
- Define the required endpoint, authentication method, timeout behavior, and configuration keys.
- Build against that contract.
- Integrate the real components at an explicit checkpoint.
Using Projects for feature planning
Watch GitHub’s “Using Projects for feature planning” for a brief example of converting a feature plan into a board that makes workstreams, ownership-relevant metadata, status, and associated pull requests visible.
Watch project organization to see a feature-specific board and the use of an Area field to distinguish workstreams. Then watch views and PRs for iteration and status views, including linking pull requests to the work item. The interface is GitHub-specific; the transferable practice is making task metadata and current integration evidence easy to inspect.
A board should show more than “To do / Doing / Done.” For complex changes, useful fields include:
- Owner
- Area: API, data, Elasticsearch, platform, security, test, or operations
- Depends on
- Integration checkpoint
- Evidence or requirement IDs
- PR / decision record / dashboard link
- Blocked reason and blocking owner
This makes AI-generated work inspectable. If an agent claims “task complete,” the board should point to the test result, pull request, deployment evidence, or decision artifact that substantiates the claim.
Integration checkpoints: where completed parts prove they work together
A task can be locally complete while the feature remains unsafe. A cache-key module may have excellent unit tests; a Helm value may be valid YAML; a handler may compile. None of that proves that a running service can reach the cache, preserve tenant isolation, emit useful telemetry, and fail safely when the cache is unavailable.
An integration checkpoint is a planned convergence point at which independently completed work is combined and verified against a system-level condition.

Continuous integration is the foundation: changes should reach mainline in small increments and be automatically built and tested. The image’s “repair within ten minutes” should be treated as a strong operational aspiration, not an inflexible universal rule. The underlying principle is that a failing mainline is urgent because it blocks trustworthy integration for everyone.
A checkpoint adds a broader question:
What combined behavior must now be true, and what evidence proves it?
For a production-facing change, checkpoints often occur at three levels:
| Checkpoint | Purpose | Example exit criteria | Accountable role |
|---|---|---|---|
| CP1: design and contract | Resolve decisions that would otherwise block or invalidate parallel work. | Cache policy, key dimensions, freshness rule, failure behavior, and feature-flag default are approved. | Technical lead or service owner |
| CP2: shared-environment integration | Prove real components work together before release. | Service, Elasticsearch, cache provider, configuration, and telemetry operate in an integration environment; tenant-isolation and failure-path tests pass. | Feature integration owner |
| CP3: release gate | Decide whether to expose the change and whether to expand exposure. | Canary signals meet agreed thresholds; rollback/disable mechanism is tested; runbook and dashboard are available. | Release owner with required approver |
A checkpoint is not a status meeting. It has:
- Inputs: the task artifacts expected to be ready.
- A combined test or observation: contract test, integration suite, smoke test, canary comparison, or a controlled failure test.
- Exit criteria: specific conditions for proceeding.
- A named decision owner: someone who can accept, pause, or escalate.
- Failure handling: the next action if the criteria are not met.
A failing checkpoint should create an explicit integration task or defect with an owner. Avoid the ambiguous outcome “team to investigate.” That phrase is how integration risks disappear into a shared queue.
Worked partition: feature-flagged search response cache
Continue the previous lesson’s example, but assume the preliminary investigation has now justified caching: requests repeat sufficiently, the accepted freshness period is short, and a distributed cache is required because multiple Kubernetes pods serve traffic.
The objective is not “make search faster” in the abstract. It is:
Reduce repeated authorized search-request latency through a feature-flagged distributed response cache, without weakening tenant isolation, obscuring Elasticsearch behavior, or preventing safe disablement.
Here is a partition that preserves those constraints.
| ID | Task outcome and definition of done | Depends on | Owner | Integration point |
|---|---|---|---|---|
| T1 | Record cache policy and boundary. The decision states eligible request shapes, freshness, invalidation or expiry behavior, complete cache-key dimensions, cache-failure behavior, and feature-flag default. | — | Service owner | CP1 |
| T2 | Implement cache-key and eligibility policy. Unit tests prove normalization, tenant and authorization separation, policy versioning, and bypass cases. | T1 | API engineer | CP2 |
| T3 | Provide cache connectivity and workload configuration. The service receives validated configuration, uses least-privilege credentials where applicable, and passes a connectivity smoke check in the integration environment. | T1 | Platform engineer | CP2 |
| T4 | Define cache telemetry and release signals. Metrics and trace conventions distinguish cache hit, miss, bypass, and failure from Elasticsearch duration; dashboard queries support canary comparison. | T1 | Observability owner | CP2 and CP3 |
| T5 | Integrate cache behavior into the search request path under a disabled-by-default flag. Existing uncached behavior remains available, and cache failure falls back according to T1. | T2, T3, T4 | API engineer | CP2 |
| T6 | Prove end-to-end safety in the shared environment. Integration tests cover cross-tenant isolation, hit and miss behavior, expiry, cache unavailability, and unchanged results when the flag is off. | T5 | Test or integration owner | CP2 |
| T7 | Execute progressive release and recovery procedure. The flag enables a bounded audience; telemetry is assessed against the approved threshold; disabling the flag restores uncached behavior and is verified. | T3, T4, T6 | Release owner | CP3 |
The dependency structure looks like this:
Three details are worth noticing.
First, T2, T3, and T4 can proceed concurrently once T1 makes the policy explicit. The plan gains speed without assuming false independence.
Second, T6 is not a trailing “add tests” ticket. It owns system-level proof of the invariant that matters most: two identities with otherwise identical requests must not receive shared or unauthorized results.
Third, deployment is not declared done because the image was rolled out. T7 owns the controlled exposure, the evidence review, and the tested disablement path. That links the implementation plan to the rollback constraints reviewed in the prior lesson.
If one engineer owns most of this work, retain the task boundaries anyway. They preserve the required evidence and make it easier to hand off a specific operational or testing responsibility when priorities shift across engagements.
Use AI to propose the partition, then audit its assumptions
AI is useful at converting an approved plan and constraint ledger into initial task cards. Give it the desired artifact shape, rather than asking for generic “subtasks.”
Partition the approved implementation plan into execution tasks.
For each task, provide:
- ID and outcome-focused title
- scope and explicit exclusions
- source requirement or constraint IDs
- deliverable
- definition of done with verifiable checks
- one directly responsible owner role
- dependencies, each with the required output from that dependency
- integration checkpoint
Rules:
- Prefer small vertical slices that demonstrate behavior.
- Create an enabling task only for a reusable prerequisite, a required decision,
or an environment capability.
- Do not invent repository facts, owners, thresholds, or infrastructure.
Mark missing information as an assumption or a discovery task.
- Do not add a dependency merely because a task is conventionally performed first.
- Include testing, observability, rollout, and recovery work where the approved
plan requires them.
- Identify dependency cycles, duplicated work, and tasks with no verifiable
definition of done.
Return:
1. task cards,
2. a dependency list,
3. proposed integration checkpoints,
4. unresolved assumptions and blocking decisions.
Then perform a short human audit before creating tickets:
- Coverage: Does the partition preserve every hard constraint from the ledger, including tests, telemetry, and recovery?
- No duplication: Are two tasks both changing the same contract or test suite without a clear division?
- No false parallelism: Can supposedly parallel tasks really proceed from an agreed interface or decision?
- No unnecessary serialization: Does every dependency name a real required output?
- Ownership: Does every item have exactly one accountable owner?
- Integration: Does every meaningful convergence have a system-level test and someone responsible for acting on its result?
- Releaseability: Is there a small, safe behavior that can be verified before the full rollout?
Microsoft’s description of AI-assisted modernization is a useful reminder that ordered tasks, requirement traceability, and a testing strategy are separate planning artifacts—not a single generated checklist.
Re-architect Projects by Using GitHub Copilot Modernization - Azure | Microsoft Learn
Read these Microsoft Learn sections as an example of an AI-assisted workflow that produces analysis, a requirement inventory, an ordered implementation plan, and a separate testing strategy before code generation. The technology focus is Java modernization, but the planning artifacts transfer directly to C# and Node.js work.
In “Review the analysis and plan,” read the planning artifacts. Focus on the relationship between requirement IDs, ordered tasks with dependencies, and a distinct testing strategy. Then, in “Review generated artifacts,” read the task-board artifacts. Consider what equivalent evidence your own repository should retain when an AI-generated task fails a quality gate or needs iteration.
Key takeaways
Partitioning a plan is the step that turns an approved design into controlled execution.
- Build tasks around verifiable outcomes, not layers, vague activities, or a list of files.
- Prefer vertical slices that demonstrate a narrow end-to-end behavior, while explicitly identifying any necessary enabling work.
- Add a dependency only when one task requires a defined output from another to be correctly implemented, tested, or reviewed.
- Give every task one accountable owner, even if several people or AI agents contribute.
- Treat integration as planned work: define checkpoints with inputs, system-level evidence, exit criteria, a decision owner, and failure handling.
- Use AI to draft the task graph and task cards, but audit it for invented assumptions, duplicated work, false dependencies, missing operational work, and unowned integration risk.
Next, you will move from planning execution to reviewing its output: applying a risk-based checklist to AI-assisted code review across correctness, security, performance, and operability.
Can't find a good explanation? Sign up and we'll make it for you
Sign up