[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-test-tagging":3,"mdc--strqb3-key":34,"related-repo-dotnet-test-tagging":3118,"related-org-dotnet-test-tagging":3223},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":29,"sourceUrl":32,"mdContent":33},"test-tagging","tag test suites with standardized traits","Analyzes test suites in any language and tags each test with standardized traits (positive, negative, critical-path, boundary, smoke, regression, integration, performance, security). Use when the user wants to categorize, audit, or label tests with traits. Works across .NET (MSTest\u002FxUnit\u002FNUnit\u002FTUnit), Python (pytest), TS\u002FJS (Jest\u002FVitest), Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, and C++ — auto-editing when the framework has canonical tag syntax, otherwise report-only. Do not use for writing new tests, running tests, or migrating frameworks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19],{"name":13,"slug":14,"type":15},"QA","qa","tag",{"name":17,"slug":18,"type":15},"Code Analysis","code-analysis",{"name":20,"slug":21,"type":15},"Testing","testing",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-12T08:23:39.473743","MIT",332,[28],"agent-skills",{"repoUrl":23,"stars":22,"forks":26,"topics":30,"description":31},[28],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-test\u002Fskills\u002Ftest-tagging","---\nname: test-tagging\ndescription: \"Analyzes test suites in any language and tags each test with standardized traits (positive, negative, critical-path, boundary, smoke, regression, integration, performance, security). Use when the user wants to categorize, audit, or label tests with traits. Works across .NET (MSTest\u002FxUnit\u002FNUnit\u002FTUnit), Python (pytest), TS\u002FJS (Jest\u002FVitest), Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, and C++ — auto-editing when the framework has canonical tag syntax, otherwise report-only. Do not use for writing new tests, running tests, or migrating frameworks.\"\nlicense: MIT\n---\n\n# Test Trait Tagging\n\nAnalyze an existing test suite in any supported language and apply a standardized set of trait tags to each test method, giving teams visibility into their test distribution (positive vs. negative, critical-path coverage, smoke tests, etc.).\n\n> **Language-specific guidance**: Call the `test-analysis-extensions` skill to discover available extension files, then read the file matching the target codebase. The extension file documents framework-specific tag attributes and a \"tag-support capability\" (auto-edit, report-only, or convention-based) that drives whether this skill modifies source files or only emits a report.\n\n## When to Use\n\n- Auditing a test project to understand the mix of test types\n- Adding trait attributes to untagged tests\n- Generating a summary report of trait distribution across a test suite\n- Reviewing whether critical paths have sufficient coverage\n\n## When Not to Use\n\n- Writing new tests from scratch (use `code-testing-agent` for any language, or `writing-mstest-tests` for MSTest)\n- Running or filtering tests (use `run-tests` for .NET; equivalent native runners elsewhere)\n- Migrating between test frameworks\n\n## Inputs\n\n| Input | Required | Description |\n|-------|----------|-------------|\n| Test project or files | Yes | Path to the test project, folder, or specific test files to analyze |\n| Scope | No | `tag` (apply attributes when language supports auto-edit), `audit` (report only), or `both` (default: `both`). For languages with no canonical tag syntax, the skill emits a report regardless of scope. |\n| Framework | No | Auto-detected. Override when detection fails. |\n\n## Trait Taxonomy\n\nUse exactly these trait names and values. Do not invent new trait values outside this table.\n\n| Trait Value | Meaning | Heuristics |\n|-------------|---------|------------|\n| `positive` | Verifies expected behavior under normal\u002Fvalid conditions | Asserts success, valid output, expected state, no exceptions for valid input |\n| `negative` | Verifies correct handling of invalid input, errors, or edge cases | Asserts exceptions, error codes, validation failures, rejects bad input |\n| `boundary` | Tests limits, thresholds, empty\u002Fnull\u002FNone\u002Fnil inputs, min\u002Fmax values | Operates on `0`, `-1`, `int.MaxValue` \u002F `sys.maxsize` \u002F `Number.MAX_SAFE_INTEGER` \u002F `math.MaxInt64` \u002F `i32::MAX`, empty string, null\u002FNone\u002Fnil\u002Fundefined, empty collection, boundary of valid range |\n| `critical-path` | Core workflow that must never break; breakage blocks users | Tests the primary success scenario of a key public API or user-facing feature |\n| `smoke` | Quick sanity check that the system is operational | Fast, no complex setup, verifies basic wiring (e.g., service resolves, endpoint returns 200) |\n| `regression` | Reproduces a specific previously-reported bug | References a bug ID, issue number, or describes a fix in its name or comments |\n| `integration` | Crosses process, network, or persistence boundaries | Uses real database, HTTP client, file system, external service, or multi-component setup |\n| `end-to-end` | Full user workflow spanning the entire application stack | Exercises a complete scenario from entry point to final result, distinct from single-boundary `integration` |\n| `performance` | Validates timing, throughput, or resource consumption | Asserts on elapsed time, memory, allocations, or uses benchmark harness (BenchmarkDotNet, pytest-benchmark, benchmark.js, JMH, `go test -bench`, criterion.rs, XCTMetric, kotlinx-benchmark, Google Benchmark) |\n| `security` | Verifies authentication, authorization, input sanitization, or secrets handling | Tests for SQL injection, XSS, CSRF, unauthorized access, token validation, permission checks |\n| `concurrency` | Validates thread safety, parallelism, or async correctness | Uses `Task.WhenAll` \u002F `Parallel.ForEach` \u002F `SemaphoreSlim` (.NET); `asyncio.gather` \u002F `threading.Lock` \u002F `multiprocessing` (Python); `Promise.all` \u002F worker threads (JS\u002FTS); `CompletableFuture` \u002F `ExecutorService` \u002F `synchronized` (Java); `go func` \u002F `sync.WaitGroup` \u002F `sync.Mutex` \u002F `chan` (Go); `Mutex` \u002F `Thread.new` (Ruby); `tokio::spawn` \u002F `Arc\u003CMutex\u003C_>>` \u002F `crossbeam` (Rust); `DispatchQueue` \u002F `actor` (Swift); `coroutineScope` \u002F `Mutex` (Kotlin); `Start-Job` \u002F `RunspacePool` (PowerShell); `std::thread` \u002F `std::mutex` (C++); reproduces race conditions |\n| `resilience` | Tests retry logic, timeouts, circuit breakers, or graceful degradation | Asserts behavior under transient failures, network drops, or service unavailability (e.g., Polly, tenacity, p-retry, resilience4j, hystrix, opossum, retry-go) |\n| `destructive` | Mutates shared or external state that is hard to roll back | Deletes records, drops resources, modifies global config -- useful for CI isolation decisions |\n| `configuration` | Verifies settings loading, defaults, environment behavior | Tests missing config keys, invalid values, environment variable fallbacks, options validation |\n| `flaky` | Known to intermittently fail (meta-tag for test health tracking) | Mark tests the team knows are unreliable; used to quarantine or prioritize stabilization |\n\nA single test may have **multiple traits** (e.g., both `negative` and `boundary`). At minimum, every test should receive one of `positive` or `negative`.\n\n## Workflow\n\n### Step 1: Detect the language, framework, and tagging capability\n\nIdentify the codebase's language and test framework. Call the `test-analysis-extensions` skill and read the matching extension file. The extension file declares a **tag-support capability** for each framework:\n\n- **`auto-edit`** — framework has canonical tag syntax this skill can safely insert (.NET `[TestCategory]` \u002F `[Trait]` \u002F `[Category]` \u002F `[Property]`, pytest `@pytest.mark.\u003Cname>`, JUnit 5 `@Tag(\"...\")`, TestNG `groups = {\"...\"}`, RSpec metadata `it \"...\" , :tag => true`, Pester `-Tag '...'`, Kotest `@Tags(...)`, Swift Testing `@Tag(.tagName)`, Catch2 `[tag]`, doctest `* doctest::test_suite(\"tag\")` decorator).\n- **`report-only`** — framework has no canonical, agreed-upon tag attribute; report tags in a Markdown table only and do not edit source (Go standard `testing` without build-tag conventions, Jest\u002FVitest without consistent describe-prefix convention, Rust without project-specific cfg conventions, XCTest without a test plan, GoogleTest without test-name prefix conventions, Mocha without describe-prefix conventions).\n- **`convention-based`** — framework uses naming or file conventions for tagging (Go `\u002F\u002Fgo:build integration` build tags, file-name suffixes like `*_integration_test.go`, GoogleTest `INTEGRATION_*` filter prefix). Only emit canonical edits when the user has confirmed the project convention; otherwise treat as `report-only`.\n\nCapture the capability before Step 4.\n\n### Step 2: Scan existing traits\n\nCheck which tests already have trait attributes. Use the loaded language extension as the source of truth — examples:\n\n| Framework | Existing Attribute | Example |\n|-----------|--------------------|---------|\n| MSTest | `[TestCategory(\"...\")]` | `[TestCategory(\"positive\")]` |\n| xUnit | `[Trait(\"Category\", \"...\")]` | `[Trait(\"Category\", \"positive\")]` |\n| NUnit | `[Category(\"...\")]` | `[Category(\"positive\")]` |\n| TUnit | `[Property(\"Category\", \"...\")]` | `[Property(\"Category\", \"positive\")]` |\n| JUnit 5 | `@Tag(\"...\")` | `@Tag(\"positive\")` |\n| TestNG | `@Test(groups = {\"...\"})` | `@Test(groups = {\"positive\"})` |\n| pytest | `@pytest.mark.\u003Cname>` | `@pytest.mark.positive` |\n| RSpec | metadata after `it` | `it \"...\", :positive do` |\n| Pester | `-Tag '...'` | `It '...' -Tag 'positive'` |\n| Kotest | `@Tags(...)` | `@Tags(Positive)` |\n| Swift Testing | `@Tag(.\u003Cname>)` | `@Test(.tags(.positive))` |\n| Catch2 | `[tag]` in name | `TEST_CASE(\"...\", \"[positive]\")` |\n| doctest | `* doctest::test_suite(\"...\")` decorator | `TEST_CASE(\"...\" *doctest::test_suite(\"positive\"))` |\n\nRecord which tests already have tags to avoid duplication.\n\n### Step 3: Classify each test method\n\nFor each test method without traits, analyze:\n\n1. **Method name** -- names containing `Invalid`, `Fail`, `Error`, `Throw`, `Reject`, `BadInput`, `Null`, `None`, `Nil`, `Negative`, `raises_`, `_throws_`, `_returns_error` suggest `negative`\n2. **Assertion type** -- `Assert.ThrowsException` \u002F `Assert.Throws` \u002F `Should().Throw()` \u002F `pytest.raises` \u002F `expect(fn).toThrow` \u002F `assertThrows` \u002F `assert.Error(t, err)` \u002F `expect { ... }.to raise_error` \u002F `#[should_panic]` \u002F `XCTAssertThrowsError` \u002F `Should -Throw` \u002F `EXPECT_THROW` suggest `negative`\n3. **Input values** -- `null` \u002F `None` \u002F `nil` \u002F `undefined`, `\"\"`, `0`, `-1`, `int.MaxValue` \u002F `sys.maxsize` \u002F `Number.MAX_SAFE_INTEGER` \u002F `math.MaxInt64` \u002F `i32::MAX`, empty collections suggest `boundary`\n4. **Setup complexity** -- minimal setup with basic assertions suggests `smoke`; external dependencies (file\u002Fdb\u002Fnet\u002Fenv) suggest `integration`\n5. **Comments and names** -- references to issue numbers or \"regression\" \u002F \"bug\" \u002F \"fix for #...\" suggest `regression`\n6. **Timing assertions** -- `Stopwatch`, `BenchmarkDotNet`, elapsed-time checks; pytest-benchmark fixtures; benchmark.js; JMH `@Benchmark`; `go test -bench`; criterion.rs; XCTMetric; Google Benchmark; kotlinx-benchmark suggest `performance`\n7. **Feature centrality** -- tests on primary public API entry points or critical user workflows suggest `critical-path`\n8. **Security patterns** -- validates auth, checks permissions, sanitizes input, tests for injection, handles tokens\u002Fsecrets suggest `security`\n9. **Parallel\u002Fasync constructs** -- per-language concurrency primitives (see Trait Taxonomy table) suggest `concurrency`\n10. **Fault injection** -- simulates failures, tests retries, timeouts, or circuit breakers suggest `resilience`\n11. **State mutation** -- deletes external records, drops resources, modifies shared\u002Fglobal state suggest `destructive`\n12. **Full-stack flow** -- test spans entry point through data layer to final response, covering a complete user scenario suggest `end-to-end`\n13. **Config\u002Fsettings** -- loads configuration, tests missing keys, validates options, checks environment variables suggest `configuration`\n14. **Known instability** -- test has skip \u002F ignore annotations with comments about flakiness, or names contain \"flaky\" \u002F \"intermittent\" suggest `flaky`\n15. **Default** -- if the test verifies a normal success path, tag `positive`\n\nWhen in doubt between `positive` and `negative`, read the assertion: if it asserts success -> `positive`; if it asserts failure -> `negative`.\n\n### Step 4: Apply trait attributes (or report only)\n\n**If the loaded language extension declares `auto-edit` for the framework**, add the appropriate attribute to each test method. Place trait attributes adjacent to the existing test attribute. Examples:\n\n**MSTest:**\n```csharp\n[TestMethod]\n[TestCategory(\"negative\")]\n[TestCategory(\"boundary\")]\npublic void Parse_NullInput_ThrowsArgumentNullException() { ... }\n```\n\n**xUnit:**\n```csharp\n[Fact]\n[Trait(\"Category\", \"positive\")]\n[Trait(\"Category\", \"critical-path\")]\npublic void CreateOrder_ValidItems_ReturnsConfirmation() { ... }\n```\n\n**NUnit:**\n```csharp\n[Test]\n[Category(\"regression\")]\n[Category(\"negative\")]\npublic void Calculate_OverflowInput_ReturnsError() \u002F\u002F Fix for #1234\n{ ... }\n```\n\n**pytest:**\n```python\n@pytest.mark.negative\n@pytest.mark.boundary\ndef test_parse_none_input_raises_value_error():\n    ...\n```\n\n**JUnit 5:**\n```java\n@Test\n@Tag(\"positive\")\n@Tag(\"critical-path\")\nvoid createOrder_validItems_returnsConfirmation() { ... }\n```\n\n**TestNG:**\n```java\n@Test(groups = {\"negative\", \"boundary\"})\npublic void parse_nullInput_throwsIllegalArgumentException() { ... }\n```\n\n**RSpec:**\n```ruby\nit \"rejects null input\", :negative, :boundary do\n  ...\nend\n```\n\n**Pester:**\n```powershell\nIt 'Rejects null input' -Tag 'negative','boundary' {\n    ...\n}\n```\n\n**Kotest:**\n```kotlin\n@Tags(Negative, Boundary)\nclass ParserSpec : StringSpec({\n    \"rejects null input\" { ... }\n})\n```\n\n**Swift Testing:**\n```swift\n@Test(.tags(.negative, .boundary))\nfunc parseNullInputThrows() throws { ... }\n```\n\n**Catch2:**\n```cpp\nTEST_CASE(\"Parse null input throws\", \"[negative][boundary]\") { ... }\n```\n\n**If the loaded language extension declares `report-only` for the framework** (Go standard `testing`, plain Jest\u002FVitest without convention, Rust without project-specific cfg, plain XCTest, plain GoogleTest, plain Mocha), do NOT modify source files. Instead emit a Markdown table mapping each test to its suggested tags, and recommend a project-wide convention the team can adopt (build tags, file suffix, describe-block prefix, GoogleTest filter prefix, test-plan grouping, etc.).\n\n**If the loaded language extension declares `convention-based`** (e.g., Go `\u002F\u002Fgo:build integration`, `*_integration_test.go`, GoogleTest `INTEGRATION_*` prefix), only emit canonical edits when the user has confirmed the project's convention. Otherwise treat as `report-only`.\n\n### Step 5: Generate trait summary\n\nAfter tagging, produce a summary table:\n\n```\n## Trait Distribution\n\n| Trait         | Count | % of Total |\n|---------------|-------|------------|\n| positive      |    42 |      53.8% |\n| negative      |    22 |      28.2% |\n| boundary      |     8 |      10.3% |\n| critical-path |    12 |      15.4% |\n| smoke         |     3 |       3.8% |\n| regression    |     5 |       6.4% |\n| integration   |     4 |       5.1% |\n| end-to-end    |     2 |       2.6% |\n| performance   |     1 |       1.3% |\n| security      |     3 |       3.8% |\n| concurrency   |     2 |       2.6% |\n| resilience    |     1 |       1.3% |\n| destructive   |     1 |       1.3% |\n| configuration |     2 |       2.6% |\n| flaky         |     1 |       1.3% |\n| **Total tests** | **78** | -- |\n\nNote: Percentages exceed 100% because tests can have multiple traits.\n```\n\nInclude observations such as:\n- Ratio of positive to negative tests\n- Whether critical-path tests exist for key public APIs\n- Any tests that could not be confidently classified (list them for manual review)\n\n## Validation\n\n- [ ] Every test method has at least one trait classification (`positive` or `negative` at minimum) — in the report for `report-only` frameworks, or as an attribute for `auto-edit` frameworks\n- [ ] No invented trait values outside the taxonomy table\n- [ ] Existing trait attributes were preserved, not duplicated\n- [ ] The trait summary table was generated\n- [ ] For `auto-edit` frameworks, the project still builds \u002F tests still discover after changes (`dotnet build` \u002F `pytest --collect-only` \u002F `mvn test-compile` \u002F `go vet .\u002F...` \u002F `cargo check --tests` \u002F `npm run test:list` \u002F `Invoke-Pester -PassThru -Skip` \u002F equivalent)\n- [ ] For `report-only` frameworks, no source files were modified\n- [ ] For `convention-based` frameworks, edits were applied ONLY when a project convention was confirmed\n\n## Common Pitfalls\n\n| Pitfall | Solution |\n|---------|----------|\n| Guessing traits without reading the test body | Always read assertions and setup to classify accurately |\n| Tagging a test only as `boundary` without `positive`\u002F`negative` | Every test should also be `positive` or `negative` -- `boundary` is additive |\n| Using the wrong attribute syntax for the detected framework | Match the attribute style to the loaded language extension (don't put `[TestCategory]` in an xUnit project or `@pytest.mark.x` in a unittest test) |\n| Duplicating an existing category attribute | Check for pre-existing traits in Step 2 before adding |\n| Over-tagging as `critical-path` | Reserve for tests on primary public entry points, not every helper |\n| Editing Go \u002F plain Jest \u002F plain Rust \u002F plain XCTest \u002F plain GoogleTest source | These are `report-only` by default — emit a Markdown table instead. Only edit if the user confirms a project-wide convention (build tag, file suffix, describe-prefix, test-plan grouping). |\n| Inventing tag prefixes for convention-based frameworks | Confirm the project's existing convention before adopting one — don't guess between `_integration_test.go`, `\u002F\u002Fgo:build integration`, or `IntegrationTest` prefix |\n| Missing language-specific concurrency \u002F async primitives | Each language has its own primitives — read the loaded language extension and the Trait Taxonomy concurrency row before classifying as `concurrency` |\n",{"data":35,"body":36},{"name":4,"description":6,"license":25},{"type":37,"children":38},"root",[39,48,54,78,85,110,116,158,164,278,284,289,910,950,956,963,982,1165,1170,1176,1181,1546,1551,1557,1562,2079,2110,2116,2133,2141,2190,2198,2237,2245,2293,2301,2342,2350,2391,2399,2422,2430,2463,2471,2503,2511,2552,2560,2585,2593,2609,2631,2670,2676,2681,2691,2696,2714,2720,2888,2894,3112],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"test-trait-tagging",[45],{"type":46,"value":47},"text","Test Trait Tagging",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52],{"type":46,"value":53},"Analyze an existing test suite in any supported language and apply a standardized set of trait tags to each test method, giving teams visibility into their test distribution (positive vs. negative, critical-path coverage, smoke tests, etc.).",{"type":40,"tag":55,"props":56,"children":57},"blockquote",{},[58],{"type":40,"tag":49,"props":59,"children":60},{},[61,67,69,76],{"type":40,"tag":62,"props":63,"children":64},"strong",{},[65],{"type":46,"value":66},"Language-specific guidance",{"type":46,"value":68},": Call the ",{"type":40,"tag":70,"props":71,"children":73},"code",{"className":72},[],[74],{"type":46,"value":75},"test-analysis-extensions",{"type":46,"value":77}," skill to discover available extension files, then read the file matching the target codebase. The extension file documents framework-specific tag attributes and a \"tag-support capability\" (auto-edit, report-only, or convention-based) that drives whether this skill modifies source files or only emits a report.",{"type":40,"tag":79,"props":80,"children":82},"h2",{"id":81},"when-to-use",[83],{"type":46,"value":84},"When to Use",{"type":40,"tag":86,"props":87,"children":88},"ul",{},[89,95,100,105],{"type":40,"tag":90,"props":91,"children":92},"li",{},[93],{"type":46,"value":94},"Auditing a test project to understand the mix of test types",{"type":40,"tag":90,"props":96,"children":97},{},[98],{"type":46,"value":99},"Adding trait attributes to untagged tests",{"type":40,"tag":90,"props":101,"children":102},{},[103],{"type":46,"value":104},"Generating a summary report of trait distribution across a test suite",{"type":40,"tag":90,"props":106,"children":107},{},[108],{"type":46,"value":109},"Reviewing whether critical paths have sufficient coverage",{"type":40,"tag":79,"props":111,"children":113},{"id":112},"when-not-to-use",[114],{"type":46,"value":115},"When Not to Use",{"type":40,"tag":86,"props":117,"children":118},{},[119,140,153],{"type":40,"tag":90,"props":120,"children":121},{},[122,124,130,132,138],{"type":46,"value":123},"Writing new tests from scratch (use ",{"type":40,"tag":70,"props":125,"children":127},{"className":126},[],[128],{"type":46,"value":129},"code-testing-agent",{"type":46,"value":131}," for any language, or ",{"type":40,"tag":70,"props":133,"children":135},{"className":134},[],[136],{"type":46,"value":137},"writing-mstest-tests",{"type":46,"value":139}," for MSTest)",{"type":40,"tag":90,"props":141,"children":142},{},[143,145,151],{"type":46,"value":144},"Running or filtering tests (use ",{"type":40,"tag":70,"props":146,"children":148},{"className":147},[],[149],{"type":46,"value":150},"run-tests",{"type":46,"value":152}," for .NET; equivalent native runners elsewhere)",{"type":40,"tag":90,"props":154,"children":155},{},[156],{"type":46,"value":157},"Migrating between test frameworks",{"type":40,"tag":79,"props":159,"children":161},{"id":160},"inputs",[162],{"type":46,"value":163},"Inputs",{"type":40,"tag":165,"props":166,"children":167},"table",{},[168,192],{"type":40,"tag":169,"props":170,"children":171},"thead",{},[172],{"type":40,"tag":173,"props":174,"children":175},"tr",{},[176,182,187],{"type":40,"tag":177,"props":178,"children":179},"th",{},[180],{"type":46,"value":181},"Input",{"type":40,"tag":177,"props":183,"children":184},{},[185],{"type":46,"value":186},"Required",{"type":40,"tag":177,"props":188,"children":189},{},[190],{"type":46,"value":191},"Description",{"type":40,"tag":193,"props":194,"children":195},"tbody",{},[196,215,261],{"type":40,"tag":173,"props":197,"children":198},{},[199,205,210],{"type":40,"tag":200,"props":201,"children":202},"td",{},[203],{"type":46,"value":204},"Test project or files",{"type":40,"tag":200,"props":206,"children":207},{},[208],{"type":46,"value":209},"Yes",{"type":40,"tag":200,"props":211,"children":212},{},[213],{"type":46,"value":214},"Path to the test project, folder, or specific test files to analyze",{"type":40,"tag":173,"props":216,"children":217},{},[218,223,228],{"type":40,"tag":200,"props":219,"children":220},{},[221],{"type":46,"value":222},"Scope",{"type":40,"tag":200,"props":224,"children":225},{},[226],{"type":46,"value":227},"No",{"type":40,"tag":200,"props":229,"children":230},{},[231,236,238,244,246,252,254,259],{"type":40,"tag":70,"props":232,"children":234},{"className":233},[],[235],{"type":46,"value":15},{"type":46,"value":237}," (apply attributes when language supports auto-edit), ",{"type":40,"tag":70,"props":239,"children":241},{"className":240},[],[242],{"type":46,"value":243},"audit",{"type":46,"value":245}," (report only), or ",{"type":40,"tag":70,"props":247,"children":249},{"className":248},[],[250],{"type":46,"value":251},"both",{"type":46,"value":253}," (default: ",{"type":40,"tag":70,"props":255,"children":257},{"className":256},[],[258],{"type":46,"value":251},{"type":46,"value":260},"). For languages with no canonical tag syntax, the skill emits a report regardless of scope.",{"type":40,"tag":173,"props":262,"children":263},{},[264,269,273],{"type":40,"tag":200,"props":265,"children":266},{},[267],{"type":46,"value":268},"Framework",{"type":40,"tag":200,"props":270,"children":271},{},[272],{"type":46,"value":227},{"type":40,"tag":200,"props":274,"children":275},{},[276],{"type":46,"value":277},"Auto-detected. Override when detection fails.",{"type":40,"tag":79,"props":279,"children":281},{"id":280},"trait-taxonomy",[282],{"type":46,"value":283},"Trait Taxonomy",{"type":40,"tag":49,"props":285,"children":286},{},[287],{"type":46,"value":288},"Use exactly these trait names and values. Do not invent new trait values outside this table.",{"type":40,"tag":165,"props":290,"children":291},{},[292,313],{"type":40,"tag":169,"props":293,"children":294},{},[295],{"type":40,"tag":173,"props":296,"children":297},{},[298,303,308],{"type":40,"tag":177,"props":299,"children":300},{},[301],{"type":46,"value":302},"Trait Value",{"type":40,"tag":177,"props":304,"children":305},{},[306],{"type":46,"value":307},"Meaning",{"type":40,"tag":177,"props":309,"children":310},{},[311],{"type":46,"value":312},"Heuristics",{"type":40,"tag":193,"props":314,"children":315},{},[316,338,360,434,456,478,500,522,549,579,601,822,844,866,888],{"type":40,"tag":173,"props":317,"children":318},{},[319,328,333],{"type":40,"tag":200,"props":320,"children":321},{},[322],{"type":40,"tag":70,"props":323,"children":325},{"className":324},[],[326],{"type":46,"value":327},"positive",{"type":40,"tag":200,"props":329,"children":330},{},[331],{"type":46,"value":332},"Verifies expected behavior under normal\u002Fvalid conditions",{"type":40,"tag":200,"props":334,"children":335},{},[336],{"type":46,"value":337},"Asserts success, valid output, expected state, no exceptions for valid input",{"type":40,"tag":173,"props":339,"children":340},{},[341,350,355],{"type":40,"tag":200,"props":342,"children":343},{},[344],{"type":40,"tag":70,"props":345,"children":347},{"className":346},[],[348],{"type":46,"value":349},"negative",{"type":40,"tag":200,"props":351,"children":352},{},[353],{"type":46,"value":354},"Verifies correct handling of invalid input, errors, or edge cases",{"type":40,"tag":200,"props":356,"children":357},{},[358],{"type":46,"value":359},"Asserts exceptions, error codes, validation failures, rejects bad input",{"type":40,"tag":173,"props":361,"children":362},{},[363,372,377],{"type":40,"tag":200,"props":364,"children":365},{},[366],{"type":40,"tag":70,"props":367,"children":369},{"className":368},[],[370],{"type":46,"value":371},"boundary",{"type":40,"tag":200,"props":373,"children":374},{},[375],{"type":46,"value":376},"Tests limits, thresholds, empty\u002Fnull\u002FNone\u002Fnil inputs, min\u002Fmax values",{"type":40,"tag":200,"props":378,"children":379},{},[380,382,388,390,396,397,403,405,411,412,418,419,425,426,432],{"type":46,"value":381},"Operates on ",{"type":40,"tag":70,"props":383,"children":385},{"className":384},[],[386],{"type":46,"value":387},"0",{"type":46,"value":389},", ",{"type":40,"tag":70,"props":391,"children":393},{"className":392},[],[394],{"type":46,"value":395},"-1",{"type":46,"value":389},{"type":40,"tag":70,"props":398,"children":400},{"className":399},[],[401],{"type":46,"value":402},"int.MaxValue",{"type":46,"value":404}," \u002F ",{"type":40,"tag":70,"props":406,"children":408},{"className":407},[],[409],{"type":46,"value":410},"sys.maxsize",{"type":46,"value":404},{"type":40,"tag":70,"props":413,"children":415},{"className":414},[],[416],{"type":46,"value":417},"Number.MAX_SAFE_INTEGER",{"type":46,"value":404},{"type":40,"tag":70,"props":420,"children":422},{"className":421},[],[423],{"type":46,"value":424},"math.MaxInt64",{"type":46,"value":404},{"type":40,"tag":70,"props":427,"children":429},{"className":428},[],[430],{"type":46,"value":431},"i32::MAX",{"type":46,"value":433},", empty string, null\u002FNone\u002Fnil\u002Fundefined, empty collection, boundary of valid range",{"type":40,"tag":173,"props":435,"children":436},{},[437,446,451],{"type":40,"tag":200,"props":438,"children":439},{},[440],{"type":40,"tag":70,"props":441,"children":443},{"className":442},[],[444],{"type":46,"value":445},"critical-path",{"type":40,"tag":200,"props":447,"children":448},{},[449],{"type":46,"value":450},"Core workflow that must never break; breakage blocks users",{"type":40,"tag":200,"props":452,"children":453},{},[454],{"type":46,"value":455},"Tests the primary success scenario of a key public API or user-facing feature",{"type":40,"tag":173,"props":457,"children":458},{},[459,468,473],{"type":40,"tag":200,"props":460,"children":461},{},[462],{"type":40,"tag":70,"props":463,"children":465},{"className":464},[],[466],{"type":46,"value":467},"smoke",{"type":40,"tag":200,"props":469,"children":470},{},[471],{"type":46,"value":472},"Quick sanity check that the system is operational",{"type":40,"tag":200,"props":474,"children":475},{},[476],{"type":46,"value":477},"Fast, no complex setup, verifies basic wiring (e.g., service resolves, endpoint returns 200)",{"type":40,"tag":173,"props":479,"children":480},{},[481,490,495],{"type":40,"tag":200,"props":482,"children":483},{},[484],{"type":40,"tag":70,"props":485,"children":487},{"className":486},[],[488],{"type":46,"value":489},"regression",{"type":40,"tag":200,"props":491,"children":492},{},[493],{"type":46,"value":494},"Reproduces a specific previously-reported bug",{"type":40,"tag":200,"props":496,"children":497},{},[498],{"type":46,"value":499},"References a bug ID, issue number, or describes a fix in its name or comments",{"type":40,"tag":173,"props":501,"children":502},{},[503,512,517],{"type":40,"tag":200,"props":504,"children":505},{},[506],{"type":40,"tag":70,"props":507,"children":509},{"className":508},[],[510],{"type":46,"value":511},"integration",{"type":40,"tag":200,"props":513,"children":514},{},[515],{"type":46,"value":516},"Crosses process, network, or persistence boundaries",{"type":40,"tag":200,"props":518,"children":519},{},[520],{"type":46,"value":521},"Uses real database, HTTP client, file system, external service, or multi-component setup",{"type":40,"tag":173,"props":523,"children":524},{},[525,534,539],{"type":40,"tag":200,"props":526,"children":527},{},[528],{"type":40,"tag":70,"props":529,"children":531},{"className":530},[],[532],{"type":46,"value":533},"end-to-end",{"type":40,"tag":200,"props":535,"children":536},{},[537],{"type":46,"value":538},"Full user workflow spanning the entire application stack",{"type":40,"tag":200,"props":540,"children":541},{},[542,544],{"type":46,"value":543},"Exercises a complete scenario from entry point to final result, distinct from single-boundary ",{"type":40,"tag":70,"props":545,"children":547},{"className":546},[],[548],{"type":46,"value":511},{"type":40,"tag":173,"props":550,"children":551},{},[552,561,566],{"type":40,"tag":200,"props":553,"children":554},{},[555],{"type":40,"tag":70,"props":556,"children":558},{"className":557},[],[559],{"type":46,"value":560},"performance",{"type":40,"tag":200,"props":562,"children":563},{},[564],{"type":46,"value":565},"Validates timing, throughput, or resource consumption",{"type":40,"tag":200,"props":567,"children":568},{},[569,571,577],{"type":46,"value":570},"Asserts on elapsed time, memory, allocations, or uses benchmark harness (BenchmarkDotNet, pytest-benchmark, benchmark.js, JMH, ",{"type":40,"tag":70,"props":572,"children":574},{"className":573},[],[575],{"type":46,"value":576},"go test -bench",{"type":46,"value":578},", criterion.rs, XCTMetric, kotlinx-benchmark, Google Benchmark)",{"type":40,"tag":173,"props":580,"children":581},{},[582,591,596],{"type":40,"tag":200,"props":583,"children":584},{},[585],{"type":40,"tag":70,"props":586,"children":588},{"className":587},[],[589],{"type":46,"value":590},"security",{"type":40,"tag":200,"props":592,"children":593},{},[594],{"type":46,"value":595},"Verifies authentication, authorization, input sanitization, or secrets handling",{"type":40,"tag":200,"props":597,"children":598},{},[599],{"type":46,"value":600},"Tests for SQL injection, XSS, CSRF, unauthorized access, token validation, permission checks",{"type":40,"tag":173,"props":602,"children":603},{},[604,613,618],{"type":40,"tag":200,"props":605,"children":606},{},[607],{"type":40,"tag":70,"props":608,"children":610},{"className":609},[],[611],{"type":46,"value":612},"concurrency",{"type":40,"tag":200,"props":614,"children":615},{},[616],{"type":46,"value":617},"Validates thread safety, parallelism, or async correctness",{"type":40,"tag":200,"props":619,"children":620},{},[621,623,629,630,636,637,643,645,651,652,658,659,665,667,673,675,681,682,688,689,695,697,703,704,710,711,717,718,724,726,732,733,739,741,747,748,754,755,761,763,769,770,776,778,784,785,790,792,798,799,805,807,813,814,820],{"type":46,"value":622},"Uses ",{"type":40,"tag":70,"props":624,"children":626},{"className":625},[],[627],{"type":46,"value":628},"Task.WhenAll",{"type":46,"value":404},{"type":40,"tag":70,"props":631,"children":633},{"className":632},[],[634],{"type":46,"value":635},"Parallel.ForEach",{"type":46,"value":404},{"type":40,"tag":70,"props":638,"children":640},{"className":639},[],[641],{"type":46,"value":642},"SemaphoreSlim",{"type":46,"value":644}," (.NET); ",{"type":40,"tag":70,"props":646,"children":648},{"className":647},[],[649],{"type":46,"value":650},"asyncio.gather",{"type":46,"value":404},{"type":40,"tag":70,"props":653,"children":655},{"className":654},[],[656],{"type":46,"value":657},"threading.Lock",{"type":46,"value":404},{"type":40,"tag":70,"props":660,"children":662},{"className":661},[],[663],{"type":46,"value":664},"multiprocessing",{"type":46,"value":666}," (Python); ",{"type":40,"tag":70,"props":668,"children":670},{"className":669},[],[671],{"type":46,"value":672},"Promise.all",{"type":46,"value":674}," \u002F worker threads (JS\u002FTS); ",{"type":40,"tag":70,"props":676,"children":678},{"className":677},[],[679],{"type":46,"value":680},"CompletableFuture",{"type":46,"value":404},{"type":40,"tag":70,"props":683,"children":685},{"className":684},[],[686],{"type":46,"value":687},"ExecutorService",{"type":46,"value":404},{"type":40,"tag":70,"props":690,"children":692},{"className":691},[],[693],{"type":46,"value":694},"synchronized",{"type":46,"value":696}," (Java); ",{"type":40,"tag":70,"props":698,"children":700},{"className":699},[],[701],{"type":46,"value":702},"go func",{"type":46,"value":404},{"type":40,"tag":70,"props":705,"children":707},{"className":706},[],[708],{"type":46,"value":709},"sync.WaitGroup",{"type":46,"value":404},{"type":40,"tag":70,"props":712,"children":714},{"className":713},[],[715],{"type":46,"value":716},"sync.Mutex",{"type":46,"value":404},{"type":40,"tag":70,"props":719,"children":721},{"className":720},[],[722],{"type":46,"value":723},"chan",{"type":46,"value":725}," (Go); ",{"type":40,"tag":70,"props":727,"children":729},{"className":728},[],[730],{"type":46,"value":731},"Mutex",{"type":46,"value":404},{"type":40,"tag":70,"props":734,"children":736},{"className":735},[],[737],{"type":46,"value":738},"Thread.new",{"type":46,"value":740}," (Ruby); ",{"type":40,"tag":70,"props":742,"children":744},{"className":743},[],[745],{"type":46,"value":746},"tokio::spawn",{"type":46,"value":404},{"type":40,"tag":70,"props":749,"children":751},{"className":750},[],[752],{"type":46,"value":753},"Arc\u003CMutex\u003C_>>",{"type":46,"value":404},{"type":40,"tag":70,"props":756,"children":758},{"className":757},[],[759],{"type":46,"value":760},"crossbeam",{"type":46,"value":762}," (Rust); ",{"type":40,"tag":70,"props":764,"children":766},{"className":765},[],[767],{"type":46,"value":768},"DispatchQueue",{"type":46,"value":404},{"type":40,"tag":70,"props":771,"children":773},{"className":772},[],[774],{"type":46,"value":775},"actor",{"type":46,"value":777}," (Swift); ",{"type":40,"tag":70,"props":779,"children":781},{"className":780},[],[782],{"type":46,"value":783},"coroutineScope",{"type":46,"value":404},{"type":40,"tag":70,"props":786,"children":788},{"className":787},[],[789],{"type":46,"value":731},{"type":46,"value":791}," (Kotlin); ",{"type":40,"tag":70,"props":793,"children":795},{"className":794},[],[796],{"type":46,"value":797},"Start-Job",{"type":46,"value":404},{"type":40,"tag":70,"props":800,"children":802},{"className":801},[],[803],{"type":46,"value":804},"RunspacePool",{"type":46,"value":806}," (PowerShell); ",{"type":40,"tag":70,"props":808,"children":810},{"className":809},[],[811],{"type":46,"value":812},"std::thread",{"type":46,"value":404},{"type":40,"tag":70,"props":815,"children":817},{"className":816},[],[818],{"type":46,"value":819},"std::mutex",{"type":46,"value":821}," (C++); reproduces race conditions",{"type":40,"tag":173,"props":823,"children":824},{},[825,834,839],{"type":40,"tag":200,"props":826,"children":827},{},[828],{"type":40,"tag":70,"props":829,"children":831},{"className":830},[],[832],{"type":46,"value":833},"resilience",{"type":40,"tag":200,"props":835,"children":836},{},[837],{"type":46,"value":838},"Tests retry logic, timeouts, circuit breakers, or graceful degradation",{"type":40,"tag":200,"props":840,"children":841},{},[842],{"type":46,"value":843},"Asserts behavior under transient failures, network drops, or service unavailability (e.g., Polly, tenacity, p-retry, resilience4j, hystrix, opossum, retry-go)",{"type":40,"tag":173,"props":845,"children":846},{},[847,856,861],{"type":40,"tag":200,"props":848,"children":849},{},[850],{"type":40,"tag":70,"props":851,"children":853},{"className":852},[],[854],{"type":46,"value":855},"destructive",{"type":40,"tag":200,"props":857,"children":858},{},[859],{"type":46,"value":860},"Mutates shared or external state that is hard to roll back",{"type":40,"tag":200,"props":862,"children":863},{},[864],{"type":46,"value":865},"Deletes records, drops resources, modifies global config -- useful for CI isolation decisions",{"type":40,"tag":173,"props":867,"children":868},{},[869,878,883],{"type":40,"tag":200,"props":870,"children":871},{},[872],{"type":40,"tag":70,"props":873,"children":875},{"className":874},[],[876],{"type":46,"value":877},"configuration",{"type":40,"tag":200,"props":879,"children":880},{},[881],{"type":46,"value":882},"Verifies settings loading, defaults, environment behavior",{"type":40,"tag":200,"props":884,"children":885},{},[886],{"type":46,"value":887},"Tests missing config keys, invalid values, environment variable fallbacks, options validation",{"type":40,"tag":173,"props":889,"children":890},{},[891,900,905],{"type":40,"tag":200,"props":892,"children":893},{},[894],{"type":40,"tag":70,"props":895,"children":897},{"className":896},[],[898],{"type":46,"value":899},"flaky",{"type":40,"tag":200,"props":901,"children":902},{},[903],{"type":46,"value":904},"Known to intermittently fail (meta-tag for test health tracking)",{"type":40,"tag":200,"props":906,"children":907},{},[908],{"type":46,"value":909},"Mark tests the team knows are unreliable; used to quarantine or prioritize stabilization",{"type":40,"tag":49,"props":911,"children":912},{},[913,915,920,922,927,929,934,936,941,943,948],{"type":46,"value":914},"A single test may have ",{"type":40,"tag":62,"props":916,"children":917},{},[918],{"type":46,"value":919},"multiple traits",{"type":46,"value":921}," (e.g., both ",{"type":40,"tag":70,"props":923,"children":925},{"className":924},[],[926],{"type":46,"value":349},{"type":46,"value":928}," and ",{"type":40,"tag":70,"props":930,"children":932},{"className":931},[],[933],{"type":46,"value":371},{"type":46,"value":935},"). At minimum, every test should receive one of ",{"type":40,"tag":70,"props":937,"children":939},{"className":938},[],[940],{"type":46,"value":327},{"type":46,"value":942}," or ",{"type":40,"tag":70,"props":944,"children":946},{"className":945},[],[947],{"type":46,"value":349},{"type":46,"value":949},".",{"type":40,"tag":79,"props":951,"children":953},{"id":952},"workflow",[954],{"type":46,"value":955},"Workflow",{"type":40,"tag":957,"props":958,"children":960},"h3",{"id":959},"step-1-detect-the-language-framework-and-tagging-capability",[961],{"type":46,"value":962},"Step 1: Detect the language, framework, and tagging capability",{"type":40,"tag":49,"props":964,"children":965},{},[966,968,973,975,980],{"type":46,"value":967},"Identify the codebase's language and test framework. Call the ",{"type":40,"tag":70,"props":969,"children":971},{"className":970},[],[972],{"type":46,"value":75},{"type":46,"value":974}," skill and read the matching extension file. The extension file declares a ",{"type":40,"tag":62,"props":976,"children":977},{},[978],{"type":46,"value":979},"tag-support capability",{"type":46,"value":981}," for each framework:",{"type":40,"tag":86,"props":983,"children":984},{},[985,1100,1121],{"type":40,"tag":90,"props":986,"children":987},{},[988,997,999,1005,1006,1012,1013,1019,1020,1026,1028,1034,1036,1042,1044,1050,1052,1058,1060,1066,1068,1074,1076,1082,1084,1090,1092,1098],{"type":40,"tag":62,"props":989,"children":990},{},[991],{"type":40,"tag":70,"props":992,"children":994},{"className":993},[],[995],{"type":46,"value":996},"auto-edit",{"type":46,"value":998}," — framework has canonical tag syntax this skill can safely insert (.NET ",{"type":40,"tag":70,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":46,"value":1004},"[TestCategory]",{"type":46,"value":404},{"type":40,"tag":70,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":46,"value":1011},"[Trait]",{"type":46,"value":404},{"type":40,"tag":70,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":46,"value":1018},"[Category]",{"type":46,"value":404},{"type":40,"tag":70,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":46,"value":1025},"[Property]",{"type":46,"value":1027},", pytest ",{"type":40,"tag":70,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":46,"value":1033},"@pytest.mark.\u003Cname>",{"type":46,"value":1035},", JUnit 5 ",{"type":40,"tag":70,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":46,"value":1041},"@Tag(\"...\")",{"type":46,"value":1043},", TestNG ",{"type":40,"tag":70,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":46,"value":1049},"groups = {\"...\"}",{"type":46,"value":1051},", RSpec metadata ",{"type":40,"tag":70,"props":1053,"children":1055},{"className":1054},[],[1056],{"type":46,"value":1057},"it \"...\" , :tag => true",{"type":46,"value":1059},", Pester ",{"type":40,"tag":70,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":46,"value":1065},"-Tag '...'",{"type":46,"value":1067},", Kotest ",{"type":40,"tag":70,"props":1069,"children":1071},{"className":1070},[],[1072],{"type":46,"value":1073},"@Tags(...)",{"type":46,"value":1075},", Swift Testing ",{"type":40,"tag":70,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":46,"value":1081},"@Tag(.tagName)",{"type":46,"value":1083},", Catch2 ",{"type":40,"tag":70,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":46,"value":1089},"[tag]",{"type":46,"value":1091},", doctest ",{"type":40,"tag":70,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":46,"value":1097},"* doctest::test_suite(\"tag\")",{"type":46,"value":1099}," decorator).",{"type":40,"tag":90,"props":1101,"children":1102},{},[1103,1112,1114,1119],{"type":40,"tag":62,"props":1104,"children":1105},{},[1106],{"type":40,"tag":70,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":46,"value":1111},"report-only",{"type":46,"value":1113}," — framework has no canonical, agreed-upon tag attribute; report tags in a Markdown table only and do not edit source (Go standard ",{"type":40,"tag":70,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":46,"value":21},{"type":46,"value":1120}," without build-tag conventions, Jest\u002FVitest without consistent describe-prefix convention, Rust without project-specific cfg conventions, XCTest without a test plan, GoogleTest without test-name prefix conventions, Mocha without describe-prefix conventions).",{"type":40,"tag":90,"props":1122,"children":1123},{},[1124,1133,1135,1141,1143,1149,1151,1157,1159,1164],{"type":40,"tag":62,"props":1125,"children":1126},{},[1127],{"type":40,"tag":70,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":46,"value":1132},"convention-based",{"type":46,"value":1134}," — framework uses naming or file conventions for tagging (Go ",{"type":40,"tag":70,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":46,"value":1140},"\u002F\u002Fgo:build integration",{"type":46,"value":1142}," build tags, file-name suffixes like ",{"type":40,"tag":70,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":46,"value":1148},"*_integration_test.go",{"type":46,"value":1150},", GoogleTest ",{"type":40,"tag":70,"props":1152,"children":1154},{"className":1153},[],[1155],{"type":46,"value":1156},"INTEGRATION_*",{"type":46,"value":1158}," filter prefix). Only emit canonical edits when the user has confirmed the project convention; otherwise treat as ",{"type":40,"tag":70,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":46,"value":1111},{"type":46,"value":949},{"type":40,"tag":49,"props":1166,"children":1167},{},[1168],{"type":46,"value":1169},"Capture the capability before Step 4.",{"type":40,"tag":957,"props":1171,"children":1173},{"id":1172},"step-2-scan-existing-traits",[1174],{"type":46,"value":1175},"Step 2: Scan existing traits",{"type":40,"tag":49,"props":1177,"children":1178},{},[1179],{"type":46,"value":1180},"Check which tests already have trait attributes. Use the loaded language extension as the source of truth — examples:",{"type":40,"tag":165,"props":1182,"children":1183},{},[1184,1204],{"type":40,"tag":169,"props":1185,"children":1186},{},[1187],{"type":40,"tag":173,"props":1188,"children":1189},{},[1190,1194,1199],{"type":40,"tag":177,"props":1191,"children":1192},{},[1193],{"type":46,"value":268},{"type":40,"tag":177,"props":1195,"children":1196},{},[1197],{"type":46,"value":1198},"Existing Attribute",{"type":40,"tag":177,"props":1200,"children":1201},{},[1202],{"type":46,"value":1203},"Example",{"type":40,"tag":193,"props":1205,"children":1206},{},[1207,1233,1259,1285,1311,1336,1362,1387,1415,1440,1465,1491,1518],{"type":40,"tag":173,"props":1208,"children":1209},{},[1210,1215,1224],{"type":40,"tag":200,"props":1211,"children":1212},{},[1213],{"type":46,"value":1214},"MSTest",{"type":40,"tag":200,"props":1216,"children":1217},{},[1218],{"type":40,"tag":70,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":46,"value":1223},"[TestCategory(\"...\")]",{"type":40,"tag":200,"props":1225,"children":1226},{},[1227],{"type":40,"tag":70,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":46,"value":1232},"[TestCategory(\"positive\")]",{"type":40,"tag":173,"props":1234,"children":1235},{},[1236,1241,1250],{"type":40,"tag":200,"props":1237,"children":1238},{},[1239],{"type":46,"value":1240},"xUnit",{"type":40,"tag":200,"props":1242,"children":1243},{},[1244],{"type":40,"tag":70,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":46,"value":1249},"[Trait(\"Category\", \"...\")]",{"type":40,"tag":200,"props":1251,"children":1252},{},[1253],{"type":40,"tag":70,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":46,"value":1258},"[Trait(\"Category\", \"positive\")]",{"type":40,"tag":173,"props":1260,"children":1261},{},[1262,1267,1276],{"type":40,"tag":200,"props":1263,"children":1264},{},[1265],{"type":46,"value":1266},"NUnit",{"type":40,"tag":200,"props":1268,"children":1269},{},[1270],{"type":40,"tag":70,"props":1271,"children":1273},{"className":1272},[],[1274],{"type":46,"value":1275},"[Category(\"...\")]",{"type":40,"tag":200,"props":1277,"children":1278},{},[1279],{"type":40,"tag":70,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":46,"value":1284},"[Category(\"positive\")]",{"type":40,"tag":173,"props":1286,"children":1287},{},[1288,1293,1302],{"type":40,"tag":200,"props":1289,"children":1290},{},[1291],{"type":46,"value":1292},"TUnit",{"type":40,"tag":200,"props":1294,"children":1295},{},[1296],{"type":40,"tag":70,"props":1297,"children":1299},{"className":1298},[],[1300],{"type":46,"value":1301},"[Property(\"Category\", \"...\")]",{"type":40,"tag":200,"props":1303,"children":1304},{},[1305],{"type":40,"tag":70,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":46,"value":1310},"[Property(\"Category\", \"positive\")]",{"type":40,"tag":173,"props":1312,"children":1313},{},[1314,1319,1327],{"type":40,"tag":200,"props":1315,"children":1316},{},[1317],{"type":46,"value":1318},"JUnit 5",{"type":40,"tag":200,"props":1320,"children":1321},{},[1322],{"type":40,"tag":70,"props":1323,"children":1325},{"className":1324},[],[1326],{"type":46,"value":1041},{"type":40,"tag":200,"props":1328,"children":1329},{},[1330],{"type":40,"tag":70,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":46,"value":1335},"@Tag(\"positive\")",{"type":40,"tag":173,"props":1337,"children":1338},{},[1339,1344,1353],{"type":40,"tag":200,"props":1340,"children":1341},{},[1342],{"type":46,"value":1343},"TestNG",{"type":40,"tag":200,"props":1345,"children":1346},{},[1347],{"type":40,"tag":70,"props":1348,"children":1350},{"className":1349},[],[1351],{"type":46,"value":1352},"@Test(groups = {\"...\"})",{"type":40,"tag":200,"props":1354,"children":1355},{},[1356],{"type":40,"tag":70,"props":1357,"children":1359},{"className":1358},[],[1360],{"type":46,"value":1361},"@Test(groups = {\"positive\"})",{"type":40,"tag":173,"props":1363,"children":1364},{},[1365,1370,1378],{"type":40,"tag":200,"props":1366,"children":1367},{},[1368],{"type":46,"value":1369},"pytest",{"type":40,"tag":200,"props":1371,"children":1372},{},[1373],{"type":40,"tag":70,"props":1374,"children":1376},{"className":1375},[],[1377],{"type":46,"value":1033},{"type":40,"tag":200,"props":1379,"children":1380},{},[1381],{"type":40,"tag":70,"props":1382,"children":1384},{"className":1383},[],[1385],{"type":46,"value":1386},"@pytest.mark.positive",{"type":40,"tag":173,"props":1388,"children":1389},{},[1390,1395,1406],{"type":40,"tag":200,"props":1391,"children":1392},{},[1393],{"type":46,"value":1394},"RSpec",{"type":40,"tag":200,"props":1396,"children":1397},{},[1398,1400],{"type":46,"value":1399},"metadata after ",{"type":40,"tag":70,"props":1401,"children":1403},{"className":1402},[],[1404],{"type":46,"value":1405},"it",{"type":40,"tag":200,"props":1407,"children":1408},{},[1409],{"type":40,"tag":70,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":46,"value":1414},"it \"...\", :positive do",{"type":40,"tag":173,"props":1416,"children":1417},{},[1418,1423,1431],{"type":40,"tag":200,"props":1419,"children":1420},{},[1421],{"type":46,"value":1422},"Pester",{"type":40,"tag":200,"props":1424,"children":1425},{},[1426],{"type":40,"tag":70,"props":1427,"children":1429},{"className":1428},[],[1430],{"type":46,"value":1065},{"type":40,"tag":200,"props":1432,"children":1433},{},[1434],{"type":40,"tag":70,"props":1435,"children":1437},{"className":1436},[],[1438],{"type":46,"value":1439},"It '...' -Tag 'positive'",{"type":40,"tag":173,"props":1441,"children":1442},{},[1443,1448,1456],{"type":40,"tag":200,"props":1444,"children":1445},{},[1446],{"type":46,"value":1447},"Kotest",{"type":40,"tag":200,"props":1449,"children":1450},{},[1451],{"type":40,"tag":70,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":46,"value":1073},{"type":40,"tag":200,"props":1457,"children":1458},{},[1459],{"type":40,"tag":70,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":46,"value":1464},"@Tags(Positive)",{"type":40,"tag":173,"props":1466,"children":1467},{},[1468,1473,1482],{"type":40,"tag":200,"props":1469,"children":1470},{},[1471],{"type":46,"value":1472},"Swift Testing",{"type":40,"tag":200,"props":1474,"children":1475},{},[1476],{"type":40,"tag":70,"props":1477,"children":1479},{"className":1478},[],[1480],{"type":46,"value":1481},"@Tag(.\u003Cname>)",{"type":40,"tag":200,"props":1483,"children":1484},{},[1485],{"type":40,"tag":70,"props":1486,"children":1488},{"className":1487},[],[1489],{"type":46,"value":1490},"@Test(.tags(.positive))",{"type":40,"tag":173,"props":1492,"children":1493},{},[1494,1499,1509],{"type":40,"tag":200,"props":1495,"children":1496},{},[1497],{"type":46,"value":1498},"Catch2",{"type":40,"tag":200,"props":1500,"children":1501},{},[1502,1507],{"type":40,"tag":70,"props":1503,"children":1505},{"className":1504},[],[1506],{"type":46,"value":1089},{"type":46,"value":1508}," in name",{"type":40,"tag":200,"props":1510,"children":1511},{},[1512],{"type":40,"tag":70,"props":1513,"children":1515},{"className":1514},[],[1516],{"type":46,"value":1517},"TEST_CASE(\"...\", \"[positive]\")",{"type":40,"tag":173,"props":1519,"children":1520},{},[1521,1526,1537],{"type":40,"tag":200,"props":1522,"children":1523},{},[1524],{"type":46,"value":1525},"doctest",{"type":40,"tag":200,"props":1527,"children":1528},{},[1529,1535],{"type":40,"tag":70,"props":1530,"children":1532},{"className":1531},[],[1533],{"type":46,"value":1534},"* doctest::test_suite(\"...\")",{"type":46,"value":1536}," decorator",{"type":40,"tag":200,"props":1538,"children":1539},{},[1540],{"type":40,"tag":70,"props":1541,"children":1543},{"className":1542},[],[1544],{"type":46,"value":1545},"TEST_CASE(\"...\" *doctest::test_suite(\"positive\"))",{"type":40,"tag":49,"props":1547,"children":1548},{},[1549],{"type":46,"value":1550},"Record which tests already have tags to avoid duplication.",{"type":40,"tag":957,"props":1552,"children":1554},{"id":1553},"step-3-classify-each-test-method",[1555],{"type":46,"value":1556},"Step 3: Classify each test method",{"type":40,"tag":49,"props":1558,"children":1559},{},[1560],{"type":46,"value":1561},"For each test method without traits, analyze:",{"type":40,"tag":1563,"props":1564,"children":1565},"ol",{},[1566,1673,1772,1863,1885,1900,1944,1959,1974,1989,2004,2019,2034,2049,2064],{"type":40,"tag":90,"props":1567,"children":1568},{},[1569,1574,1576,1582,1583,1589,1590,1596,1597,1603,1604,1610,1611,1617,1618,1624,1625,1631,1632,1638,1639,1645,1646,1652,1653,1659,1660,1666,1668],{"type":40,"tag":62,"props":1570,"children":1571},{},[1572],{"type":46,"value":1573},"Method name",{"type":46,"value":1575}," -- names containing ",{"type":40,"tag":70,"props":1577,"children":1579},{"className":1578},[],[1580],{"type":46,"value":1581},"Invalid",{"type":46,"value":389},{"type":40,"tag":70,"props":1584,"children":1586},{"className":1585},[],[1587],{"type":46,"value":1588},"Fail",{"type":46,"value":389},{"type":40,"tag":70,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":46,"value":1595},"Error",{"type":46,"value":389},{"type":40,"tag":70,"props":1598,"children":1600},{"className":1599},[],[1601],{"type":46,"value":1602},"Throw",{"type":46,"value":389},{"type":40,"tag":70,"props":1605,"children":1607},{"className":1606},[],[1608],{"type":46,"value":1609},"Reject",{"type":46,"value":389},{"type":40,"tag":70,"props":1612,"children":1614},{"className":1613},[],[1615],{"type":46,"value":1616},"BadInput",{"type":46,"value":389},{"type":40,"tag":70,"props":1619,"children":1621},{"className":1620},[],[1622],{"type":46,"value":1623},"Null",{"type":46,"value":389},{"type":40,"tag":70,"props":1626,"children":1628},{"className":1627},[],[1629],{"type":46,"value":1630},"None",{"type":46,"value":389},{"type":40,"tag":70,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":46,"value":1637},"Nil",{"type":46,"value":389},{"type":40,"tag":70,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":46,"value":1644},"Negative",{"type":46,"value":389},{"type":40,"tag":70,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":46,"value":1651},"raises_",{"type":46,"value":389},{"type":40,"tag":70,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":46,"value":1658},"_throws_",{"type":46,"value":389},{"type":40,"tag":70,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":46,"value":1665},"_returns_error",{"type":46,"value":1667}," suggest ",{"type":40,"tag":70,"props":1669,"children":1671},{"className":1670},[],[1672],{"type":46,"value":349},{"type":40,"tag":90,"props":1674,"children":1675},{},[1676,1681,1683,1689,1690,1696,1697,1703,1704,1710,1711,1717,1718,1724,1725,1731,1732,1738,1739,1745,1746,1752,1753,1759,1760,1766,1767],{"type":40,"tag":62,"props":1677,"children":1678},{},[1679],{"type":46,"value":1680},"Assertion type",{"type":46,"value":1682}," -- ",{"type":40,"tag":70,"props":1684,"children":1686},{"className":1685},[],[1687],{"type":46,"value":1688},"Assert.ThrowsException",{"type":46,"value":404},{"type":40,"tag":70,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":46,"value":1695},"Assert.Throws",{"type":46,"value":404},{"type":40,"tag":70,"props":1698,"children":1700},{"className":1699},[],[1701],{"type":46,"value":1702},"Should().Throw()",{"type":46,"value":404},{"type":40,"tag":70,"props":1705,"children":1707},{"className":1706},[],[1708],{"type":46,"value":1709},"pytest.raises",{"type":46,"value":404},{"type":40,"tag":70,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":46,"value":1716},"expect(fn).toThrow",{"type":46,"value":404},{"type":40,"tag":70,"props":1719,"children":1721},{"className":1720},[],[1722],{"type":46,"value":1723},"assertThrows",{"type":46,"value":404},{"type":40,"tag":70,"props":1726,"children":1728},{"className":1727},[],[1729],{"type":46,"value":1730},"assert.Error(t, err)",{"type":46,"value":404},{"type":40,"tag":70,"props":1733,"children":1735},{"className":1734},[],[1736],{"type":46,"value":1737},"expect { ... }.to raise_error",{"type":46,"value":404},{"type":40,"tag":70,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":46,"value":1744},"#[should_panic]",{"type":46,"value":404},{"type":40,"tag":70,"props":1747,"children":1749},{"className":1748},[],[1750],{"type":46,"value":1751},"XCTAssertThrowsError",{"type":46,"value":404},{"type":40,"tag":70,"props":1754,"children":1756},{"className":1755},[],[1757],{"type":46,"value":1758},"Should -Throw",{"type":46,"value":404},{"type":40,"tag":70,"props":1761,"children":1763},{"className":1762},[],[1764],{"type":46,"value":1765},"EXPECT_THROW",{"type":46,"value":1667},{"type":40,"tag":70,"props":1768,"children":1770},{"className":1769},[],[1771],{"type":46,"value":349},{"type":40,"tag":90,"props":1773,"children":1774},{},[1775,1780,1781,1787,1788,1793,1794,1800,1801,1807,1808,1814,1815,1820,1821,1826,1827,1832,1833,1838,1839,1844,1845,1850,1851,1856,1858],{"type":40,"tag":62,"props":1776,"children":1777},{},[1778],{"type":46,"value":1779},"Input values",{"type":46,"value":1682},{"type":40,"tag":70,"props":1782,"children":1784},{"className":1783},[],[1785],{"type":46,"value":1786},"null",{"type":46,"value":404},{"type":40,"tag":70,"props":1789,"children":1791},{"className":1790},[],[1792],{"type":46,"value":1630},{"type":46,"value":404},{"type":40,"tag":70,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":46,"value":1799},"nil",{"type":46,"value":404},{"type":40,"tag":70,"props":1802,"children":1804},{"className":1803},[],[1805],{"type":46,"value":1806},"undefined",{"type":46,"value":389},{"type":40,"tag":70,"props":1809,"children":1811},{"className":1810},[],[1812],{"type":46,"value":1813},"\"\"",{"type":46,"value":389},{"type":40,"tag":70,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":46,"value":387},{"type":46,"value":389},{"type":40,"tag":70,"props":1822,"children":1824},{"className":1823},[],[1825],{"type":46,"value":395},{"type":46,"value":389},{"type":40,"tag":70,"props":1828,"children":1830},{"className":1829},[],[1831],{"type":46,"value":402},{"type":46,"value":404},{"type":40,"tag":70,"props":1834,"children":1836},{"className":1835},[],[1837],{"type":46,"value":410},{"type":46,"value":404},{"type":40,"tag":70,"props":1840,"children":1842},{"className":1841},[],[1843],{"type":46,"value":417},{"type":46,"value":404},{"type":40,"tag":70,"props":1846,"children":1848},{"className":1847},[],[1849],{"type":46,"value":424},{"type":46,"value":404},{"type":40,"tag":70,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":46,"value":431},{"type":46,"value":1857},", empty collections suggest ",{"type":40,"tag":70,"props":1859,"children":1861},{"className":1860},[],[1862],{"type":46,"value":371},{"type":40,"tag":90,"props":1864,"children":1865},{},[1866,1871,1873,1878,1880],{"type":40,"tag":62,"props":1867,"children":1868},{},[1869],{"type":46,"value":1870},"Setup complexity",{"type":46,"value":1872}," -- minimal setup with basic assertions suggests ",{"type":40,"tag":70,"props":1874,"children":1876},{"className":1875},[],[1877],{"type":46,"value":467},{"type":46,"value":1879},"; external dependencies (file\u002Fdb\u002Fnet\u002Fenv) suggest ",{"type":40,"tag":70,"props":1881,"children":1883},{"className":1882},[],[1884],{"type":46,"value":511},{"type":40,"tag":90,"props":1886,"children":1887},{},[1888,1893,1895],{"type":40,"tag":62,"props":1889,"children":1890},{},[1891],{"type":46,"value":1892},"Comments and names",{"type":46,"value":1894}," -- references to issue numbers or \"regression\" \u002F \"bug\" \u002F \"fix for #...\" suggest ",{"type":40,"tag":70,"props":1896,"children":1898},{"className":1897},[],[1899],{"type":46,"value":489},{"type":40,"tag":90,"props":1901,"children":1902},{},[1903,1908,1909,1915,1916,1922,1924,1930,1932,1937,1939],{"type":40,"tag":62,"props":1904,"children":1905},{},[1906],{"type":46,"value":1907},"Timing assertions",{"type":46,"value":1682},{"type":40,"tag":70,"props":1910,"children":1912},{"className":1911},[],[1913],{"type":46,"value":1914},"Stopwatch",{"type":46,"value":389},{"type":40,"tag":70,"props":1917,"children":1919},{"className":1918},[],[1920],{"type":46,"value":1921},"BenchmarkDotNet",{"type":46,"value":1923},", elapsed-time checks; pytest-benchmark fixtures; benchmark.js; JMH ",{"type":40,"tag":70,"props":1925,"children":1927},{"className":1926},[],[1928],{"type":46,"value":1929},"@Benchmark",{"type":46,"value":1931},"; ",{"type":40,"tag":70,"props":1933,"children":1935},{"className":1934},[],[1936],{"type":46,"value":576},{"type":46,"value":1938},"; criterion.rs; XCTMetric; Google Benchmark; kotlinx-benchmark suggest ",{"type":40,"tag":70,"props":1940,"children":1942},{"className":1941},[],[1943],{"type":46,"value":560},{"type":40,"tag":90,"props":1945,"children":1946},{},[1947,1952,1954],{"type":40,"tag":62,"props":1948,"children":1949},{},[1950],{"type":46,"value":1951},"Feature centrality",{"type":46,"value":1953}," -- tests on primary public API entry points or critical user workflows suggest ",{"type":40,"tag":70,"props":1955,"children":1957},{"className":1956},[],[1958],{"type":46,"value":445},{"type":40,"tag":90,"props":1960,"children":1961},{},[1962,1967,1969],{"type":40,"tag":62,"props":1963,"children":1964},{},[1965],{"type":46,"value":1966},"Security patterns",{"type":46,"value":1968}," -- validates auth, checks permissions, sanitizes input, tests for injection, handles tokens\u002Fsecrets suggest ",{"type":40,"tag":70,"props":1970,"children":1972},{"className":1971},[],[1973],{"type":46,"value":590},{"type":40,"tag":90,"props":1975,"children":1976},{},[1977,1982,1984],{"type":40,"tag":62,"props":1978,"children":1979},{},[1980],{"type":46,"value":1981},"Parallel\u002Fasync constructs",{"type":46,"value":1983}," -- per-language concurrency primitives (see Trait Taxonomy table) suggest ",{"type":40,"tag":70,"props":1985,"children":1987},{"className":1986},[],[1988],{"type":46,"value":612},{"type":40,"tag":90,"props":1990,"children":1991},{},[1992,1997,1999],{"type":40,"tag":62,"props":1993,"children":1994},{},[1995],{"type":46,"value":1996},"Fault injection",{"type":46,"value":1998}," -- simulates failures, tests retries, timeouts, or circuit breakers suggest ",{"type":40,"tag":70,"props":2000,"children":2002},{"className":2001},[],[2003],{"type":46,"value":833},{"type":40,"tag":90,"props":2005,"children":2006},{},[2007,2012,2014],{"type":40,"tag":62,"props":2008,"children":2009},{},[2010],{"type":46,"value":2011},"State mutation",{"type":46,"value":2013}," -- deletes external records, drops resources, modifies shared\u002Fglobal state suggest ",{"type":40,"tag":70,"props":2015,"children":2017},{"className":2016},[],[2018],{"type":46,"value":855},{"type":40,"tag":90,"props":2020,"children":2021},{},[2022,2027,2029],{"type":40,"tag":62,"props":2023,"children":2024},{},[2025],{"type":46,"value":2026},"Full-stack flow",{"type":46,"value":2028}," -- test spans entry point through data layer to final response, covering a complete user scenario suggest ",{"type":40,"tag":70,"props":2030,"children":2032},{"className":2031},[],[2033],{"type":46,"value":533},{"type":40,"tag":90,"props":2035,"children":2036},{},[2037,2042,2044],{"type":40,"tag":62,"props":2038,"children":2039},{},[2040],{"type":46,"value":2041},"Config\u002Fsettings",{"type":46,"value":2043}," -- loads configuration, tests missing keys, validates options, checks environment variables suggest ",{"type":40,"tag":70,"props":2045,"children":2047},{"className":2046},[],[2048],{"type":46,"value":877},{"type":40,"tag":90,"props":2050,"children":2051},{},[2052,2057,2059],{"type":40,"tag":62,"props":2053,"children":2054},{},[2055],{"type":46,"value":2056},"Known instability",{"type":46,"value":2058}," -- test has skip \u002F ignore annotations with comments about flakiness, or names contain \"flaky\" \u002F \"intermittent\" suggest ",{"type":40,"tag":70,"props":2060,"children":2062},{"className":2061},[],[2063],{"type":46,"value":899},{"type":40,"tag":90,"props":2065,"children":2066},{},[2067,2072,2074],{"type":40,"tag":62,"props":2068,"children":2069},{},[2070],{"type":46,"value":2071},"Default",{"type":46,"value":2073}," -- if the test verifies a normal success path, tag ",{"type":40,"tag":70,"props":2075,"children":2077},{"className":2076},[],[2078],{"type":46,"value":327},{"type":40,"tag":49,"props":2080,"children":2081},{},[2082,2084,2089,2090,2095,2097,2102,2104,2109],{"type":46,"value":2083},"When in doubt between ",{"type":40,"tag":70,"props":2085,"children":2087},{"className":2086},[],[2088],{"type":46,"value":327},{"type":46,"value":928},{"type":40,"tag":70,"props":2091,"children":2093},{"className":2092},[],[2094],{"type":46,"value":349},{"type":46,"value":2096},", read the assertion: if it asserts success -> ",{"type":40,"tag":70,"props":2098,"children":2100},{"className":2099},[],[2101],{"type":46,"value":327},{"type":46,"value":2103},"; if it asserts failure -> ",{"type":40,"tag":70,"props":2105,"children":2107},{"className":2106},[],[2108],{"type":46,"value":349},{"type":46,"value":949},{"type":40,"tag":957,"props":2111,"children":2113},{"id":2112},"step-4-apply-trait-attributes-or-report-only",[2114],{"type":46,"value":2115},"Step 4: Apply trait attributes (or report only)",{"type":40,"tag":49,"props":2117,"children":2118},{},[2119,2131],{"type":40,"tag":62,"props":2120,"children":2121},{},[2122,2124,2129],{"type":46,"value":2123},"If the loaded language extension declares ",{"type":40,"tag":70,"props":2125,"children":2127},{"className":2126},[],[2128],{"type":46,"value":996},{"type":46,"value":2130}," for the framework",{"type":46,"value":2132},", add the appropriate attribute to each test method. Place trait attributes adjacent to the existing test attribute. Examples:",{"type":40,"tag":49,"props":2134,"children":2135},{},[2136],{"type":40,"tag":62,"props":2137,"children":2138},{},[2139],{"type":46,"value":2140},"MSTest:",{"type":40,"tag":2142,"props":2143,"children":2148},"pre",{"className":2144,"code":2145,"language":2146,"meta":2147,"style":2147},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[TestMethod]\n[TestCategory(\"negative\")]\n[TestCategory(\"boundary\")]\npublic void Parse_NullInput_ThrowsArgumentNullException() { ... }\n","csharp","",[2149],{"type":40,"tag":70,"props":2150,"children":2151},{"__ignoreMap":2147},[2152,2163,2172,2181],{"type":40,"tag":2153,"props":2154,"children":2157},"span",{"class":2155,"line":2156},"line",1,[2158],{"type":40,"tag":2153,"props":2159,"children":2160},{},[2161],{"type":46,"value":2162},"[TestMethod]\n",{"type":40,"tag":2153,"props":2164,"children":2166},{"class":2155,"line":2165},2,[2167],{"type":40,"tag":2153,"props":2168,"children":2169},{},[2170],{"type":46,"value":2171},"[TestCategory(\"negative\")]\n",{"type":40,"tag":2153,"props":2173,"children":2175},{"class":2155,"line":2174},3,[2176],{"type":40,"tag":2153,"props":2177,"children":2178},{},[2179],{"type":46,"value":2180},"[TestCategory(\"boundary\")]\n",{"type":40,"tag":2153,"props":2182,"children":2184},{"class":2155,"line":2183},4,[2185],{"type":40,"tag":2153,"props":2186,"children":2187},{},[2188],{"type":46,"value":2189},"public void Parse_NullInput_ThrowsArgumentNullException() { ... }\n",{"type":40,"tag":49,"props":2191,"children":2192},{},[2193],{"type":40,"tag":62,"props":2194,"children":2195},{},[2196],{"type":46,"value":2197},"xUnit:",{"type":40,"tag":2142,"props":2199,"children":2201},{"className":2144,"code":2200,"language":2146,"meta":2147,"style":2147},"[Fact]\n[Trait(\"Category\", \"positive\")]\n[Trait(\"Category\", \"critical-path\")]\npublic void CreateOrder_ValidItems_ReturnsConfirmation() { ... }\n",[2202],{"type":40,"tag":70,"props":2203,"children":2204},{"__ignoreMap":2147},[2205,2213,2221,2229],{"type":40,"tag":2153,"props":2206,"children":2207},{"class":2155,"line":2156},[2208],{"type":40,"tag":2153,"props":2209,"children":2210},{},[2211],{"type":46,"value":2212},"[Fact]\n",{"type":40,"tag":2153,"props":2214,"children":2215},{"class":2155,"line":2165},[2216],{"type":40,"tag":2153,"props":2217,"children":2218},{},[2219],{"type":46,"value":2220},"[Trait(\"Category\", \"positive\")]\n",{"type":40,"tag":2153,"props":2222,"children":2223},{"class":2155,"line":2174},[2224],{"type":40,"tag":2153,"props":2225,"children":2226},{},[2227],{"type":46,"value":2228},"[Trait(\"Category\", \"critical-path\")]\n",{"type":40,"tag":2153,"props":2230,"children":2231},{"class":2155,"line":2183},[2232],{"type":40,"tag":2153,"props":2233,"children":2234},{},[2235],{"type":46,"value":2236},"public void CreateOrder_ValidItems_ReturnsConfirmation() { ... }\n",{"type":40,"tag":49,"props":2238,"children":2239},{},[2240],{"type":40,"tag":62,"props":2241,"children":2242},{},[2243],{"type":46,"value":2244},"NUnit:",{"type":40,"tag":2142,"props":2246,"children":2248},{"className":2144,"code":2247,"language":2146,"meta":2147,"style":2147},"[Test]\n[Category(\"regression\")]\n[Category(\"negative\")]\npublic void Calculate_OverflowInput_ReturnsError() \u002F\u002F Fix for #1234\n{ ... }\n",[2249],{"type":40,"tag":70,"props":2250,"children":2251},{"__ignoreMap":2147},[2252,2260,2268,2276,2284],{"type":40,"tag":2153,"props":2253,"children":2254},{"class":2155,"line":2156},[2255],{"type":40,"tag":2153,"props":2256,"children":2257},{},[2258],{"type":46,"value":2259},"[Test]\n",{"type":40,"tag":2153,"props":2261,"children":2262},{"class":2155,"line":2165},[2263],{"type":40,"tag":2153,"props":2264,"children":2265},{},[2266],{"type":46,"value":2267},"[Category(\"regression\")]\n",{"type":40,"tag":2153,"props":2269,"children":2270},{"class":2155,"line":2174},[2271],{"type":40,"tag":2153,"props":2272,"children":2273},{},[2274],{"type":46,"value":2275},"[Category(\"negative\")]\n",{"type":40,"tag":2153,"props":2277,"children":2278},{"class":2155,"line":2183},[2279],{"type":40,"tag":2153,"props":2280,"children":2281},{},[2282],{"type":46,"value":2283},"public void Calculate_OverflowInput_ReturnsError() \u002F\u002F Fix for #1234\n",{"type":40,"tag":2153,"props":2285,"children":2287},{"class":2155,"line":2286},5,[2288],{"type":40,"tag":2153,"props":2289,"children":2290},{},[2291],{"type":46,"value":2292},"{ ... }\n",{"type":40,"tag":49,"props":2294,"children":2295},{},[2296],{"type":40,"tag":62,"props":2297,"children":2298},{},[2299],{"type":46,"value":2300},"pytest:",{"type":40,"tag":2142,"props":2302,"children":2306},{"className":2303,"code":2304,"language":2305,"meta":2147,"style":2147},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@pytest.mark.negative\n@pytest.mark.boundary\ndef test_parse_none_input_raises_value_error():\n    ...\n","python",[2307],{"type":40,"tag":70,"props":2308,"children":2309},{"__ignoreMap":2147},[2310,2318,2326,2334],{"type":40,"tag":2153,"props":2311,"children":2312},{"class":2155,"line":2156},[2313],{"type":40,"tag":2153,"props":2314,"children":2315},{},[2316],{"type":46,"value":2317},"@pytest.mark.negative\n",{"type":40,"tag":2153,"props":2319,"children":2320},{"class":2155,"line":2165},[2321],{"type":40,"tag":2153,"props":2322,"children":2323},{},[2324],{"type":46,"value":2325},"@pytest.mark.boundary\n",{"type":40,"tag":2153,"props":2327,"children":2328},{"class":2155,"line":2174},[2329],{"type":40,"tag":2153,"props":2330,"children":2331},{},[2332],{"type":46,"value":2333},"def test_parse_none_input_raises_value_error():\n",{"type":40,"tag":2153,"props":2335,"children":2336},{"class":2155,"line":2183},[2337],{"type":40,"tag":2153,"props":2338,"children":2339},{},[2340],{"type":46,"value":2341},"    ...\n",{"type":40,"tag":49,"props":2343,"children":2344},{},[2345],{"type":40,"tag":62,"props":2346,"children":2347},{},[2348],{"type":46,"value":2349},"JUnit 5:",{"type":40,"tag":2142,"props":2351,"children":2355},{"className":2352,"code":2353,"language":2354,"meta":2147,"style":2147},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@Test\n@Tag(\"positive\")\n@Tag(\"critical-path\")\nvoid createOrder_validItems_returnsConfirmation() { ... }\n","java",[2356],{"type":40,"tag":70,"props":2357,"children":2358},{"__ignoreMap":2147},[2359,2367,2375,2383],{"type":40,"tag":2153,"props":2360,"children":2361},{"class":2155,"line":2156},[2362],{"type":40,"tag":2153,"props":2363,"children":2364},{},[2365],{"type":46,"value":2366},"@Test\n",{"type":40,"tag":2153,"props":2368,"children":2369},{"class":2155,"line":2165},[2370],{"type":40,"tag":2153,"props":2371,"children":2372},{},[2373],{"type":46,"value":2374},"@Tag(\"positive\")\n",{"type":40,"tag":2153,"props":2376,"children":2377},{"class":2155,"line":2174},[2378],{"type":40,"tag":2153,"props":2379,"children":2380},{},[2381],{"type":46,"value":2382},"@Tag(\"critical-path\")\n",{"type":40,"tag":2153,"props":2384,"children":2385},{"class":2155,"line":2183},[2386],{"type":40,"tag":2153,"props":2387,"children":2388},{},[2389],{"type":46,"value":2390},"void createOrder_validItems_returnsConfirmation() { ... }\n",{"type":40,"tag":49,"props":2392,"children":2393},{},[2394],{"type":40,"tag":62,"props":2395,"children":2396},{},[2397],{"type":46,"value":2398},"TestNG:",{"type":40,"tag":2142,"props":2400,"children":2402},{"className":2352,"code":2401,"language":2354,"meta":2147,"style":2147},"@Test(groups = {\"negative\", \"boundary\"})\npublic void parse_nullInput_throwsIllegalArgumentException() { ... }\n",[2403],{"type":40,"tag":70,"props":2404,"children":2405},{"__ignoreMap":2147},[2406,2414],{"type":40,"tag":2153,"props":2407,"children":2408},{"class":2155,"line":2156},[2409],{"type":40,"tag":2153,"props":2410,"children":2411},{},[2412],{"type":46,"value":2413},"@Test(groups = {\"negative\", \"boundary\"})\n",{"type":40,"tag":2153,"props":2415,"children":2416},{"class":2155,"line":2165},[2417],{"type":40,"tag":2153,"props":2418,"children":2419},{},[2420],{"type":46,"value":2421},"public void parse_nullInput_throwsIllegalArgumentException() { ... }\n",{"type":40,"tag":49,"props":2423,"children":2424},{},[2425],{"type":40,"tag":62,"props":2426,"children":2427},{},[2428],{"type":46,"value":2429},"RSpec:",{"type":40,"tag":2142,"props":2431,"children":2435},{"className":2432,"code":2433,"language":2434,"meta":2147,"style":2147},"language-ruby shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","it \"rejects null input\", :negative, :boundary do\n  ...\nend\n","ruby",[2436],{"type":40,"tag":70,"props":2437,"children":2438},{"__ignoreMap":2147},[2439,2447,2455],{"type":40,"tag":2153,"props":2440,"children":2441},{"class":2155,"line":2156},[2442],{"type":40,"tag":2153,"props":2443,"children":2444},{},[2445],{"type":46,"value":2446},"it \"rejects null input\", :negative, :boundary do\n",{"type":40,"tag":2153,"props":2448,"children":2449},{"class":2155,"line":2165},[2450],{"type":40,"tag":2153,"props":2451,"children":2452},{},[2453],{"type":46,"value":2454},"  ...\n",{"type":40,"tag":2153,"props":2456,"children":2457},{"class":2155,"line":2174},[2458],{"type":40,"tag":2153,"props":2459,"children":2460},{},[2461],{"type":46,"value":2462},"end\n",{"type":40,"tag":49,"props":2464,"children":2465},{},[2466],{"type":40,"tag":62,"props":2467,"children":2468},{},[2469],{"type":46,"value":2470},"Pester:",{"type":40,"tag":2142,"props":2472,"children":2476},{"className":2473,"code":2474,"language":2475,"meta":2147,"style":2147},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","It 'Rejects null input' -Tag 'negative','boundary' {\n    ...\n}\n","powershell",[2477],{"type":40,"tag":70,"props":2478,"children":2479},{"__ignoreMap":2147},[2480,2488,2495],{"type":40,"tag":2153,"props":2481,"children":2482},{"class":2155,"line":2156},[2483],{"type":40,"tag":2153,"props":2484,"children":2485},{},[2486],{"type":46,"value":2487},"It 'Rejects null input' -Tag 'negative','boundary' {\n",{"type":40,"tag":2153,"props":2489,"children":2490},{"class":2155,"line":2165},[2491],{"type":40,"tag":2153,"props":2492,"children":2493},{},[2494],{"type":46,"value":2341},{"type":40,"tag":2153,"props":2496,"children":2497},{"class":2155,"line":2174},[2498],{"type":40,"tag":2153,"props":2499,"children":2500},{},[2501],{"type":46,"value":2502},"}\n",{"type":40,"tag":49,"props":2504,"children":2505},{},[2506],{"type":40,"tag":62,"props":2507,"children":2508},{},[2509],{"type":46,"value":2510},"Kotest:",{"type":40,"tag":2142,"props":2512,"children":2516},{"className":2513,"code":2514,"language":2515,"meta":2147,"style":2147},"language-kotlin shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@Tags(Negative, Boundary)\nclass ParserSpec : StringSpec({\n    \"rejects null input\" { ... }\n})\n","kotlin",[2517],{"type":40,"tag":70,"props":2518,"children":2519},{"__ignoreMap":2147},[2520,2528,2536,2544],{"type":40,"tag":2153,"props":2521,"children":2522},{"class":2155,"line":2156},[2523],{"type":40,"tag":2153,"props":2524,"children":2525},{},[2526],{"type":46,"value":2527},"@Tags(Negative, Boundary)\n",{"type":40,"tag":2153,"props":2529,"children":2530},{"class":2155,"line":2165},[2531],{"type":40,"tag":2153,"props":2532,"children":2533},{},[2534],{"type":46,"value":2535},"class ParserSpec : StringSpec({\n",{"type":40,"tag":2153,"props":2537,"children":2538},{"class":2155,"line":2174},[2539],{"type":40,"tag":2153,"props":2540,"children":2541},{},[2542],{"type":46,"value":2543},"    \"rejects null input\" { ... }\n",{"type":40,"tag":2153,"props":2545,"children":2546},{"class":2155,"line":2183},[2547],{"type":40,"tag":2153,"props":2548,"children":2549},{},[2550],{"type":46,"value":2551},"})\n",{"type":40,"tag":49,"props":2553,"children":2554},{},[2555],{"type":40,"tag":62,"props":2556,"children":2557},{},[2558],{"type":46,"value":2559},"Swift Testing:",{"type":40,"tag":2142,"props":2561,"children":2565},{"className":2562,"code":2563,"language":2564,"meta":2147,"style":2147},"language-swift shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@Test(.tags(.negative, .boundary))\nfunc parseNullInputThrows() throws { ... }\n","swift",[2566],{"type":40,"tag":70,"props":2567,"children":2568},{"__ignoreMap":2147},[2569,2577],{"type":40,"tag":2153,"props":2570,"children":2571},{"class":2155,"line":2156},[2572],{"type":40,"tag":2153,"props":2573,"children":2574},{},[2575],{"type":46,"value":2576},"@Test(.tags(.negative, .boundary))\n",{"type":40,"tag":2153,"props":2578,"children":2579},{"class":2155,"line":2165},[2580],{"type":40,"tag":2153,"props":2581,"children":2582},{},[2583],{"type":46,"value":2584},"func parseNullInputThrows() throws { ... }\n",{"type":40,"tag":49,"props":2586,"children":2587},{},[2588],{"type":40,"tag":62,"props":2589,"children":2590},{},[2591],{"type":46,"value":2592},"Catch2:",{"type":40,"tag":2142,"props":2594,"children":2598},{"className":2595,"code":2596,"language":2597,"meta":2147,"style":2147},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","TEST_CASE(\"Parse null input throws\", \"[negative][boundary]\") { ... }\n","cpp",[2599],{"type":40,"tag":70,"props":2600,"children":2601},{"__ignoreMap":2147},[2602],{"type":40,"tag":2153,"props":2603,"children":2604},{"class":2155,"line":2156},[2605],{"type":40,"tag":2153,"props":2606,"children":2607},{},[2608],{"type":46,"value":2596},{"type":40,"tag":49,"props":2610,"children":2611},{},[2612,2622,2624,2629],{"type":40,"tag":62,"props":2613,"children":2614},{},[2615,2616,2621],{"type":46,"value":2123},{"type":40,"tag":70,"props":2617,"children":2619},{"className":2618},[],[2620],{"type":46,"value":1111},{"type":46,"value":2130},{"type":46,"value":2623}," (Go standard ",{"type":40,"tag":70,"props":2625,"children":2627},{"className":2626},[],[2628],{"type":46,"value":21},{"type":46,"value":2630},", plain Jest\u002FVitest without convention, Rust without project-specific cfg, plain XCTest, plain GoogleTest, plain Mocha), do NOT modify source files. Instead emit a Markdown table mapping each test to its suggested tags, and recommend a project-wide convention the team can adopt (build tags, file suffix, describe-block prefix, GoogleTest filter prefix, test-plan grouping, etc.).",{"type":40,"tag":49,"props":2632,"children":2633},{},[2634,2643,2645,2650,2651,2656,2657,2662,2664,2669],{"type":40,"tag":62,"props":2635,"children":2636},{},[2637,2638],{"type":46,"value":2123},{"type":40,"tag":70,"props":2639,"children":2641},{"className":2640},[],[2642],{"type":46,"value":1132},{"type":46,"value":2644}," (e.g., Go ",{"type":40,"tag":70,"props":2646,"children":2648},{"className":2647},[],[2649],{"type":46,"value":1140},{"type":46,"value":389},{"type":40,"tag":70,"props":2652,"children":2654},{"className":2653},[],[2655],{"type":46,"value":1148},{"type":46,"value":1150},{"type":40,"tag":70,"props":2658,"children":2660},{"className":2659},[],[2661],{"type":46,"value":1156},{"type":46,"value":2663}," prefix), only emit canonical edits when the user has confirmed the project's convention. Otherwise treat as ",{"type":40,"tag":70,"props":2665,"children":2667},{"className":2666},[],[2668],{"type":46,"value":1111},{"type":46,"value":949},{"type":40,"tag":957,"props":2671,"children":2673},{"id":2672},"step-5-generate-trait-summary",[2674],{"type":46,"value":2675},"Step 5: Generate trait summary",{"type":40,"tag":49,"props":2677,"children":2678},{},[2679],{"type":46,"value":2680},"After tagging, produce a summary table:",{"type":40,"tag":2142,"props":2682,"children":2686},{"className":2683,"code":2685,"language":46},[2684],"language-text","## Trait Distribution\n\n| Trait         | Count | % of Total |\n|---------------|-------|------------|\n| positive      |    42 |      53.8% |\n| negative      |    22 |      28.2% |\n| boundary      |     8 |      10.3% |\n| critical-path |    12 |      15.4% |\n| smoke         |     3 |       3.8% |\n| regression    |     5 |       6.4% |\n| integration   |     4 |       5.1% |\n| end-to-end    |     2 |       2.6% |\n| performance   |     1 |       1.3% |\n| security      |     3 |       3.8% |\n| concurrency   |     2 |       2.6% |\n| resilience    |     1 |       1.3% |\n| destructive   |     1 |       1.3% |\n| configuration |     2 |       2.6% |\n| flaky         |     1 |       1.3% |\n| **Total tests** | **78** | -- |\n\nNote: Percentages exceed 100% because tests can have multiple traits.\n",[2687],{"type":40,"tag":70,"props":2688,"children":2689},{"__ignoreMap":2147},[2690],{"type":46,"value":2685},{"type":40,"tag":49,"props":2692,"children":2693},{},[2694],{"type":46,"value":2695},"Include observations such as:",{"type":40,"tag":86,"props":2697,"children":2698},{},[2699,2704,2709],{"type":40,"tag":90,"props":2700,"children":2701},{},[2702],{"type":46,"value":2703},"Ratio of positive to negative tests",{"type":40,"tag":90,"props":2705,"children":2706},{},[2707],{"type":46,"value":2708},"Whether critical-path tests exist for key public APIs",{"type":40,"tag":90,"props":2710,"children":2711},{},[2712],{"type":46,"value":2713},"Any tests that could not be confidently classified (list them for manual review)",{"type":40,"tag":79,"props":2715,"children":2717},{"id":2716},"validation",[2718],{"type":46,"value":2719},"Validation",{"type":40,"tag":86,"props":2721,"children":2724},{"className":2722},[2723],"contains-task-list",[2725,2765,2774,2783,2792,2858,2873],{"type":40,"tag":90,"props":2726,"children":2729},{"className":2727},[2728],"task-list-item",[2730,2736,2738,2743,2744,2749,2751,2756,2758,2763],{"type":40,"tag":2731,"props":2732,"children":2735},"input",{"disabled":2733,"type":2734},true,"checkbox",[],{"type":46,"value":2737}," Every test method has at least one trait classification (",{"type":40,"tag":70,"props":2739,"children":2741},{"className":2740},[],[2742],{"type":46,"value":327},{"type":46,"value":942},{"type":40,"tag":70,"props":2745,"children":2747},{"className":2746},[],[2748],{"type":46,"value":349},{"type":46,"value":2750}," at minimum) — in the report for ",{"type":40,"tag":70,"props":2752,"children":2754},{"className":2753},[],[2755],{"type":46,"value":1111},{"type":46,"value":2757}," frameworks, or as an attribute for ",{"type":40,"tag":70,"props":2759,"children":2761},{"className":2760},[],[2762],{"type":46,"value":996},{"type":46,"value":2764}," frameworks",{"type":40,"tag":90,"props":2766,"children":2768},{"className":2767},[2728],[2769,2772],{"type":40,"tag":2731,"props":2770,"children":2771},{"disabled":2733,"type":2734},[],{"type":46,"value":2773}," No invented trait values outside the taxonomy table",{"type":40,"tag":90,"props":2775,"children":2777},{"className":2776},[2728],[2778,2781],{"type":40,"tag":2731,"props":2779,"children":2780},{"disabled":2733,"type":2734},[],{"type":46,"value":2782}," Existing trait attributes were preserved, not duplicated",{"type":40,"tag":90,"props":2784,"children":2786},{"className":2785},[2728],[2787,2790],{"type":40,"tag":2731,"props":2788,"children":2789},{"disabled":2733,"type":2734},[],{"type":46,"value":2791}," The trait summary table was generated",{"type":40,"tag":90,"props":2793,"children":2795},{"className":2794},[2728],[2796,2799,2801,2806,2808,2814,2815,2821,2822,2828,2829,2835,2836,2842,2843,2849,2850,2856],{"type":40,"tag":2731,"props":2797,"children":2798},{"disabled":2733,"type":2734},[],{"type":46,"value":2800}," For ",{"type":40,"tag":70,"props":2802,"children":2804},{"className":2803},[],[2805],{"type":46,"value":996},{"type":46,"value":2807}," frameworks, the project still builds \u002F tests still discover after changes (",{"type":40,"tag":70,"props":2809,"children":2811},{"className":2810},[],[2812],{"type":46,"value":2813},"dotnet build",{"type":46,"value":404},{"type":40,"tag":70,"props":2816,"children":2818},{"className":2817},[],[2819],{"type":46,"value":2820},"pytest --collect-only",{"type":46,"value":404},{"type":40,"tag":70,"props":2823,"children":2825},{"className":2824},[],[2826],{"type":46,"value":2827},"mvn test-compile",{"type":46,"value":404},{"type":40,"tag":70,"props":2830,"children":2832},{"className":2831},[],[2833],{"type":46,"value":2834},"go vet .\u002F...",{"type":46,"value":404},{"type":40,"tag":70,"props":2837,"children":2839},{"className":2838},[],[2840],{"type":46,"value":2841},"cargo check --tests",{"type":46,"value":404},{"type":40,"tag":70,"props":2844,"children":2846},{"className":2845},[],[2847],{"type":46,"value":2848},"npm run test:list",{"type":46,"value":404},{"type":40,"tag":70,"props":2851,"children":2853},{"className":2852},[],[2854],{"type":46,"value":2855},"Invoke-Pester -PassThru -Skip",{"type":46,"value":2857}," \u002F equivalent)",{"type":40,"tag":90,"props":2859,"children":2861},{"className":2860},[2728],[2862,2865,2866,2871],{"type":40,"tag":2731,"props":2863,"children":2864},{"disabled":2733,"type":2734},[],{"type":46,"value":2800},{"type":40,"tag":70,"props":2867,"children":2869},{"className":2868},[],[2870],{"type":46,"value":1111},{"type":46,"value":2872}," frameworks, no source files were modified",{"type":40,"tag":90,"props":2874,"children":2876},{"className":2875},[2728],[2877,2880,2881,2886],{"type":40,"tag":2731,"props":2878,"children":2879},{"disabled":2733,"type":2734},[],{"type":46,"value":2800},{"type":40,"tag":70,"props":2882,"children":2884},{"className":2883},[],[2885],{"type":46,"value":1132},{"type":46,"value":2887}," frameworks, edits were applied ONLY when a project convention was confirmed",{"type":40,"tag":79,"props":2889,"children":2891},{"id":2890},"common-pitfalls",[2892],{"type":46,"value":2893},"Common Pitfalls",{"type":40,"tag":165,"props":2895,"children":2896},{},[2897,2913],{"type":40,"tag":169,"props":2898,"children":2899},{},[2900],{"type":40,"tag":173,"props":2901,"children":2902},{},[2903,2908],{"type":40,"tag":177,"props":2904,"children":2905},{},[2906],{"type":46,"value":2907},"Pitfall",{"type":40,"tag":177,"props":2909,"children":2910},{},[2911],{"type":46,"value":2912},"Solution",{"type":40,"tag":193,"props":2914,"children":2915},{},[2916,2929,2980,3008,3021,3039,3059,3094],{"type":40,"tag":173,"props":2917,"children":2918},{},[2919,2924],{"type":40,"tag":200,"props":2920,"children":2921},{},[2922],{"type":46,"value":2923},"Guessing traits without reading the test body",{"type":40,"tag":200,"props":2925,"children":2926},{},[2927],{"type":46,"value":2928},"Always read assertions and setup to classify accurately",{"type":40,"tag":173,"props":2930,"children":2931},{},[2932,2956],{"type":40,"tag":200,"props":2933,"children":2934},{},[2935,2937,2942,2944,2949,2951],{"type":46,"value":2936},"Tagging a test only as ",{"type":40,"tag":70,"props":2938,"children":2940},{"className":2939},[],[2941],{"type":46,"value":371},{"type":46,"value":2943}," without ",{"type":40,"tag":70,"props":2945,"children":2947},{"className":2946},[],[2948],{"type":46,"value":327},{"type":46,"value":2950},"\u002F",{"type":40,"tag":70,"props":2952,"children":2954},{"className":2953},[],[2955],{"type":46,"value":349},{"type":40,"tag":200,"props":2957,"children":2958},{},[2959,2961,2966,2967,2972,2973,2978],{"type":46,"value":2960},"Every test should also be ",{"type":40,"tag":70,"props":2962,"children":2964},{"className":2963},[],[2965],{"type":46,"value":327},{"type":46,"value":942},{"type":40,"tag":70,"props":2968,"children":2970},{"className":2969},[],[2971],{"type":46,"value":349},{"type":46,"value":1682},{"type":40,"tag":70,"props":2974,"children":2976},{"className":2975},[],[2977],{"type":46,"value":371},{"type":46,"value":2979}," is additive",{"type":40,"tag":173,"props":2981,"children":2982},{},[2983,2988],{"type":40,"tag":200,"props":2984,"children":2985},{},[2986],{"type":46,"value":2987},"Using the wrong attribute syntax for the detected framework",{"type":40,"tag":200,"props":2989,"children":2990},{},[2991,2993,2998,3000,3006],{"type":46,"value":2992},"Match the attribute style to the loaded language extension (don't put ",{"type":40,"tag":70,"props":2994,"children":2996},{"className":2995},[],[2997],{"type":46,"value":1004},{"type":46,"value":2999}," in an xUnit project or ",{"type":40,"tag":70,"props":3001,"children":3003},{"className":3002},[],[3004],{"type":46,"value":3005},"@pytest.mark.x",{"type":46,"value":3007}," in a unittest test)",{"type":40,"tag":173,"props":3009,"children":3010},{},[3011,3016],{"type":40,"tag":200,"props":3012,"children":3013},{},[3014],{"type":46,"value":3015},"Duplicating an existing category attribute",{"type":40,"tag":200,"props":3017,"children":3018},{},[3019],{"type":46,"value":3020},"Check for pre-existing traits in Step 2 before adding",{"type":40,"tag":173,"props":3022,"children":3023},{},[3024,3034],{"type":40,"tag":200,"props":3025,"children":3026},{},[3027,3029],{"type":46,"value":3028},"Over-tagging as ",{"type":40,"tag":70,"props":3030,"children":3032},{"className":3031},[],[3033],{"type":46,"value":445},{"type":40,"tag":200,"props":3035,"children":3036},{},[3037],{"type":46,"value":3038},"Reserve for tests on primary public entry points, not every helper",{"type":40,"tag":173,"props":3040,"children":3041},{},[3042,3047],{"type":40,"tag":200,"props":3043,"children":3044},{},[3045],{"type":46,"value":3046},"Editing Go \u002F plain Jest \u002F plain Rust \u002F plain XCTest \u002F plain GoogleTest source",{"type":40,"tag":200,"props":3048,"children":3049},{},[3050,3052,3057],{"type":46,"value":3051},"These are ",{"type":40,"tag":70,"props":3053,"children":3055},{"className":3054},[],[3056],{"type":46,"value":1111},{"type":46,"value":3058}," by default — emit a Markdown table instead. Only edit if the user confirms a project-wide convention (build tag, file suffix, describe-prefix, test-plan grouping).",{"type":40,"tag":173,"props":3060,"children":3061},{},[3062,3067],{"type":40,"tag":200,"props":3063,"children":3064},{},[3065],{"type":46,"value":3066},"Inventing tag prefixes for convention-based frameworks",{"type":40,"tag":200,"props":3068,"children":3069},{},[3070,3072,3078,3079,3084,3086,3092],{"type":46,"value":3071},"Confirm the project's existing convention before adopting one — don't guess between ",{"type":40,"tag":70,"props":3073,"children":3075},{"className":3074},[],[3076],{"type":46,"value":3077},"_integration_test.go",{"type":46,"value":389},{"type":40,"tag":70,"props":3080,"children":3082},{"className":3081},[],[3083],{"type":46,"value":1140},{"type":46,"value":3085},", or ",{"type":40,"tag":70,"props":3087,"children":3089},{"className":3088},[],[3090],{"type":46,"value":3091},"IntegrationTest",{"type":46,"value":3093}," prefix",{"type":40,"tag":173,"props":3095,"children":3096},{},[3097,3102],{"type":40,"tag":200,"props":3098,"children":3099},{},[3100],{"type":46,"value":3101},"Missing language-specific concurrency \u002F async primitives",{"type":40,"tag":200,"props":3103,"children":3104},{},[3105,3107],{"type":46,"value":3106},"Each language has its own primitives — read the loaded language extension and the Trait Taxonomy concurrency row before classifying as ",{"type":40,"tag":70,"props":3108,"children":3110},{"className":3109},[],[3111],{"type":46,"value":612},{"type":40,"tag":3113,"props":3114,"children":3115},"style",{},[3116],{"type":46,"value":3117},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3119,"total":3222},[3120,3136,3151,3169,3179,3198,3208],{"slug":3121,"name":3121,"fn":3122,"description":3123,"org":3124,"tags":3125,"stars":22,"repoUrl":23,"updatedAt":3135},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3126,3129,3130,3133],{"name":3127,"slug":3128,"type":15},".NET","net",{"name":17,"slug":18,"type":15},{"name":3131,"slug":3132,"type":15},"Debugging","debugging",{"name":3134,"slug":560,"type":15},"Performance","2026-07-12T08:23:25.400375",{"slug":3137,"name":3137,"fn":3138,"description":3139,"org":3140,"tags":3141,"stars":22,"repoUrl":23,"updatedAt":3150},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3142,3143,3146,3147],{"name":3127,"slug":3128,"type":15},{"name":3144,"slug":3145,"type":15},"Android","android",{"name":3131,"slug":3132,"type":15},{"name":3148,"slug":3149,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":3152,"name":3152,"fn":3153,"description":3154,"org":3155,"tags":3156,"stars":22,"repoUrl":23,"updatedAt":3168},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3157,3158,3159,3162,3165],{"name":3127,"slug":3128,"type":15},{"name":3131,"slug":3132,"type":15},{"name":3160,"slug":3161,"type":15},"iOS","ios",{"name":3163,"slug":3164,"type":15},"macOS","macos",{"name":3166,"slug":3167,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":3170,"name":3170,"fn":3171,"description":3172,"org":3173,"tags":3174,"stars":22,"repoUrl":23,"updatedAt":3178},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3175,3176,3177],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:23:51.277743",{"slug":3180,"name":3180,"fn":3181,"description":3182,"org":3183,"tags":3184,"stars":22,"repoUrl":23,"updatedAt":3197},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3185,3186,3189,3191,3194],{"name":3127,"slug":3128,"type":15},{"name":3187,"slug":3188,"type":15},"Blazor","blazor",{"name":3190,"slug":2146,"type":15},"C#",{"name":3192,"slug":3193,"type":15},"UI Components","ui-components",{"name":3195,"slug":3196,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":3199,"name":3199,"fn":3200,"description":3201,"org":3202,"tags":3203,"stars":22,"repoUrl":23,"updatedAt":3207},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3204,3205,3206],{"name":17,"slug":18,"type":15},{"name":3131,"slug":3132,"type":15},{"name":3148,"slug":3149,"type":15},"2026-07-12T08:21:34.637923",{"slug":3209,"name":3209,"fn":3210,"description":3211,"org":3212,"tags":3213,"stars":22,"repoUrl":23,"updatedAt":3221},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3214,3217,3218],{"name":3215,"slug":3216,"type":15},"Build","build",{"name":3131,"slug":3132,"type":15},{"name":3219,"slug":3220,"type":15},"Engineering","engineering","2026-07-19T05:38:19.340791",96,{"items":3224,"total":3329},[3225,3237,3244,3251,3259,3265,3273,3279,3285,3295,3308,3319],{"slug":3226,"name":3226,"fn":3227,"description":3228,"org":3229,"tags":3230,"stars":3234,"repoUrl":3235,"updatedAt":3236},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3231,3232,3233],{"name":3127,"slug":3128,"type":15},{"name":3219,"slug":3220,"type":15},{"name":3134,"slug":560,"type":15},5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":3121,"name":3121,"fn":3122,"description":3123,"org":3238,"tags":3239,"stars":22,"repoUrl":23,"updatedAt":3135},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3240,3241,3242,3243],{"name":3127,"slug":3128,"type":15},{"name":17,"slug":18,"type":15},{"name":3131,"slug":3132,"type":15},{"name":3134,"slug":560,"type":15},{"slug":3137,"name":3137,"fn":3138,"description":3139,"org":3245,"tags":3246,"stars":22,"repoUrl":23,"updatedAt":3150},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3247,3248,3249,3250],{"name":3127,"slug":3128,"type":15},{"name":3144,"slug":3145,"type":15},{"name":3131,"slug":3132,"type":15},{"name":3148,"slug":3149,"type":15},{"slug":3152,"name":3152,"fn":3153,"description":3154,"org":3252,"tags":3253,"stars":22,"repoUrl":23,"updatedAt":3168},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3254,3255,3256,3257,3258],{"name":3127,"slug":3128,"type":15},{"name":3131,"slug":3132,"type":15},{"name":3160,"slug":3161,"type":15},{"name":3163,"slug":3164,"type":15},{"name":3166,"slug":3167,"type":15},{"slug":3170,"name":3170,"fn":3171,"description":3172,"org":3260,"tags":3261,"stars":22,"repoUrl":23,"updatedAt":3178},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3262,3263,3264],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"slug":3180,"name":3180,"fn":3181,"description":3182,"org":3266,"tags":3267,"stars":22,"repoUrl":23,"updatedAt":3197},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3268,3269,3270,3271,3272],{"name":3127,"slug":3128,"type":15},{"name":3187,"slug":3188,"type":15},{"name":3190,"slug":2146,"type":15},{"name":3192,"slug":3193,"type":15},{"name":3195,"slug":3196,"type":15},{"slug":3199,"name":3199,"fn":3200,"description":3201,"org":3274,"tags":3275,"stars":22,"repoUrl":23,"updatedAt":3207},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3276,3277,3278],{"name":17,"slug":18,"type":15},{"name":3131,"slug":3132,"type":15},{"name":3148,"slug":3149,"type":15},{"slug":3209,"name":3209,"fn":3210,"description":3211,"org":3280,"tags":3281,"stars":22,"repoUrl":23,"updatedAt":3221},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3282,3283,3284],{"name":3215,"slug":3216,"type":15},{"name":3131,"slug":3132,"type":15},{"name":3219,"slug":3220,"type":15},{"slug":3286,"name":3286,"fn":3287,"description":3288,"org":3289,"tags":3290,"stars":22,"repoUrl":23,"updatedAt":3294},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3291,3292,3293],{"name":3127,"slug":3128,"type":15},{"name":3219,"slug":3220,"type":15},{"name":3134,"slug":560,"type":15},"2026-07-19T05:38:18.364937",{"slug":3296,"name":3296,"fn":3297,"description":3298,"org":3299,"tags":3300,"stars":22,"repoUrl":23,"updatedAt":3307},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3301,3302,3305,3306],{"name":3219,"slug":3220,"type":15},{"name":3303,"slug":3304,"type":15},"Monitoring","monitoring",{"name":3134,"slug":560,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:21:35.865649",{"slug":3309,"name":3309,"fn":3310,"description":3311,"org":3312,"tags":3313,"stars":22,"repoUrl":23,"updatedAt":3318},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3314,3315,3316,3317],{"name":3127,"slug":3128,"type":15},{"name":3131,"slug":3132,"type":15},{"name":3219,"slug":3220,"type":15},{"name":3134,"slug":560,"type":15},"2026-07-12T08:21:40.961722",{"slug":3320,"name":3320,"fn":3321,"description":3322,"org":3323,"tags":3324,"stars":22,"repoUrl":23,"updatedAt":3328},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3325,3326,3327],{"name":3131,"slug":3132,"type":15},{"name":3219,"slug":3220,"type":15},{"name":13,"slug":14,"type":15},"2026-07-19T05:38:14.336279",144]