From 9548d80c1cf49b3e2f75aab7bfe2aea87933efba Mon Sep 17 00:00:00 2001 From: Nick Trogh Date: Mon, 3 Nov 2025 16:48:57 +0100 Subject: [PATCH 1/4] Add first draft of TDD user guide --- build/sitemap.xml | 5 + .../guides/test-driven-development-guide.md | 290 ++++++++++++++++++ .../tdd-workflow-diagram.png | 3 + docs/toc.json | 1 + 4 files changed, 299 insertions(+) create mode 100644 docs/copilot/guides/test-driven-development-guide.md create mode 100644 docs/copilot/images/test-driven-development-guide/tdd-workflow-diagram.png diff --git a/build/sitemap.xml b/build/sitemap.xml index 360b9319cd..407665f267 100644 --- a/build/sitemap.xml +++ b/build/sitemap.xml @@ -405,6 +405,11 @@ weekly 0.8 + + https://code.visualstudio.com/docs/copilot/guides/test-driven-development-guide + weekly + 0.8 + https://code.visualstudio.com/docs/copilot/chat/prompt-examples weekly diff --git a/docs/copilot/guides/test-driven-development-guide.md b/docs/copilot/guides/test-driven-development-guide.md new file mode 100644 index 0000000000..3cb82500d4 --- /dev/null +++ b/docs/copilot/guides/test-driven-development-guide.md @@ -0,0 +1,290 @@ +--- +ContentId: a9c5f4d2-8e91-4b3a-9d2c-7f1e3b8a6c4d +DateApproved: 11/03/2025 +MetaDescription: Learn how to set up a test-driven development (TDD) workflow in VS Code using AI customization features. +MetaSocialImage: ../images/shared/github-copilot-social.png +--- +# Set up a test-driven development flow in VS Code + +Test-driven development (TDD) is a software development approach where you write tests before implementing functionality. This creates a tight feedback loop that improves code quality, catches bugs early, and ensures your code meets requirements. By using AI within the TDD methodology, you enable the AI to generate comprehensive test cases, suggest implementation code that passes those tests, and assist with refactoring. + +This guide shows you how to set up a AI-assisted test-driven development workflow in Visual Studio Code using custom chat modes and handoffs. + +## Test-driven development workflow + +Test-driven development follows a three-phase cycle known as [red-green-refactor](https://martinfowler.com/bliki/TestDrivenDevelopment.html). This cycle repeats for each small increment of functionality. + +To implement an AI-assisted TDD workflow in VS Code, create [custom chat modes](/docs/copilot/customization/custom-chat-modes.md) for each phase of the cycle. Each chat mode focuses the AI on the specific goals of that phase: + +* **Red phase**: Write a failing test for the functionality you want to develop. The test fails because the functionality doesn't exist yet. +* **Green phase**: Write the minimal code needed to make the test pass. Focus on making it work, not making it perfect. +* **Refactor phase**: Improve the code quality while keeping all tests passing. Clean up duplication, improve naming, and enhance structure. + +![Diagram that shows the TDD workflow with custom chat modes in VS Code. The diagram has four main phases: Testing context, Red phase (Write failing test), Green phase (Implement code), and Refactor phase (Improve code). Arrows indicate the flow from one phase to the next, with handoffs between chat modes for each phase.](../images/test-driven-development-guide/tdd-workflow-diagram.png) + +Specify [handoffs](/docs/copilot/customization/custom-chat-modes.md#handoffs) between these chat modes to transition from one phase to the next and guide the AI through the TDD cycle. + +By using [custom instructions](/docs/copilot/customization/custom-instructions.md), you can set up a testing context that defines your project's test conventions such as testing frameworks and test structure. This context helps the AI generate tests that align with your project's standards. + +Optionally, use the [built-in plan agent](/docs/copilot/chat/chat-planning.md) or a custom planning agent to create an implementation plan for the feature before starting the TDD cycle. This helps clarify requirements and identify edge cases to cover with tests. + + + +## Step 1: Set up testing context + +Establish project-wide test conventions and practices that guide AI in generating consistent, high-quality tests. [Custom instructions](/docs/copilot/customization/custom-instructions.md) ensure the AI understands your testing approach and maintains standards across all TDD phases. + +**Why this helps**: Without explicit test conventions, AI might generate tests that don't match your project's style, use inconsistent patterns, or miss important test scenarios. + +* Create a `.github/copilot-instructions.md` [instructions file](/docs/copilot/customization/custom-instructions.md#use-a-githubcopilot-instructionsmd-file) at the root of your repository to define your project's testing guidelines. + + The instructions in this file are automatically included in all chat interactions as context for the AI agent. + + Include guidance on test structure, naming conventions, assertion style, test coverage expectations, and any testing frameworks or tools your project uses. + + The following example provides a starting point for test conventions: + + ```markdown + # [Project Name] Testing Guidelines + + ## Test conventions + * Write clear, focused tests that verify one behavior at a time + * Use descriptive test names that explain what is being tested and expected outcome + * Follow Arrange-Act-Assert (AAA) pattern: set up test data, execute the code under test, verify results + * Keep tests independent - each test should run in isolation without depending on other tests + * Start with the simplest test case, then add edge cases and error conditions + * Tests should fail for the right reason - verify they catch the bugs they're meant to catch + * Mock external dependencies to keep tests fast and reliable + ``` + + > [!TIP] + > You can create an optional test structure template that defines sections and patterns for different test types (for example, `test-template.md`). Reference this template in your instructions file so the AI uses it when generating tests. + +* Alternatively, create [`.instructions.md` files](/docs/copilot/customization/custom-instructions.md#use-instructionsmd-files) for specific test directories. + + With `.instructions.md` files, you can provide targeted guidance for different types of tests (unit, integration, end-to-end) or specific modules instead of using a single global instructions file. + + For example, create `tests/unit/unit-tests.instructions.md` with unit test-specific guidance: + + ```markdown + --- + applyTo: tests/unit/** + --- + Focus on testing individual functions and methods in isolation. Mock all external dependencies. + ``` + +## Step 2: Create red phase chat mode + +The red phase focuses on writing clear, failing tests that define the desired functionality. A dedicated [chat mode](/docs/copilot/customization/custom-chat-modes.md) for this phase describes the AI's role and guidelines for creating these tests. In this mode, the AI should not implement any code, only write the failing test, and then hand off to the green phase. + +**Why this helps**: Without a focused mode, the AI might mix implementation suggestions with test creation, and miss the core TDD principle of writing tests first. + +To create a red phase [chat mode](/docs/copilot/customization/custom-chat-modes.md) `.github/chatmodes/TDD-red.chatmode.md`: + +1. Run the **Chat: Configure Chat Modes** > **Create New custom chat mode file** command in the Command Palette. + +1. Name the file `TDD-red.chatmode.md` and describe the red phase role and guidelines. + + The following `TDD-red.chatmode.md` file provides a starting point for the red phase. + + ```markdown + --- + description: 'Write failing tests that define desired behavior (Red phase).' + handoffs: + - label: Move to green phase + agent: TDD-green + prompt: Now implement the minimal code to make these tests pass. + send: true + --- + # Red Phase: Write Failing Tests + + You are a test-first developer focused on writing clear, failing tests that define desired behavior before any implementation exists. + + ## Guidelines + + * Understand the requirement thoroughly before writing tests + * Write the simplest test that fails for the right reason + * Test one behavior at a time + * Follow project test conventions and patterns + + ## Workflow + + 1. Clarify the requirement if needed by asking questions + 2. Identify the simplest test case that captures the core behavior + 3. Write the test using appropriate assertions + 4. Verify the test fails because the functionality doesn't exist (not due to syntax errors) + 5. Explain what the test verifies and why it currently fails + + ## Do not + + * Implement any production code + * Write passing tests + ``` + +## Step 3: Create green phase chat mode + +The green phase implements minimal code to pass the tests written in the red phase. A dedicated [chat mode](/docs/copilot/customization/custom-chat-modes.md) for this phase describes the AI's role and guidelines for implementing just enough code to make tests pass. After implementation, the AI hands off to the refactor phase. + +To create a green phase [chat mode](/docs/copilot/customization/custom-chat-modes.md) `.github/chatmodes/TDD-green.chatmode.md`: + +1. Run the **Chat: Configure Chat Modes** > **Create New custom chat mode file** command in the Command Palette. + +1. Name the file `TDD-green.chatmode.md` and describe the green phase role and guidelines. + + The following `TDD-green.chatmode.md` file provides a starting point: + + ```markdown + --- + description: 'Implement minimal code to make tests pass (Green phase).' + handoffs: + - label: Refactor Code + agent: TDD-refactor + prompt: Now refactor this code to improve quality while keeping tests passing. + send: false + --- + # Green Phase: Make Tests Pass + + You are a pragmatic developer focused on writing the minimal code needed to make failing tests pass. + + ## Guidelines + + * Implement only what's needed to satisfy the current test + * Avoid over-engineering or adding features not covered by tests + * Keep code simple and direct - optimization comes later + * Run the test frequently to verify progress + + ## Workflow + + 1. Understand what the test expects + 2. Write the simplest implementation that makes the test pass + 3. Run the test to verify it passes + 4. Run the full test suite to ensure no regressions + + ## Do not + + * Add functionality beyond what tests require + * Optimize prematurely + * Refactor code (that happens in the next phase) + * Skip running tests + ``` + +## Step 4: Create refactor phase chat mode + +The refactor phase improves code quality while keeping all tests passing. A dedicated [chat mode](/docs/copilot/customization/custom-chat-modes.md) for this phase describes the AI's role and guidelines for safe refactoring. After refactoring, the AI can either return to the red phase for the next feature or finish if all functionality is complete. + +1. Create a refactor phase [chat mode](/docs/copilot/customization/custom-chat-modes.md) `.github/chatmodes/TDD-refactor.chatmode.md`. + + The following `TDD-refactor.chatmode.md` file provides a starting point: + + ```markdown + --- + description: 'Improve code quality while keeping all tests passing (Refactor phase).' + --- + # Refactor Phase: Improve Code Quality + + You are a quality-focused developer who improves code structure and readability while maintaining all test coverage. + + ## Guidelines + + * Keep all tests passing throughout refactoring + * Remove duplication (DRY principle) + * Improve naming for clarity + * Simplify complex logic + * Enhance code structure and organization + + ## Workflow + + 1. Identify opportunities for improvement (duplication, unclear naming, complex logic) + 2. Make small, safe refactoring steps + 3. Run tests after each change to ensure they still pass + 4. Continue until code meets quality standards + + ## Do not + + * Change functionality or behavior + * Add new features + * Skip running tests after changes + * Make large refactoring changes in one step + ``` + +1. After refactoring, run the full test suite to verify all tests still pass. + +## Step 5: Use the TDD workflow + +With the custom chat modes and testing context set up, you can now use the AI-assisted TDD workflow in VS Code to implement new features: + +1. Open the Chat view and select the **TDD-red** chat mode to start the red phase. + +1. Provide a prompt that describes the feature or behavior you want to implement. + + Follow the agent through the red phase to write failing tests. You can continue the conversation until you're satisfied with the tests. + + For example: + + ```text + Implement user registration with email validation and password requirements. + ``` + +1. When ready, use the handoff to transition to the **TDD-green** chat mode for the green phase. + + Notice that the agent automatically switches to the green phase and starts implementing code to make the tests pass. You can provide additional prompts or clarifications as needed. + +1. After the tests pass, use the handoff to transition to the **TDD-refactor** chat mode for the final refactor phase. + + The agent switches to the refactor phase and now focuses on improving code quality while ensuring all tests remain passing. + +At any time, you can review the code and tests generated by the AI, run tests manually, and provide feedback or corrections to guide the AI's output. You can manually switch back to previous phases if needed. + +## Troubleshooting and best practices + +### Common TDD pitfalls with AI + +**Skipping the red phase**: AI might suggest implementing code before writing tests. + +**Over-implementation**: AI might generate more code than needed to pass the current test. Review implementations critically and remove unnecessary complexity + +**Testing implementation details**: Tests should verify behavior, not implementation. If refactoring requires changing tests, they might be too tightly coupled to implementation details. + +**Incomplete test coverage**: AI might miss edge cases or error conditions. Review generated tests critically and ask for additional tests covering boundary conditions, error scenarios, and edge cases. + +### Best practices for TDD with AI + +**Validate test quality**: After AI generates a test, review it to ensure it fails for the right reason. Run the test before implementing to verify it catches the missing functionality. + +**Maintain incremental progress**: Take small steps through the TDD cycle. Write one test, implement minimal code, refactor, then repeat. Small iterations prevent large mistakes and keep the codebase working. + +**Run tests frequently**: Execute tests immediately after changes. Don't accumulate multiple changes before testing. Frequent test runs provide rapid feedback and catch issues early. + +**Use test coverage as a guide**: High coverage doesn't guarantee quality, but low coverage indicates untested behavior. Ask AI to suggest tests for uncovered code paths. + +**Maintain test independence**: Tests should run in any order without affecting each other. If tests depend on execution order or shared state, refactor to make them independent. + +**Update test context as needed**: As your project evolves, update the testing guidelines in your instructions file to reflect new conventions, frameworks, or practices. + +## Related resources + +Learn more about testing and AI customization in VS Code: + +* [Testing with AI](/docs/copilot/guides/test-with-copilot.md) +* [Custom chat modes](/docs/copilot/customization/custom-chat-modes.md) +* [Custom instructions](/docs/copilot/customization/custom-instructions.md) +* [Running tests with VS Code](/docs/debugtest/testing.md) diff --git a/docs/copilot/images/test-driven-development-guide/tdd-workflow-diagram.png b/docs/copilot/images/test-driven-development-guide/tdd-workflow-diagram.png new file mode 100644 index 0000000000..179b86cd99 --- /dev/null +++ b/docs/copilot/images/test-driven-development-guide/tdd-workflow-diagram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d133d4d8c55ae2b9995c5f722b4588ecd5fdb0488a95f2054dbbf44fa1b0835 +size 26573 diff --git a/docs/toc.json b/docs/toc.json index 7c4c2a2884..a0c9da0a0a 100644 --- a/docs/toc.json +++ b/docs/toc.json @@ -141,6 +141,7 @@ "topics": [ ["Prompt Engineering", "/docs/copilot/guides/prompt-engineering-guide"], ["Context Engineering", "/docs/copilot/guides/context-engineering-guide"], + ["Test-Driven Development", "/docs/copilot/guides/test-driven-development-guide"], ["Edit Notebooks with AI", "/docs/copilot/guides/notebooks-with-ai"], ["Test with AI", "/docs/copilot/guides/test-with-copilot"], ["Debug with AI", "/docs/copilot/guides/debug-with-copilot"], From 373e6c725cf0975f41d5f422986dcac6dfee3e36 Mon Sep 17 00:00:00 2001 From: Nick Trogh Date: Mon, 3 Nov 2025 19:39:17 +0100 Subject: [PATCH 2/4] Edit pass --- docs/copilot/guides/test-driven-development-guide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/copilot/guides/test-driven-development-guide.md b/docs/copilot/guides/test-driven-development-guide.md index 3cb82500d4..900b11a178 100644 --- a/docs/copilot/guides/test-driven-development-guide.md +++ b/docs/copilot/guides/test-driven-development-guide.md @@ -8,7 +8,7 @@ MetaSocialImage: ../images/shared/github-copilot-social.png Test-driven development (TDD) is a software development approach where you write tests before implementing functionality. This creates a tight feedback loop that improves code quality, catches bugs early, and ensures your code meets requirements. By using AI within the TDD methodology, you enable the AI to generate comprehensive test cases, suggest implementation code that passes those tests, and assist with refactoring. -This guide shows you how to set up a AI-assisted test-driven development workflow in Visual Studio Code using custom chat modes and handoffs. +This guide shows you how to set up an AI-assisted test-driven development workflow in Visual Studio Code using custom chat modes and handoffs. ## Test-driven development workflow @@ -68,7 +68,7 @@ Establish project-wide test conventions and practices that guide AI in generatin ## Test conventions * Write clear, focused tests that verify one behavior at a time - * Use descriptive test names that explain what is being tested and expected outcome + * Use descriptive test names that explain what is being tested and the expected outcome * Follow Arrange-Act-Assert (AAA) pattern: set up test data, execute the code under test, verify results * Keep tests independent - each test should run in isolation without depending on other tests * Start with the simplest test case, then add edge cases and error conditions @@ -260,7 +260,7 @@ At any time, you can review the code and tests generated by the AI, run tests ma **Skipping the red phase**: AI might suggest implementing code before writing tests. -**Over-implementation**: AI might generate more code than needed to pass the current test. Review implementations critically and remove unnecessary complexity +**Over-implementation**: AI might generate more code than needed to pass the current test. Review implementations critically and remove unnecessary complexity. **Testing implementation details**: Tests should verify behavior, not implementation. If refactoring requires changing tests, they might be too tightly coupled to implementation details. From 63aad0c60c94bd6263f218ba5546f6477ea06352 Mon Sep 17 00:00:00 2001 From: Nick Trogh Date: Wed, 7 Jan 2026 13:19:22 +0100 Subject: [PATCH 3/4] Simplify content --- .../guides/test-driven-development-guide.md | 306 +++++++++--------- 1 file changed, 161 insertions(+), 145 deletions(-) diff --git a/docs/copilot/guides/test-driven-development-guide.md b/docs/copilot/guides/test-driven-development-guide.md index 900b11a178..9586dad5a9 100644 --- a/docs/copilot/guides/test-driven-development-guide.md +++ b/docs/copilot/guides/test-driven-development-guide.md @@ -1,69 +1,95 @@ --- ContentId: a9c5f4d2-8e91-4b3a-9d2c-7f1e3b8a6c4d -DateApproved: 11/03/2025 +DateApproved: 12/10/2025 MetaDescription: Learn how to set up a test-driven development (TDD) workflow in VS Code using AI customization features. MetaSocialImage: ../images/shared/github-copilot-social.png --- # Set up a test-driven development flow in VS Code -Test-driven development (TDD) is a software development approach where you write tests before implementing functionality. This creates a tight feedback loop that improves code quality, catches bugs early, and ensures your code meets requirements. By using AI within the TDD methodology, you enable the AI to generate comprehensive test cases, suggest implementation code that passes those tests, and assist with refactoring. +Test-driven development (TDD) is a software development approach where you write tests before implementing functionality. This creates a tight feedback loop that improves code quality, catches bugs early, and ensures that the code meets your requirements. Visual Studio Code's AI capabilities can enhance your TDD workflow by guiding you through the different phases of writing tests, implementing code, running tests, and optimizing the code. -This guide shows you how to set up an AI-assisted test-driven development workflow in Visual Studio Code using custom chat modes and handoffs. +This guide shows you how to set up an AI-assisted test-driven development workflow in VS Code by using custom agents, handoffs, and custom instructions. ## Test-driven development workflow -Test-driven development follows a three-phase cycle known as [red-green-refactor](https://martinfowler.com/bliki/TestDrivenDevelopment.html). This cycle repeats for each small increment of functionality. +The core tenet of test-driven development is to write tests before implementation. The tests define the desired outcomes for the functionality you want to build. By writing tests first, you clarify requirements and identify edge cases to ensure that your code behaves as expected. -To implement an AI-assisted TDD workflow in VS Code, create [custom chat modes](/docs/copilot/customization/custom-chat-modes.md) for each phase of the cycle. Each chat mode focuses the AI on the specific goals of that phase: +TDD follows a three-phase cycle known as [red-green-refactor](https://martinfowler.com/bliki/TestDrivenDevelopment.html) and repeats for each small increment of functionality. + +The three phases are: + +* **Red phase**: Write a failing test for the functionality you want to develop. + +* **Green phase**: Write the minimal application code needed to make the test pass. Focus on making it work, not making it perfect. -* **Red phase**: Write a failing test for the functionality you want to develop. The test fails because the functionality doesn't exist yet. -* **Green phase**: Write the minimal code needed to make the test pass. Focus on making it work, not making it perfect. * **Refactor phase**: Improve the code quality while keeping all tests passing. Clean up duplication, improve naming, and enhance structure. -![Diagram that shows the TDD workflow with custom chat modes in VS Code. The diagram has four main phases: Testing context, Red phase (Write failing test), Green phase (Implement code), and Refactor phase (Improve code). Arrows indicate the flow from one phase to the next, with handoffs between chat modes for each phase.](../images/test-driven-development-guide/tdd-workflow-diagram.png) +```mermaid +graph LR + Red[πŸ”΄ Red
Write failing test] --> Green[🟒 Green
Make test pass] + Green --> Refactor[πŸ”΅ Refactor
Improve code] + Refactor --> Red + + style Red fill:#ffcccc + style Green fill:#ccffcc + style Refactor fill:#cce5ff +``` + +## TDD implementation overview -Specify [handoffs](/docs/copilot/customization/custom-chat-modes.md#handoffs) between these chat modes to transition from one phase to the next and guide the AI through the TDD cycle. +You can implement an AI-assisted TDD workflow in VS Code by using custom agents. Each phase of the TDD process (red, green, refactor) has a specific goal and requires different AI behavior. You create a custom agent for each phase that defines the specific role and guidelines for that phase. In this guide, we create a separate _TDD test runner_ agent to execute tests and report results. -By using [custom instructions](/docs/copilot/customization/custom-instructions.md), you can set up a testing context that defines your project's test conventions such as testing frameworks and test structure. This context helps the AI generate tests that align with your project's standards. +With custom agent handoffs, you can then transition from one phase to the next once the AI completes its task. For example, the custom agent for the red phase presents a hand-off action for the green phase agent after writing the failing test. -Optionally, use the [built-in plan agent](/docs/copilot/chat/chat-planning.md) or a custom planning agent to create an implementation plan for the feature before starting the TDD cycle. This helps clarify requirements and identify edge cases to cover with tests. +In addition to custom agents for each phase, you can also set up a _TDD supervisor_ agent that orchestrates the entire TDD workflow. This agent describes the overall TDD process and invokes each phase in sequence through subagents. The supervisor agent can manage the flow of the TDD cycle, ensuring that each phase is completed before moving to the next. + +If you have established test conventions, you can use [custom instructions](/docs/copilot/customization/custom-instructions.md) to set up a testing context that guides the AI in generating tests that align with your project's standards. + +TODO: add diagram + +> [!TIP] +> You can further enhance the TDD workflow by adding a planning phase before starting the cycle. You can use the built-in plan agent or create a custom planning agent that helps clarify requirements and identify edge cases to cover with tests. +![Diagram that shows the TDD workflow with custom chat modes in VS Code. The diagram has four main phases: Testing context, Red phase (Write failing test), Green phase (Implement code), and Refactor phase (Improve code). Arrows indicate the flow from one phase to the next, with handoffs between chat modes for each phase.](../images/test-driven-development-guide/tdd-workflow-diagram.png) + --> -## Step 1: Set up testing context +## Step 1: Set up testing guidelines -Establish project-wide test conventions and practices that guide AI in generating consistent, high-quality tests. [Custom instructions](/docs/copilot/customization/custom-instructions.md) ensure the AI understands your testing approach and maintains standards across all TDD phases. +If you have established test conventions and practices, create a custom instructions file (`testing.instructions.md`) to help the AI generate tests that align with your project's standards. **Why this helps**: Without explicit test conventions, AI might generate tests that don't match your project's style, use inconsistent patterns, or miss important test scenarios. -* Create a `.github/copilot-instructions.md` [instructions file](/docs/copilot/customization/custom-instructions.md#use-a-githubcopilot-instructionsmd-file) at the root of your repository to define your project's testing guidelines. +To set up testing guidelines: + +1. Run the **Chat: Create Instructions File** command in the Command Palette to create a new instructions file in your workspace. - The instructions in this file are automatically included in all chat interactions as context for the AI agent. + * Select `.github/instructions` to create the instructions file in your workspace. + * Enter "testing" as the name for the instructions file. - Include guidance on test structure, naming conventions, assertion style, test coverage expectations, and any testing frameworks or tools your project uses. + > [!NOTE] + > By using a `*.instructions.md` file instead of the `copilot.instructions.md` file, you can selectively apply these testing guidelines only to test files in your project instead of including them in all AI interactions. + +1. Update the instructions `applyTo` metadata to automatically apply them to test files. Also set the `description` metadata to indicate that these instructions provide testing context. + + The following example updates the `applyTo` field to target all files in the `tests/` directory: + + ```markdown + --- + description: 'Testing guidelines and context for generating tests.' + applyTo: tests/** + --- + ``` + +1. Add your project's testing guidelines to the body of the instructions file. The following example provides a starting point for test conventions: ```markdown + --- + description: 'Testing guidelines and context for generating tests.' + applyTo: tests/** + --- # [Project Name] Testing Guidelines ## Test conventions @@ -79,180 +105,170 @@ Establish project-wide test conventions and practices that guide AI in generatin > [!TIP] > You can create an optional test structure template that defines sections and patterns for different test types (for example, `test-template.md`). Reference this template in your instructions file so the AI uses it when generating tests. -* Alternatively, create [`.instructions.md` files](/docs/copilot/customization/custom-instructions.md#use-instructionsmd-files) for specific test directories. +## Step 2: Create supervisor custom agent + +Create a "TDD-supervisor" custom agent that orchestrates the entire TDD workflow. This agent describes the overall TDD process and invokes each phase in sequence through subagents. + +To create the `.github/agents/TDD-supervisor.agent.md` supervisor [custom agent](/docs/copilot/customization/custom-agents.md): + +1. Run the **Chat: New Custom Agent** command in the Command Palette. + + * Select `.github/agents` to create the custom agent definition in your workspace. + * Enter "TDD-supervisor" as the name for the custom agent. - With `.instructions.md` files, you can provide targeted guidance for different types of tests (unit, integration, end-to-end) or specific modules instead of using a single global instructions file. +1. Update the custom agent definition to describe the TDD workflow and run each phase through subagents. - For example, create `tests/unit/unit-tests.instructions.md` with unit test-specific guidance: + The following `TDD-supervisor.agent.md` file provides a starting point for the supervisor agent. ```markdown --- - applyTo: tests/unit/** + name: TDD Supervisor + description: Orchestrate full TDD cycle from request to implementation + tools: ['agent'] --- - Focus on testing individual functions and methods in isolation. Mock all external dependencies. + + Your goal is take high-level user instructions (feature, spec, bug fix) to orchestrate the TDD cycle: + + 1. Invoke "TDD Red" agent to write failing tests + 2. Invoke "TDD Green" agent to write minimal implementation + 3. Invoke "TDD Test Runner" agent to verify tests pass + 4. If tests fail, ask user to decide whether to revise or abort + 5. If tests pass, optionally invoke "TDD Refactor" agent to improve code quality + 6. Output a summary of changes ready for review/commit + + Use the #tool:agent/runSubagent tool with the exact agent names above. ``` -## Step 2: Create red phase chat mode +## Step 3: Create red phase custom agent -The red phase focuses on writing clear, failing tests that define the desired functionality. A dedicated [chat mode](/docs/copilot/customization/custom-chat-modes.md) for this phase describes the AI's role and guidelines for creating these tests. In this mode, the AI should not implement any code, only write the failing test, and then hand off to the green phase. +Next, create a "TDD-red" custom agent that focuses on the red phase of TDD. This custom agent is only responsible for writing failing tests based on the provided requirements and should not implement any application code. When completed, this agent hands off to the green phase custom agent. **Why this helps**: Without a focused mode, the AI might mix implementation suggestions with test creation, and miss the core TDD principle of writing tests first. -To create a red phase [chat mode](/docs/copilot/customization/custom-chat-modes.md) `.github/chatmodes/TDD-red.chatmode.md`: +To create the `.github/agents/TDD-red.agent.md` red phase [custom agent](/docs/copilot/customization/custom-agents.md): + +1. Run the **Chat: New Custom Agent** command in the Command Palette. -1. Run the **Chat: Configure Chat Modes** > **Create New custom chat mode file** command in the Command Palette. + * Select `.github/agents` to create the custom agent definition in your workspace. + * Enter "TDD-red" as the name for the custom agent. -1. Name the file `TDD-red.chatmode.md` and describe the red phase role and guidelines. +1. Update the custom agent definition to describe the guidelines and rules for the red phase, and to specify a handoff to the green phase custom agent. - The following `TDD-red.chatmode.md` file provides a starting point for the red phase. + The following `TDD-red.agent.md` file provides a starting point for the red phase. ```markdown --- - description: 'Write failing tests that define desired behavior (Red phase).' + name: TDD Red + description: TDD phase for writing FAILING tests + infer: true + tools: ['read', 'edit', 'search'] handoffs: - - label: Move to green phase - agent: TDD-green - prompt: Now implement the minimal code to make these tests pass. - send: true + - label: TDD Green + agent: TDD Green + prompt: Implement minimal implementation --- - # Red Phase: Write Failing Tests - - You are a test-first developer focused on writing clear, failing tests that define desired behavior before any implementation exists. - - ## Guidelines - - * Understand the requirement thoroughly before writing tests - * Write the simplest test that fails for the right reason - * Test one behavior at a time - * Follow project test conventions and patterns - - ## Workflow - - 1. Clarify the requirement if needed by asking questions - 2. Identify the simplest test case that captures the core behavior - 3. Write the test using appropriate assertions - 4. Verify the test fails because the functionality doesn't exist (not due to syntax errors) - 5. Explain what the test verifies and why it currently fails - - ## Do not - - * Implement any production code - * Write passing tests + You are a test-writer: when given a function name, spec, or requirements, output a complete test file (or test function) that asserts the expected behavior, which must fail when run against the current codebase. Use the project’s style/conventions. Do not write implementation, only tests. Output exactly the test code. ``` -## Step 3: Create green phase chat mode +## Step 4: Create green phase custom agent -The green phase implements minimal code to pass the tests written in the red phase. A dedicated [chat mode](/docs/copilot/customization/custom-chat-modes.md) for this phase describes the AI's role and guidelines for implementing just enough code to make tests pass. After implementation, the AI hands off to the refactor phase. +Now, create a "TDD-green" custom agent that focuses on the green phase of TDD. This custom agent is only responsible for writing the minimal implementation code to make the tests pass, without modifying the test code. To run the tests, this agent invokes the "TDD Test Runner" custom agent. When completed, this agent hands off to the refactor phase custom agent. -To create a green phase [chat mode](/docs/copilot/customization/custom-chat-modes.md) `.github/chatmodes/TDD-green.chatmode.md`: +To create the `.github/agents/TDD-green.agent.md` green phase [custom agent](/docs/copilot/customization/custom-agents.md): -1. Run the **Chat: Configure Chat Modes** > **Create New custom chat mode file** command in the Command Palette. +1. Run the **Chat: New Custom Agent** command in the Command Palette. -1. Name the file `TDD-green.chatmode.md` and describe the green phase role and guidelines. + * Select `.github/agents` to create the custom agent definition in your workspace. + * Enter "TDD-green" as the name for the custom agent. - The following `TDD-green.chatmode.md` file provides a starting point: +1. Update the custom agent definition to describe the guidelines and rules for the green phase, and to specify a handoff to the test runner custom agent. + + The following `TDD-green.agent.md` file provides a starting point: ```markdown --- - description: 'Implement minimal code to make tests pass (Green phase).' + name: TDD Green + description: TDD phase for writing MINIMAL implementation to pass tests + infer: true + tools: ['search', 'edit', 'execute/runTests', 'agent'] handoffs: - - label: Refactor Code - agent: TDD-refactor - prompt: Now refactor this code to improve quality while keeping tests passing. - send: false + - label: TDD Refactor + agent: TDD Refactor + prompt: Refactor the implementation --- - # Green Phase: Make Tests Pass - - You are a pragmatic developer focused on writing the minimal code needed to make failing tests pass. - - ## Guidelines - * Implement only what's needed to satisfy the current test - * Avoid over-engineering or adding features not covered by tests - * Keep code simple and direct - optimization comes later - * Run the test frequently to verify progress + You are a code-implementer. Given a failing test case and context (existing codebase or module), write the minimal code change needed so that the test passes - no extra features. Output a code diff or new file content accordingly. Do not write tests, only implementation. - ## Workflow + After implementing changes, invoke "TDD Test Runner" agent using #tool:agent/runSubagent to verify the tests pass. + ``` - 1. Understand what the test expects - 2. Write the simplest implementation that makes the test pass - 3. Run the test to verify it passes - 4. Run the full test suite to ensure no regressions +## Step 5: Create test runner custom agent - ## Do not +Create a "TDD Test Runner" custom agent that executes the test suite and reports the results. This agent is invoked by the green phase agent to verify that the implementation code makes the tests pass. - * Add functionality beyond what tests require - * Optimize prematurely - * Refactor code (that happens in the next phase) - * Skip running tests - ``` +To create the `.github/agents/TDD-Test-Runner.agent.md` test runner [custom agent](/docs/copilot/customization/custom-agents.md): -## Step 4: Create refactor phase chat mode +1. Run the **Chat: New Custom Agent** command in the Command Palette. -The refactor phase improves code quality while keeping all tests passing. A dedicated [chat mode](/docs/copilot/customization/custom-chat-modes.md) for this phase describes the AI's role and guidelines for safe refactoring. After refactoring, the AI can either return to the red phase for the next feature or finish if all functionality is complete. + * Select `.github/agents` to create the custom agent definition in your workspace. + * Enter "TDD-Test-Runner" as the name for the custom agent. -1. Create a refactor phase [chat mode](/docs/copilot/customization/custom-chat-modes.md) `.github/chatmodes/TDD-refactor.chatmode.md`. +1. Update the custom agent definition to describe the guidelines and rules for running tests. - The following `TDD-refactor.chatmode.md` file provides a starting point: + The following `TDD-Test-Runner.agent.md` file provides a starting point: ```markdown --- - description: 'Improve code quality while keeping all tests passing (Refactor phase).' + name: TDD Test Runner + description: Run tests and report pass/fail results + infer: true + tools: ['execute/runTests', 'search'] --- - # Refactor Phase: Improve Code Quality + You are test-runner. Given the codebase (after changes) and test suite, run via available test harness and output a summary: which tests passed/failed, error messages or tracebacks if failing. Use standard format (e.g. JSON, or markdown table). + ``` - You are a quality-focused developer who improves code structure and readability while maintaining all test coverage. +## Step 6: Create refactor phase chat mode - ## Guidelines +Finally, create a "TDD-refactor" custom agent that focuses on the refactor phase of TDD to improve code quality while keeping all tests passing. This agent is responsible for cleaning up code, removing duplication, improving naming, and enhancing structure without changing functionality. To run the tests, this agent invokes the "TDD Test Runner" custom agent. - * Keep all tests passing throughout refactoring - * Remove duplication (DRY principle) - * Improve naming for clarity - * Simplify complex logic - * Enhance code structure and organization +To create the `.github/agents/TDD-refactor.agent.md` refactor phase [custom chat agent](/docs/copilot/customization/custom-agents.md): - ## Workflow +1. Run the **Chat: New Custom Agent** command in the Command Palette. - 1. Identify opportunities for improvement (duplication, unclear naming, complex logic) - 2. Make small, safe refactoring steps - 3. Run tests after each change to ensure they still pass - 4. Continue until code meets quality standards + * Select `.github/agents` to create the custom agent definition in your workspace. + * Enter "TDD-refactor" as the name for the custom agent. - ## Do not +1. Update the custom agent definition to describe the guidelines and rules for the refactor phase. - * Change functionality or behavior - * Add new features - * Skip running tests after changes - * Make large refactoring changes in one step - ``` + The following `TDD-refactor.agent.md` file provides a starting point: + + ```markdown + --- + name: TDD Refactor + description: Refactor code while maintaining passing tests + tools: ['search', 'edit', 'read', 'execute/runTests', 'agent'] + infer: true + --- + You are refactor-assistant. Given code that passes all tests, examine it and suggest or apply refactoring to improve readability/structure/DRYness, without changing behavior. Output a code diff (or list of refactoring suggestions), no new functionality, no breaking changes. -1. After refactoring, run the full test suite to verify all tests still pass. + After refactoring, invoke "TDD Test Runner" agent using #tool:agent/runSubagent to ensure all tests still pass and behavior is preserved. + ``` -## Step 5: Use the TDD workflow +## Use the TDD workflow to implement features -With the custom chat modes and testing context set up, you can now use the AI-assisted TDD workflow in VS Code to implement new features: +Now that the TDD custom agents are set up, you can use them to implement features in your project using the TDD workflow. -1. Open the Chat view and select the **TDD-red** chat mode to start the red phase. +1. Open the Chat view and select the **TDD Supervisor** agent from the agents dropdown. 1. Provide a prompt that describes the feature or behavior you want to implement. - Follow the agent through the red phase to write failing tests. You can continue the conversation until you're satisfied with the tests. - For example: ```text Implement user registration with email validation and password requirements. ``` -1. When ready, use the handoff to transition to the **TDD-green** chat mode for the green phase. - - Notice that the agent automatically switches to the green phase and starts implementing code to make the tests pass. You can provide additional prompts or clarifications as needed. - -1. After the tests pass, use the handoff to transition to the **TDD-refactor** chat mode for the final refactor phase. - - The agent switches to the refactor phase and now focuses on improving code quality while ensuring all tests remain passing. - -At any time, you can review the code and tests generated by the AI, run tests manually, and provide feedback or corrections to guide the AI's output. You can manually switch back to previous phases if needed. +1. Follow as the TDD supervisor agent orchestrates the workflow through the different phases of the TDD cycle. ## Troubleshooting and best practices @@ -285,6 +301,6 @@ At any time, you can review the code and tests generated by the AI, run tests ma Learn more about testing and AI customization in VS Code: * [Testing with AI](/docs/copilot/guides/test-with-copilot.md) -* [Custom chat modes](/docs/copilot/customization/custom-chat-modes.md) +* [Custom agents](/docs/copilot/customization/custom-agents.md) * [Custom instructions](/docs/copilot/customization/custom-instructions.md) * [Running tests with VS Code](/docs/debugtest/testing.md) From 73ba12427182ed9fa3aebaa5475c3bff3effdf21 Mon Sep 17 00:00:00 2001 From: Nick Trogh Date: Wed, 7 Jan 2026 16:34:14 +0100 Subject: [PATCH 4/4] Update diagram --- .../guides/test-driven-development-guide.md | 42 +- .../tdd-implementation-diagram.excalidraw | 1704 +++++++++++++++++ .../tdd-implementation-diagram.png | 3 + .../tdd-workflow-diagram.png | 3 - 4 files changed, 1733 insertions(+), 19 deletions(-) create mode 100644 docs/copilot/images/test-driven-development-guide/tdd-implementation-diagram.excalidraw create mode 100644 docs/copilot/images/test-driven-development-guide/tdd-implementation-diagram.png delete mode 100644 docs/copilot/images/test-driven-development-guide/tdd-workflow-diagram.png diff --git a/docs/copilot/guides/test-driven-development-guide.md b/docs/copilot/guides/test-driven-development-guide.md index 9586dad5a9..ba56c49f1b 100644 --- a/docs/copilot/guides/test-driven-development-guide.md +++ b/docs/copilot/guides/test-driven-development-guide.md @@ -1,8 +1,18 @@ --- ContentId: a9c5f4d2-8e91-4b3a-9d2c-7f1e3b8a6c4d DateApproved: 12/10/2025 -MetaDescription: Learn how to set up a test-driven development (TDD) workflow in VS Code using AI customization features. +MetaDescription: Learn how to set up a test-driven development (TDD) workflow in VS Code with Copilot and custom agents and instructions. MetaSocialImage: ../images/shared/github-copilot-social.png +Keywords: +- ai +- copilot +- agents +- instructions +- customization +- guide +- tutorial +- testing +- TDD --- # Set up a test-driven development flow in VS Code @@ -24,16 +34,18 @@ The three phases are: * **Refactor phase**: Improve the code quality while keeping all tests passing. Clean up duplication, improve naming, and enhance structure. + Green[🟒 Green
Make test pass] - Green --> Refactor[πŸ”΅ Refactor
Improve code] - Refactor --> Red + Red[πŸ”΄ Red
Write failing test] --> Green[🟒 Green
Make test pass] + Green --> Refactor[πŸ”΅ Refactor
Improve code] + Refactor --> Red style Red fill:#ffcccc style Green fill:#ccffcc style Refactor fill:#cce5ff ``` +--> ## TDD implementation overview @@ -45,15 +57,13 @@ In addition to custom agents for each phase, you can also set up a _TDD supervis If you have established test conventions, you can use [custom instructions](/docs/copilot/customization/custom-instructions.md) to set up a testing context that guides the AI in generating tests that align with your project's standards. -TODO: add diagram +The following diagram shows how custom agents work together to implement the TDD workflow. The TDD Supervisor orchestrates the cycle by invoking each phase agent in sequence, with handoffs enabling transitions between phases. + +![Diagram that shows the TDD implementation diagram for VS Code with testing instructions, and custom agents for the supervisor, red, green, refactor, and test runner phases.](../images/test-driven-development-guide/tdd-implementation-diagram.png) > [!TIP] > You can further enhance the TDD workflow by adding a planning phase before starting the cycle. You can use the built-in plan agent or create a custom planning agent that helps clarify requirements and identify edge cases to cover with tests. - - ## Step 1: Set up testing guidelines If you have established test conventions and practices, create a custom instructions file (`testing.instructions.md`) to help the AI generate tests that align with your project's standards. @@ -141,7 +151,7 @@ To create the `.github/agents/TDD-supervisor.agent.md` supervisor [custom agent] ## Step 3: Create red phase custom agent -Next, create a "TDD-red" custom agent that focuses on the red phase of TDD. This custom agent is only responsible for writing failing tests based on the provided requirements and should not implement any application code. When completed, this agent hands off to the green phase custom agent. +Create a "TDD-red" custom agent that focuses on the red phase of TDD. This custom agent is only responsible for writing failing tests based on the provided requirements and should not implement any application code. When completed, this agent hands off to the green phase custom agent. **Why this helps**: Without a focused mode, the AI might mix implementation suggestions with test creation, and miss the core TDD principle of writing tests first. @@ -163,7 +173,7 @@ To create the `.github/agents/TDD-red.agent.md` red phase [custom agent](/docs/c infer: true tools: ['read', 'edit', 'search'] handoffs: - - label: TDD Green + - label: TDD Green agent: TDD Green prompt: Implement minimal implementation --- @@ -172,7 +182,7 @@ To create the `.github/agents/TDD-red.agent.md` red phase [custom agent](/docs/c ## Step 4: Create green phase custom agent -Now, create a "TDD-green" custom agent that focuses on the green phase of TDD. This custom agent is only responsible for writing the minimal implementation code to make the tests pass, without modifying the test code. To run the tests, this agent invokes the "TDD Test Runner" custom agent. When completed, this agent hands off to the refactor phase custom agent. +Create a "TDD-green" custom agent that focuses on the green phase of TDD. This custom agent is only responsible for writing the minimal implementation code to make the tests pass, without modifying the test code. To run the tests, this agent invokes the "TDD Test Runner" custom agent. When completed, this agent hands off to the refactor phase custom agent. To create the `.github/agents/TDD-green.agent.md` green phase [custom agent](/docs/copilot/customization/custom-agents.md): @@ -192,7 +202,7 @@ To create the `.github/agents/TDD-green.agent.md` green phase [custom agent](/do infer: true tools: ['search', 'edit', 'execute/runTests', 'agent'] handoffs: - - label: TDD Refactor + - label: TDD Refactor agent: TDD Refactor prompt: Refactor the implementation --- @@ -229,7 +239,7 @@ To create the `.github/agents/TDD-Test-Runner.agent.md` test runner [custom agen ## Step 6: Create refactor phase chat mode -Finally, create a "TDD-refactor" custom agent that focuses on the refactor phase of TDD to improve code quality while keeping all tests passing. This agent is responsible for cleaning up code, removing duplication, improving naming, and enhancing structure without changing functionality. To run the tests, this agent invokes the "TDD Test Runner" custom agent. +Create a "TDD-refactor" custom agent that focuses on the refactor phase of TDD to improve code quality while keeping all tests passing. This agent is responsible for cleaning up code, removing duplication, improving naming, and enhancing structure without changing functionality. To run the tests, this agent invokes the "TDD Test Runner" custom agent. To create the `.github/agents/TDD-refactor.agent.md` refactor phase [custom chat agent](/docs/copilot/customization/custom-agents.md): @@ -258,7 +268,7 @@ To create the `.github/agents/TDD-refactor.agent.md` refactor phase [custom chat Now that the TDD custom agents are set up, you can use them to implement features in your project using the TDD workflow. -1. Open the Chat view and select the **TDD Supervisor** agent from the agents dropdown. +1. Open the Chat view and select the **TDD Supervisor** agent from the agent dropdown menu. 1. Provide a prompt that describes the feature or behavior you want to implement. @@ -268,7 +278,7 @@ Now that the TDD custom agents are set up, you can use them to implement feature Implement user registration with email validation and password requirements. ``` -1. Follow as the TDD supervisor agent orchestrates the workflow through the different phases of the TDD cycle. +1. Notice that the TDD supervisor agent orchestrates the workflow through the different phases of the TDD cycle. ## Troubleshooting and best practices diff --git a/docs/copilot/images/test-driven-development-guide/tdd-implementation-diagram.excalidraw b/docs/copilot/images/test-driven-development-guide/tdd-implementation-diagram.excalidraw new file mode 100644 index 0000000000..49b8df429c --- /dev/null +++ b/docs/copilot/images/test-driven-development-guide/tdd-implementation-diagram.excalidraw @@ -0,0 +1,1704 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "FVQ8h7-FzMDhqH3zEgLD7", + "type": "rectangle", + "x": 838.3299210221404, + "y": 275.39400171931925, + "width": 239.57684647428744, + "height": 164.00531705164886, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "PZ6LTluEasjNE292H5DRG" + ], + "frameId": null, + "index": "Zy", + "roundness": { + "type": 3 + }, + "seed": 2030119446, + "version": 567, + "versionNonce": 195738134, + "isDeleted": false, + "boundElements": [ + { + "id": "U-X_4YpeMIFGjLeHshy6Q", + "type": "arrow" + } + ], + "updated": 1767799521939, + "link": null, + "locked": false + }, + { + "id": "iEFI6S9Nfidm2IBy8HdhS", + "type": "text", + "x": 887.7236986830194, + "y": 286.8305566297924, + "width": 143.42010498046878, + "height": 21.6, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "PZ6LTluEasjNE292H5DRG" + ], + "frameId": null, + "index": "Zz", + "roundness": null, + "seed": 1119844182, + "version": 696, + "versionNonce": 1918349450, + "isDeleted": false, + "boundElements": [], + "updated": 1767799515425, + "link": null, + "locked": false, + "text": "Context", + "fontSize": 16, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Context", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "jp4nUH_7ReXdgdjyQVdro", + "type": "rectangle", + "x": -94.38470596246054, + "y": 276.52171919614216, + "width": 239.57684647428744, + "height": 164.00531705164886, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "RY6Ug7BfYcHCqrXsNMlMv" + ], + "frameId": null, + "index": "aAG", + "roundness": { + "type": 3 + }, + "seed": 1512324746, + "version": 464, + "versionNonce": 1328962826, + "isDeleted": false, + "boundElements": null, + "updated": 1767799311978, + "link": null, + "locked": false + }, + { + "id": "OGutjHqJQ-7hDu1VKIp8J", + "type": "text", + "x": -44.99092830158162, + "y": 287.9582741066153, + "width": 143.42010498046878, + "height": 21.6, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "RY6Ug7BfYcHCqrXsNMlMv" + ], + "frameId": null, + "index": "aAV", + "roundness": null, + "seed": 232492310, + "version": 585, + "versionNonce": 733040790, + "isDeleted": false, + "boundElements": null, + "updated": 1767799311978, + "link": null, + "locked": false, + "text": "Orchestrator", + "fontSize": 16, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Orchestrator", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "KAdVI8r0xa936C6qLesIl", + "type": "rectangle", + "x": -83.05943823306558, + "y": 332.57963193628456, + "width": 219.1818606083055, + "height": 65.09590547674644, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 20, + "groupIds": [ + "9EHAX4qhWi5VE4lM30m_v", + "RY6Ug7BfYcHCqrXsNMlMv" + ], + "frameId": null, + "index": "aB", + "roundness": null, + "seed": 391715018, + "version": 955, + "versionNonce": 523905994, + "isDeleted": false, + "boundElements": [ + { + "id": "bagAUlgYHbFZ3vJV_qAmW", + "type": "arrow" + } + ], + "updated": 1767799311978, + "link": null, + "locked": false + }, + { + "id": "848qN0xgVUeJXTrC3QNW2", + "type": "text", + "x": -70.7690872441649, + "y": 344.3464797988278, + "width": 192.96434125241132, + "height": 18.214312952868003, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "9EHAX4qhWi5VE4lM30m_v", + "RY6Ug7BfYcHCqrXsNMlMv" + ], + "frameId": null, + "index": "aBV", + "roundness": null, + "seed": 403320662, + "version": 1330, + "versionNonce": 698797526, + "isDeleted": false, + "boundElements": [], + "updated": 1767799311978, + "link": null, + "locked": false, + "text": "TDD-Supervisor.agent.md", + "fontSize": 13.492083668791112, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "TDD-Supervisor.agent.md", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "VuOSaNvETSws6jSRJj6bi", + "type": "text", + "x": -61.769284846344334, + "y": 368.1375757935038, + "width": 183.85973423048273, + "height": 18.214312952868, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 70, + "groupIds": [ + "Z7nZbWFyMHCG6kaqhwE0h", + "RY6Ug7BfYcHCqrXsNMlMv" + ], + "frameId": null, + "index": "aC", + "roundness": null, + "seed": 528000650, + "version": 1413, + "versionNonce": 1129718410, + "isDeleted": false, + "boundElements": [ + { + "id": "bagAUlgYHbFZ3vJV_qAmW", + "type": "arrow" + } + ], + "updated": 1767799311978, + "link": null, + "locked": false, + "text": "(Orchestrate workflow)", + "fontSize": 13.49208366879111, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Orchestrate workflow)", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "bagAUlgYHbFZ3vJV_qAmW", + "type": "arrow", + "x": 26.430995557000074, + "y": 402.70036311738585, + "width": 190.1049498904839, + "height": 153.46194530522297, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "aT", + "roundness": null, + "seed": 424312086, + "version": 666, + "versionNonce": 1789619786, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "5xbwnXP7C_JgnR7eCoocv" + } + ], + "updated": 1767799434529, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 153.46194530522297 + ], + [ + 190.1049498904839, + 153.46194530522297 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "VuOSaNvETSws6jSRJj6bi", + "fixedPoint": [ + 0.47971504349494154, + 1.8975619565403283 + ], + "focus": 0, + "gap": 1 + }, + "endBinding": { + "elementId": "Hs63cRINQQmkQuL3v65MK", + "fixedPoint": [ + -0.009285124277784959, + 0.4998213810462097 + ], + "focus": 0, + "gap": 0 + }, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "5xbwnXP7C_JgnR7eCoocv", + "type": "text", + "x": -16.09697380335149, + "y": 545.3623084226089, + "width": 85.05593872070312, + "height": 21.6, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "aTV", + "roundness": null, + "seed": 706413718, + "version": 13, + "versionNonce": 1361227990, + "isDeleted": false, + "boundElements": null, + "updated": 1767799433560, + "link": null, + "locked": false, + "text": "Orchestrate", + "fontSize": 16, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "bagAUlgYHbFZ3vJV_qAmW", + "originalText": "Orchestrate", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "Hs63cRINQQmkQuL3v65MK", + "type": "rectangle", + "x": 221.53594544748398, + "y": 276.3368081384236, + "width": 538.4957541131362, + "height": 559.8510005683704, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aa", + "roundness": { + "type": 3 + }, + "seed": 119217866, + "version": 770, + "versionNonce": 1142290314, + "isDeleted": false, + "boundElements": [ + { + "id": "7Z7lslYZ2Q8P3-W7MBP9W", + "type": "arrow" + }, + { + "id": "wZLkTssY6VJ3cpl6dkMTJ", + "type": "arrow" + }, + { + "id": "bagAUlgYHbFZ3vJV_qAmW", + "type": "arrow" + }, + { + "id": "U-X_4YpeMIFGjLeHshy6Q", + "type": "arrow" + } + ], + "updated": 1767799447081, + "link": null, + "locked": false + }, + { + "id": "1u1yW-33C8hN0boM5K8zE", + "type": "rectangle", + "x": 385.1605987548828, + "y": 336.27601623535156, + "width": 218.09896850585938, + "height": 64.7742919921875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 20, + "groupIds": [ + "ty2sadOcLz6vSi-Tnv4_B", + "AxY-5yDBghhwBcSa45eHA" + ], + "frameId": null, + "index": "ab", + "roundness": null, + "seed": 1872581962, + "version": 415, + "versionNonce": 829173898, + "isDeleted": false, + "boundElements": [ + { + "id": "RrOblNtQFr6u3A0NXEVo7", + "type": "arrow" + }, + { + "id": "wHV10xxYlAxi3DbgttMn6", + "type": "arrow" + } + ], + "updated": 1767799027355, + "link": null, + "locked": false + }, + { + "id": "iEyP7uWZNK7J9f8-9wf4_", + "type": "text", + "x": 421.3151397705078, + "y": 347.984728691134, + "width": 154.29681396484378, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "ty2sadOcLz6vSi-Tnv4_B", + "AxY-5yDBghhwBcSa45eHA" + ], + "frameId": null, + "index": "ac", + "roundness": null, + "seed": 1083710474, + "version": 726, + "versionNonce": 260432778, + "isDeleted": false, + "boundElements": [], + "updated": 1767799324572, + "link": null, + "locked": false, + "text": "πŸ”΄ TDD-Red.agent.md", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "πŸ”΄ TDD-Red.agent.md", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "BNU6dTzjxcbnkeBGz5AAJ", + "type": "text", + "x": 406.34556579589844, + "y": 371.6582821579309, + "width": 182.95135498046878, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 70, + "groupIds": [ + "qMBzPiorc4bdVu7NmvBL0", + "AxY-5yDBghhwBcSa45eHA" + ], + "frameId": null, + "index": "ad", + "roundness": null, + "seed": 470551242, + "version": 884, + "versionNonce": 1919520586, + "isDeleted": false, + "boundElements": [], + "updated": 1767799027355, + "link": null, + "locked": false, + "text": "(Write failing test)", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Write failing test)", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "-jZDeql6ZfuLrsXYeTYjm", + "type": "rectangle", + "x": 277.2353057861328, + "y": 483.9323425292968, + "width": 218.09896850585938, + "height": 64.7742919921875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 20, + "groupIds": [ + "w3CKgQ1ZoF3iRT_J5qRxv", + "_MtSwM03I7GULmIzZwlUe" + ], + "frameId": null, + "index": "ae", + "roundness": null, + "seed": 1028179594, + "version": 589, + "versionNonce": 1848730198, + "isDeleted": false, + "boundElements": [ + { + "id": "RrOblNtQFr6u3A0NXEVo7", + "type": "arrow" + }, + { + "id": "7Z7lslYZ2Q8P3-W7MBP9W", + "type": "arrow" + }, + { + "id": "dSZrK4CgPXzJVOs2ZSdCQ", + "type": "arrow" + } + ], + "updated": 1767799027355, + "link": null, + "locked": false + }, + { + "id": "zzjoK5kyJJX3PxJSErG2U", + "type": "text", + "x": 313.3898468017578, + "y": 495.6410549850793, + "width": 154.29681396484378, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "w3CKgQ1ZoF3iRT_J5qRxv", + "_MtSwM03I7GULmIzZwlUe" + ], + "frameId": null, + "index": "af", + "roundness": null, + "seed": 1111713098, + "version": 902, + "versionNonce": 1312320970, + "isDeleted": false, + "boundElements": [], + "updated": 1767799334334, + "link": null, + "locked": false, + "text": "🟒 TDD-Green.agent.md", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "🟒 TDD-Green.agent.md", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "-xxUgm5tHCRy9Bx3O6gDR", + "type": "text", + "x": 298.42027282714844, + "y": 519.3146084518762, + "width": 182.95135498046878, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 70, + "groupIds": [ + "-LxNzZx7iOgEYYJtskOQw", + "_MtSwM03I7GULmIzZwlUe" + ], + "frameId": null, + "index": "ag", + "roundness": null, + "seed": 1945906186, + "version": 1067, + "versionNonce": 1304340374, + "isDeleted": false, + "boundElements": [], + "updated": 1767799027355, + "link": null, + "locked": false, + "text": "(Write minimal code)", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Write minimal code)", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "BJhC1233oHWY1RhNuJAa5", + "type": "rectangle", + "x": 496.7161407470703, + "y": 624.9427490234375, + "width": 218.09896850585938, + "height": 64.7742919921875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 20, + "groupIds": [ + "NoSX6VUQUnmRB55w3E5ad", + "9rmXXbOq1fefKBgep5K0C" + ], + "frameId": null, + "index": "agV", + "roundness": null, + "seed": 1261273738, + "version": 799, + "versionNonce": 1171449610, + "isDeleted": false, + "boundElements": [ + { + "id": "bagAUlgYHbFZ3vJV_qAmW", + "type": "arrow" + }, + { + "id": "7Z7lslYZ2Q8P3-W7MBP9W", + "type": "arrow" + }, + { + "id": "wHV10xxYlAxi3DbgttMn6", + "type": "arrow" + }, + { + "id": "wZLkTssY6VJ3cpl6dkMTJ", + "type": "arrow" + } + ], + "updated": 1767799371356, + "link": null, + "locked": false + }, + { + "id": "rvk6sVoEZ-RxwrSuB82dq", + "type": "text", + "x": 509.18791694289484, + "y": 636.65146147922, + "width": 192.9201705129196, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "NoSX6VUQUnmRB55w3E5ad", + "9rmXXbOq1fefKBgep5K0C" + ], + "frameId": null, + "index": "ah", + "roundness": null, + "seed": 741384522, + "version": 1192, + "versionNonce": 1652188822, + "isDeleted": false, + "boundElements": [], + "updated": 1767799371356, + "link": null, + "locked": false, + "text": "πŸ”΅ TDD-Refactor.agent.md", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "πŸ”΅ TDD-Refactor.agent.md", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "i4OxfcH5W6Oso8hwMnK9J", + "type": "text", + "x": 517.9011077880859, + "y": 660.3250149460168, + "width": 182.95135498046878, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 70, + "groupIds": [ + "XSSSDEbdMMq4iM7WL66QO", + "9rmXXbOq1fefKBgep5K0C" + ], + "frameId": null, + "index": "ai", + "roundness": null, + "seed": 618784778, + "version": 1285, + "versionNonce": 1706390986, + "isDeleted": false, + "boundElements": [], + "updated": 1767799371356, + "link": null, + "locked": false, + "text": "(Improve code)", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Improve code)", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "FAoRnqNOAkbr87rdkmG4o", + "type": "rectangle", + "x": 275.3856705375431, + "y": 720.500545854944, + "width": 218.09896850585938, + "height": 64.7742919921875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 20, + "groupIds": [ + "lkobNFDP3Y1gqqudwyOwl", + "3gRHKpPsyfIVfEdEx6cIc" + ], + "frameId": null, + "index": "ak", + "roundness": null, + "seed": 1007673302, + "version": 936, + "versionNonce": 1662690186, + "isDeleted": false, + "boundElements": [ + { + "id": "dSZrK4CgPXzJVOs2ZSdCQ", + "type": "arrow" + }, + { + "id": "wZLkTssY6VJ3cpl6dkMTJ", + "type": "arrow" + } + ], + "updated": 1767799041530, + "link": null, + "locked": false + }, + { + "id": "rR1JvAGi0VJ_78aAd2baM", + "type": "text", + "x": 311.5402115531681, + "y": 732.2092583107265, + "width": 154.29681396484378, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "lkobNFDP3Y1gqqudwyOwl", + "3gRHKpPsyfIVfEdEx6cIc" + ], + "frameId": null, + "index": "al", + "roundness": null, + "seed": 636581142, + "version": 1268, + "versionNonce": 454027274, + "isDeleted": false, + "boundElements": [], + "updated": 1767799389374, + "link": null, + "locked": false, + "text": "Test-Runner.agent.md", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Test-Runner.agent.md", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "iFVs5At0hMAhaF4R6D9dn", + "type": "text", + "x": 296.5706375785587, + "y": 755.8828117775233, + "width": 182.95135498046878, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 70, + "groupIds": [ + "7gTtZV88bHzB04SmtBQPw", + "3gRHKpPsyfIVfEdEx6cIc" + ], + "frameId": null, + "index": "am", + "roundness": null, + "seed": 560882262, + "version": 1431, + "versionNonce": 1321350602, + "isDeleted": false, + "boundElements": [ + { + "id": "dSZrK4CgPXzJVOs2ZSdCQ", + "type": "arrow" + } + ], + "updated": 1767799062997, + "link": null, + "locked": false, + "text": "(Run tests)", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Run tests)", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "v82GGP8vvdySgn-bJBRy7", + "type": "text", + "x": 419.27636491012856, + "y": 287.9708829426822, + "width": 143.42010498046878, + "height": 21.6, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "an", + "roundness": null, + "seed": 1773974474, + "version": 469, + "versionNonce": 2085929226, + "isDeleted": false, + "boundElements": [], + "updated": 1767799027355, + "link": null, + "locked": false, + "text": "TDD Workflow", + "fontSize": 16, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "TDD Workflow", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "RrOblNtQFr6u3A0NXEVo7", + "type": "arrow", + "x": 489.7740444757781, + "y": 412.8513587653457, + "width": 65.98598968249047, + "height": 63.91855135105334, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "ao", + "roundness": null, + "seed": 757073238, + "version": 507, + "versionNonce": 823864470, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WuANZ4jSwr5taxJgMJqA2" + } + ], + "updated": 1767799027355, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -65.98598968249047, + 63.91855135105334 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "1u1yW-33C8hN0boM5K8zE", + "focus": -0.49353841728367037, + "gap": 11.801050537806645, + "fixedPoint": [ + 0.47966043323164453, + 1.1821872563150515 + ] + }, + "endBinding": { + "elementId": "-jZDeql6ZfuLrsXYeTYjm", + "focus": 0.05545387475148864, + "gap": 7.162432412897772, + "fixedPoint": [ + 0.671955259628922, + -0.11057523274452218 + ] + }, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "WuANZ4jSwr5taxJgMJqA2", + "type": "text", + "x": 427.3970698371696, + "y": 430.01063444087237, + "width": 58.76795959472656, + "height": 21.6, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "ap", + "roundness": null, + "seed": 99434198, + "version": 18, + "versionNonce": 1659637706, + "isDeleted": false, + "boundElements": null, + "updated": 1767799027355, + "link": null, + "locked": false, + "text": "Handoff", + "fontSize": 16, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RrOblNtQFr6u3A0NXEVo7", + "originalText": "Handoff", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "7Z7lslYZ2Q8P3-W7MBP9W", + "type": "arrow", + "x": 447.98526452180664, + "y": 559.8390375461707, + "width": 103.03440221194825, + "height": 55.321945113765196, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "aq", + "roundness": { + "type": 2 + }, + "seed": 177514442, + "version": 499, + "versionNonce": 229560842, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "bPJyHBxierVIl7WvRekis" + } + ], + "updated": 1767799062998, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 103.03440221194825, + 55.321945113765196 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "-jZDeql6ZfuLrsXYeTYjm", + "focus": 0.11645314135132787, + "gap": 11.132403024686482 + }, + "endBinding": { + "elementId": "BJhC1233oHWY1RhNuJAa5", + "focus": 0.13961727034464835, + "gap": 9.781766363501447 + }, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false + }, + { + "id": "bPJyHBxierVIl7WvRekis", + "type": "text", + "x": 437.52651775188735, + "y": 537.871383332183, + "width": 58.76795959472656, + "height": 21.6, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "ar", + "roundness": null, + "seed": 1510108630, + "version": 17, + "versionNonce": 2133558922, + "isDeleted": false, + "boundElements": null, + "updated": 1767799027355, + "link": null, + "locked": false, + "text": "Handoff", + "fontSize": 16, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "7Z7lslYZ2Q8P3-W7MBP9W", + "originalText": "Handoff", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "wHV10xxYlAxi3DbgttMn6", + "type": "arrow", + "x": 650.3857798856014, + "y": 615.3274266055953, + "width": 92.17821386481137, + "height": 202.78667526059218, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "as", + "roundness": { + "type": 2 + }, + "seed": 1699859222, + "version": 217, + "versionNonce": 1088159946, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Nyz5e4KwHWHGSRq-SzUkc" + } + ], + "updated": 1767799062999, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -35.27842873289194, + -127.6076665432459 + ], + [ + -92.17821386481137, + -202.78667526059218 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "BJhC1233oHWY1RhNuJAa5", + "focus": 0.4765306665872304, + "gap": 9.615322417842208 + }, + "endBinding": { + "elementId": "1u1yW-33C8hN0boM5K8zE", + "focus": -0.23051783133593684, + "gap": 11.490443117463997 + }, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false + }, + { + "id": "Nyz5e4KwHWHGSRq-SzUkc", + "type": "text", + "x": 570.0833872244868, + "y": 476.9197600623494, + "width": 90.04792785644531, + "height": 21.6, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "at", + "roundness": null, + "seed": 659213718, + "version": 30, + "versionNonce": 969811274, + "isDeleted": false, + "boundElements": null, + "updated": 1767799027355, + "link": null, + "locked": false, + "text": "Next feature", + "fontSize": 16, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "wHV10xxYlAxi3DbgttMn6", + "originalText": "Next feature", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "dSZrK4CgPXzJVOs2ZSdCQ", + "type": "arrow", + "x": 388.3662092571025, + "y": 558.0237100282709, + "width": 0.000048746290246981516, + "height": 153.2577944060033, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "au", + "roundness": null, + "seed": 258701398, + "version": 158, + "versionNonce": 763964502, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "dCUXebQmeaOzS5LAKNDFK" + } + ], + "updated": 1767799027355, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.000048746290246981516, + 153.2577944060033 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "-jZDeql6ZfuLrsXYeTYjm", + "focus": -0.01908785121443668, + "gap": 9.317075506786523 + }, + "endBinding": { + "elementId": "FAoRnqNOAkbr87rdkmG4o", + "focus": 0.0360492817178553, + "gap": 9.219041420669896 + }, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "dCUXebQmeaOzS5LAKNDFK", + "type": "text", + "x": 363.8678196814857, + "y": 621.4048105075537, + "width": 46.86393737792969, + "height": 21.6, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "av", + "roundness": null, + "seed": 932045642, + "version": 20, + "versionNonce": 741272586, + "isDeleted": false, + "boundElements": null, + "updated": 1767799027355, + "link": null, + "locked": false, + "text": "Invoke", + "fontSize": 16, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "dSZrK4CgPXzJVOs2ZSdCQ", + "originalText": "Invoke", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "wZLkTssY6VJ3cpl6dkMTJ", + "type": "arrow", + "x": 605.665625, + "y": 694.717041015625, + "width": 107.18098595659751, + "height": 58.07065083541272, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [ + "vNftq2qbBvz1oOIXDsn2l" + ], + "frameId": null, + "index": "aw", + "roundness": null, + "seed": 2103156502, + "version": 593, + "versionNonce": 2143933846, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "mzISSVx7DE8sDViXrUZmp" + } + ], + "updated": 1767799097469, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -107.18098595659751, + 58.07065083541272 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "BJhC1233oHWY1RhNuJAa5", + "focus": -0.3611785870515848, + "gap": 6.035655407237414, + "fixedPoint": [ + 0.4869915843703556, + 1.093179797441327 + ] + }, + "endBinding": { + "elementId": "FAoRnqNOAkbr87rdkmG4o", + "focus": 0.8003165553728266, + "gap": 8.98418054785759, + "fixedPoint": [ + 1.0411931363518403, + 0.5995883811712365 + ] + }, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "mzISSVx7DE8sDViXrUZmp", + "type": "text", + "x": 529.2814416675608, + "y": 712.9555521502359, + "width": 48.26988220214844, + "height": 22.251787112732835, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [ + "vNftq2qbBvz1oOIXDsn2l" + ], + "frameId": null, + "index": "ax", + "roundness": null, + "seed": 503532630, + "version": 339, + "versionNonce": 218752598, + "isDeleted": false, + "boundElements": [], + "updated": 1767799062998, + "link": null, + "locked": false, + "text": "Invoke", + "fontSize": 16.48280526869099, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "wZLkTssY6VJ3cpl6dkMTJ", + "originalText": "Invoke", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "PuIQrJGQGIguM7kgQVqLi", + "type": "rectangle", + "x": 849.2427761585693, + "y": 340.48066735518245, + "width": 218.09896850585938, + "height": 64.7742919921875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 20, + "groupIds": [ + "vMY_2ohv6ZfJXfA-QYEQ_", + "FvtiyQ-igdvNIbKDycifZ" + ], + "frameId": null, + "index": "ay", + "roundness": null, + "seed": 85940886, + "version": 485, + "versionNonce": 1884275722, + "isDeleted": false, + "boundElements": [], + "updated": 1767799151616, + "link": null, + "locked": false + }, + { + "id": "dpwDV53G3jlyNXmCI1Gx3", + "type": "text", + "x": 885.3973171741943, + "y": 352.1893798109649, + "width": 154.29681396484378, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "vMY_2ohv6ZfJXfA-QYEQ_", + "FvtiyQ-igdvNIbKDycifZ" + ], + "frameId": null, + "index": "az", + "roundness": null, + "seed": 2093193174, + "version": 818, + "versionNonce": 124419990, + "isDeleted": false, + "boundElements": [], + "updated": 1767799408020, + "link": null, + "locked": false, + "text": "Testing.instructions.md", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Testing.instructions.md", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "QRhyY3uYhNL2datE2ciPd", + "type": "text", + "x": 870.4277431995849, + "y": 375.8629332777618, + "width": 182.95135498046878, + "height": 18.124323135310096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 70, + "groupIds": [ + "LgRLlqH0pwF0go3E3kGL9", + "FvtiyQ-igdvNIbKDycifZ" + ], + "frameId": null, + "index": "b00", + "roundness": null, + "seed": 124661014, + "version": 983, + "versionNonce": 1748569110, + "isDeleted": false, + "boundElements": [ + { + "id": "U-X_4YpeMIFGjLeHshy6Q", + "type": "arrow" + } + ], + "updated": 1767799457473, + "link": null, + "locked": false, + "text": "(Testing guidelines)", + "fontSize": 13.425424544674145, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Testing guidelines)", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "U-X_4YpeMIFGjLeHshy6Q", + "type": "arrow", + "x": 765.0316995606202, + "y": 556.1623084226088, + "width": 192.986644698664, + "height": 111.76298965164074, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": null, + "seed": 1221384842, + "version": 850, + "versionNonce": 1934077078, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "tZBOdpedRmWRKxKHLhS_D" + } + ], + "updated": 1767799522599, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 192.986644698664, + 0 + ], + [ + 192.986644698664, + -111.76298965164074 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "Hs63cRINQQmkQuL3v65MK", + "fixedPoint": [ + 1.009285124277785, + 0.4998213810462097 + ], + "focus": 0, + "gap": 0 + }, + "endBinding": { + "elementId": "FVQ8h7-FzMDhqH3zEgLD7", + "fixedPoint": [ + 0.49958259739423233, + 1.0304868164635501 + ], + "focus": 0, + "gap": 0 + }, + "startArrowhead": null, + "endArrowhead": "triangle", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "tZBOdpedRmWRKxKHLhS_D", + "type": "text", + "x": 903.8082958729248, + "y": 545.3623084226089, + "width": 108.76792907714844, + "height": 21.6, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#f8f9fa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 70, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 1814362442, + "version": 31, + "versionNonce": 2097809866, + "isDeleted": false, + "boundElements": [], + "updated": 1767799463901, + "link": null, + "locked": false, + "text": "Add as context", + "fontSize": 16, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "U-X_4YpeMIFGjLeHshy6Q", + "originalText": "Add as context", + "autoResize": true, + "lineHeight": 1.35 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/copilot/images/test-driven-development-guide/tdd-implementation-diagram.png b/docs/copilot/images/test-driven-development-guide/tdd-implementation-diagram.png new file mode 100644 index 0000000000..98d91f16a4 --- /dev/null +++ b/docs/copilot/images/test-driven-development-guide/tdd-implementation-diagram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:324e43a160d98fd5edf0bb321b14ede3588e3ddf9669c02ac29091498a61ad1f +size 97197 diff --git a/docs/copilot/images/test-driven-development-guide/tdd-workflow-diagram.png b/docs/copilot/images/test-driven-development-guide/tdd-workflow-diagram.png deleted file mode 100644 index 179b86cd99..0000000000 --- a/docs/copilot/images/test-driven-development-guide/tdd-workflow-diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d133d4d8c55ae2b9995c5f722b4588ecd5fdb0488a95f2054dbbf44fa1b0835 -size 26573