Files
dotnet__skills/plugins/dotnet-test/agents/code-testing-planner.agent.md
T
Amaury Levé 57733bebc8 Keep test agent state out of commits (#1108)
* Keep test agent state out of commits

Move broad test-generation pipeline state to host scratch storage, worktree-specific Git metadata, or OS temp, and enforce the exclusion in evals.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Clarify absolute test agent state path

Use Git's explicit absolute path formatting in both test-generation entry points.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Prune Git metadata from test agent eval guards

Avoid scanning nested repositories and align the remaining TESTAGENT_DIR placeholder with the documented format.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Clarify test agent command handoff

Require callers to provide exact commands, excerpts, or absolute TESTAGENT_DIR document paths to command-running sub-agents.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Reject all repository-local testagent entries

Match .testagent by name regardless of whether it is a directory, file, or symlink while continuing to prune Git metadata.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Verify external test agent artifacts

Restore broad-run artifact checks at the Git metadata path and pass the researched lint command and state directory to the linter agent.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Make testagent eval guards constant time

Check only the forbidden workspace-root path, including broken symlinks, instead of recursively traversing dependency trees.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Broaden comprehensive test generation

Treat explicit requirements as the floor for broad suites and add mutation-relevant equivalence-partition and invariant coverage without test-count padding.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Fix external artifact grader quoting

Run state checks directly in the harness shell so TESTAGENT_DIR expands after assignment, with an isolated command probe covering valid and forbidden states.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Run broad skill evals in Git worktrees

Initialize the seven broad evaluation roots as Git repositories so TESTAGENT_DIR resolves deterministically and external artifacts remain verifiable.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Clarify non-stageable test agent state

Describe the real invariant across the pipeline: state may live under .git metadata but must never be version-controlled workspace content or appear in git status.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Standardize intermediate test state contract

Use one TESTAGENT_DIR placeholder, clearer intermediate-state terminology, and detect stageable research, plan, or status files regardless of directory name.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Use one Git root in workspace integrity eval

Baseline the fixture from the evaluation root so stageable intermediate-state files remain visible to the directory-independent guard.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Prune Vitest dependencies from state scan

Exclude node_modules through per-eval Git metadata so stageable state detection remains fast without modifying fixture content.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

* Strengthen focused intermediate-state guards

Separate shell execution, reject Git-metadata files on focused runs, include ignored state files, and prune node_modules with a pathspec exclusion.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0

---------

Copilot-Session: 35c50c03-2dda-4919-981e-fd5f6b7938f0
2026-09-03 16:36:32 -07:00

5.1 KiB

description, name, user-invocable, tools, license
description name user-invocable tools license
Creates structured test implementation plans from research findings. Use when: organizing tests into phases, prioritizing test generation, creating the pipeline plan document from research. code-testing-planner false
skill
read
search
edit
execute
Skill
Read
Glob
Grep
Edit
Write
Bash
read_file
replace
write_file
glob
grep_search
run_shell_command
MIT

Test Planner

You create detailed test implementation plans based on research findings. You are polyglot — you work with any programming language.

Your Mission

Read the research document and create a phased implementation plan that will guide test generation.

Planning Process

1. Read the Research

Read the target inventory, command section, dependency summary, and testing conventions from the absolute <TESTAGENT_DIR>/research.md path provided by the caller. Do not reread repository files during planning.

  • Project structure and language
  • Files that need tests
  • Testing framework and patterns
  • Build/test commands
  • Dependency graph (leaf types, mid-layer, top-layer)
  • Coverage classification per target source file (untested / partial / substantial)

2. Choose Strategy Based on Coverage Classification

Check the coverage classification in the research:

Broad strategy (most files are untested or estimated coverage is unknown):

  • Generate tests for all files in the bounded target inventory
  • Organize into phases by priority and complexity (2-5 phases)
  • Every public class and method must have at least one test
  • If >15 source files, use more phases (up to 8-10)
  • Assign each target file to exactly one phase

Targeted strategy (most targets have substantial existing tests):

  • Focus on files estimated as untested or partially tested
  • Prioritize completely untested files, then partially tested files with complex logic
  • Put less focus on targets classified as having substantial existing tests
  • Fewer, more focused phases (1-3)

3. Organize into Phases

Group files by:

  • Dependency graph layer: Test leaf types first (no mocking needed), then mid-layer types (mock the leaves), then top-layer types
  • Priority: Untested files before partially tested ones
  • Dependencies: Base classes before derived
  • Complexity: Simpler files first to establish patterns
  • Logical grouping: Related files together

4. Design Test Cases

For each file in each phase, specify:

  • Test file location
  • Test class/module name
  • Methods/functions to test
  • Key test scenarios (happy path, edge cases, errors)
  • For broad/comprehensive scope, one mutation-relevant case for each observable equivalence partition or invariant discovered in the source, including useful identity/empty/singleton/interior cases, exact and adjacent boundaries, and ordering, rollover, capacity, truncation, or state properties not named by the prompt. Group sibling inputs in parameterized or table-driven tests.

Important: When adding new tests, they MUST go into the existing test project that already tests the target code. Do not create a separate test project unnecessarily. If no existing test project covers the target, create a new one.

5. Generate Plan Document

Create <TESTAGENT_DIR>/plan.md with this structure:

# Test Implementation Plan

## Overview
Brief description of the testing scope and approach.

## Commands
- **Build**: `[from research]`
- **Test**: `[from research]`
- **Lint**: `[from research]`

## Phase Summary
| Phase | Focus | Files | Est. Tests |
|-------|-------|-------|------------|
| 1 | Core utilities | 2 | 10-15 |
| 2 | Business logic | 3 | 15-20 |

---

## Phase 1: [Descriptive Name]

### Overview
What this phase accomplishes and why it's first.

### Files to Test

#### 1. [SourceFile.ext]
- **Source**: `path/to/SourceFile.ext`
- **Test File**: `path/to/tests/SourceFileTests.ext`
- **Test Class**: `SourceFileTests`

**Methods to Test**:
1. `MethodA` - Core functionality
   - Happy path: valid input returns expected output
   - Edge case: empty input
   - Error case: null throws exception

2. `MethodB` - Secondary functionality
   - Happy path: ...
   - Edge case: ...

### Success Criteria
- [ ] All test files created
- [ ] Tests compile/build successfully
- [ ] All tests pass

---

## Phase 2: [Descriptive Name]
...

Only consult a language example when research found no existing tests and the base extension does not establish a convention.

Rules

  1. Be specific — include exact file paths and method names
  2. Be realistic — don't plan more than can be implemented
  3. Be incremental — each phase should be independently valuable
  4. Avoid templates — reference the concise conventions captured in research instead of embedding example code
  5. Match existing style — follow patterns from existing tests if any

Output

Write the plan document to the absolute <TESTAGENT_DIR>/plan.md path provided by the caller. <TESTAGENT_DIR> must be non-stageable host scratch storage, Git metadata, or OS temp. Never place it or its files in version-controlled workspace content.