[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-trail-of-bits-add-language-support":3,"mdc-dixndh-key":34,"related-org-trail-of-bits-add-language-support":4388,"related-repo-trail-of-bits-add-language-support":4544},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"add-language-support","implement mutation testing for new languages","Implements mutation testing support for new programming languages using tree-sitter grammars and the LanguageEngine trait. Triggers on \"add language support\", \"add [language] support\", \"implement [language]\", \"new language\", or mentions of specific languages like Python, TypeScript, C++, Java.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"trail-of-bits","Trail of Bits","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Ftrail-of-bits.png","trailofbits",[13,17,20],{"name":14,"slug":15,"type":16},"Engineering","engineering","tag",{"name":18,"slug":19,"type":16},"Code Analysis","code-analysis",{"name":21,"slug":22,"type":16},"Testing","testing",50,"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fmewt","2026-07-17T06:06:23.426569","Apache-2.0",2,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"mewt is a mutation testing framework","https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fmewt\u002Ftree\u002FHEAD\u002Fskills\u002Fadd-language-support","---\nname: add-language-support\ndescription: Implements mutation testing support for new programming languages using tree-sitter grammars and the LanguageEngine trait. Triggers on \"add language support\", \"add [language] support\", \"implement [language]\", \"new language\", or mentions of specific languages like Python, TypeScript, C++, Java.\nlicense: Apache-2.0\nmetadata:\n  author: trailofbits\n  version: \"1.1\"\n  mewt-version: \">=2.0.0\"\nallowed-tools:\n  - Read\n  - Write\n  - Edit\n  - Bash\n  - Glob\n  - AskUserQuestion\n---\n\n# Adding Language Support to Mewt\n\nImplements mutation testing support for new programming languages using tree-sitter grammars and the LanguageEngine trait.\n\n## When to Use\n\nUse this skill when:\n- Adding support for a new programming language (Python, JavaScript, Go, etc.)\n- Implementing tree-sitter grammar integration\n- User asks to \"add language support\" or \"implement X language\"\n- Extending mewt's language capabilities\n\n## When NOT to Use\n\n**Don't use for using mewt:** If the user wants to USE mewt for mutation testing (not add language support), use the `mewt` skill instead.\n\n**Don't use for grammar development:** This assumes a tree-sitter grammar already exists. If no grammar exists, that's a separate specialized task beyond this skill's scope.\n\n## Essential Principles\n\n**Grammar First**: Never attempt to write a tree-sitter grammar from scratch. Always find and verify an existing tree-sitter grammar repository before proceeding. Grammar development requires specialized expertise.\n\n**API Simplicity**: The LanguageEngine trait has only 4 methods. Keep implementations minimal - no helper methods, just the trait interface and inline grammar loading.\n\n**Resolver First (Dialect-Aware Families)**: If a language family has multiple dialects sharing an extension, resolution must be owned by the registry\u002Fresolver layer (precedence, canonical labeling, deterministic ambiguity handling). Do not add command-specific branching for final language+dialect selection.\n\n**Canonical Labels Only**: For dialect-aware families, use canonical selectors\u002Flabels (e.g., `move`, `move\u002Fsui`, `move\u002Fiota`) and avoid introducing legacy alias compatibility unless explicitly requested.\n\n**Common First**: Start with COMMON_MUTATIONS only. Add language-specific mutations only for unique constructs not covered by common patterns. Most languages need zero custom mutations.\n\n**Per-Slug Mutation Tests**: Every mutation slug exposed by the engine must have a dedicated test module under `tests\u002F\u003Clanguage>\u002Fmutations\u002F\u003CSLUG>.rs`. The guard test in `tests\u002Flanguages.rs` enforces this convention. New languages must be wired into the guard before landing.\n\n**Integration Conformance First**: Every language `tests\u002F\u003Clanguage>\u002Fintegration_tests.rs` must run the shared conformance harness from `tests\u002Fconformance.rs`, then add language-specific integration assertions as needed.\n\n**Example Fixture Policy**: Keep canonical example fixtures at `tests\u002F\u003Clanguage>\u002Fexample.\u003Cext>` (JavaScript may keep multiple canonical fixtures: `example.js`, `example.ts`, `example.jsx`, `example.tsx`). Integration tests should treat these as smoke checks (`!mutants.is_empty()`), while per-slug tests should use inline fixtures for precise assertions.\n\n**Verification Required**: Each phase has explicit exit criteria. Do not proceed to the next phase until all validation passes.\n\n## When to Use\n\n- User explicitly requests adding support for a specific programming language\n- User mentions \"add language support\" or \"new language\"\n- User provides a tree-sitter grammar repository URL\n- User asks how to extend mewt with new languages\n\n## When NOT to Use\n\n- Language already supported (check `src\u002Flanguages\u002F`) - use existing implementation\n- User wants to modify existing language support - use general code editing\n- User wants to add mutations to existing language - edit `src\u002Flanguages\u002F\u003Clang>\u002Fmutations.rs`\n- No tree-sitter grammar exists - inform user and halt (cannot create grammars)\n\n## Linear Progression\n\n### Phase 1: Grammar Acquisition\n\n**Entry Criteria**: User has requested language support\n\n**Actions**:\n\n1. Check if tree-sitter grammar repository URL is provided\n   - If not, ask user with common patterns:\n     - `https:\u002F\u002Fgithub.com\u002Ftree-sitter\u002Ftree-sitter-\u003Clanguage>`\n     - `https:\u002F\u002Fgithub.com\u002F\u003Cmaintainer>\u002Ftree-sitter-\u003Clanguage>`\n   - Offer to search the web if needed\n\n2. Once URL confirmed, use Edit to add to `grammars\u002Fupdate.sh` (lines 15-23):\n   ```bash\n   declare -A REPO_URLS=(\n     [\"\u003Clanguage>\"]=\"\u003Ctree-sitter-repo-url>\"\n   )\n   \n   declare -A GRAMMAR_PATHS=(\n     [\"\u003Clanguage>\"]=\"\"  # or subdirectory if nested\n   )\n   ```\n\n3. Run grammar extraction:\n   ```bash\n   cd grammars && bash update.sh \u003Clanguage> false\n   ```\n\n**Exit Criteria**:\n- [ ] Grammar files exist in `grammars\u002F\u003Clanguage>\u002Fsrc\u002F`\n- [ ] Must have: `parser.c`, `tree_sitter\u002F` directory\n- [ ] May have: `scanner.c`, `node-types.json`\n\n### Phase 2: Build System Integration\n\n**Entry Criteria**: Grammar files extracted successfully\n\n**Actions**:\n\n1. Use Edit to add build configuration to `build.rs` after line 57:\n   ```rust\n   \u002F\u002F Build \u003CLanguage> grammar\n   let \u003Clanguage>_dir: PathBuf = [\"grammars\", \"\u003Clanguage>\", \"src\"].iter().collect();\n   build_grammar(&\u003Clanguage>_dir, \"tree-sitter-\u003Clanguage>\");\n   ```\n\n2. Verify compilation:\n   ```bash\n   cargo check\n   ```\n\n**Exit Criteria**:\n- [ ] `cargo check` completes without errors\n- [ ] Grammar library compiles successfully\n\n### Phase 3: Language Engine Implementation\n\n**Entry Criteria**: Grammar builds successfully\n\n**Actions**:\n\n1. Create language module structure:\n   ```bash\n   mkdir -p src\u002Flanguages\u002F\u003Clanguage>\n   ```\n\n2. Write module declaration (`src\u002Flanguages\u002F\u003Clanguage>\u002Fmod.rs`):\n   ```rust\n   pub mod engine;\n   pub mod mutations;\n   pub mod syntax;\n   ```\n\n3. Create syntax mappings (`src\u002Flanguages\u002F\u003Clanguage>\u002Fsyntax.rs`):\n   - Use Read to examine `grammars\u002F\u003Clanguage>\u002Fsrc\u002Fnode-types.json`\n   - Map node and field names from the grammar\n   ```rust\n   pub mod nodes {\n       pub const IF_STATEMENT: &str = \"if_statement\";\n       pub const RETURN_STATEMENT: &str = \"return_statement\";\n       \u002F\u002F Add more from node-types.json\n   }\n   \n   pub mod fields {\n       pub const CONDITION: &str = \"condition\";\n       pub const ARGUMENTS: &str = \"arguments\";\n   }\n   ```\n   - For every operator-focused slug (AOS, AAOS, BOS, BAOS, LOS, SAOS, COS), confirm which node kinds the grammar uses for those operators (e.g., `augmented_assignment_expression` versus `binary_expression`). Only plug a node kind into `patterns::shuffle_*` after verifying it in `node-types.json`, and include any language-specific operator tokens (such as Go's `&^=` or JavaScript's `**=`\u002F`>>>=`).\n\n4. Create mutations file (`src\u002Flanguages\u002F\u003Clanguage>\u002Fmutations.rs`):\n   ```rust\n   use crate::types::Mutation;\n   pub const \u003CLANGUAGE>_MUTATIONS: &[Mutation] = &[];\n   ```\n\n5. Implement engine (`src\u002Flanguages\u002F\u003Clanguage>\u002Fengine.rs`):\n   - Use Read on `src\u002Flanguages\u002Frust\u002Fengine.rs` as reference\n   - Follow the 4-method trait pattern:\n   ```rust\n   use std::sync::OnceLock;\n   use tree_sitter::Language as TsLanguage;\n   \n   use crate::LanguageEngine;\n   use crate::mutations::COMMON_MUTATIONS;\n   use crate::patterns;\n   use crate::types::{Mutant, Mutation, Target};\n   use crate::utils::{node_text, parse_source};\n   \n   use super::mutations::\u003CLANGUAGE>_MUTATIONS;\n   use super::syntax::{fields, nodes};\n   \n   static \u003CLANGUAGE>_LANGUAGE: OnceLock\u003CTsLanguage> = OnceLock::new();\n   \n   unsafe extern \"C\" {\n       fn tree_sitter_\u003Clanguage>() -> *const tree_sitter::ffi::TSLanguage;\n   }\n   \n   pub struct \u003CLanguage>LanguageEngine {\n       mutations: Vec\u003CMutation>,\n   }\n   \n   impl \u003CLanguage>LanguageEngine {\n       pub fn new() -> Self {\n           let mut mutations: Vec\u003CMutation> = Vec::new();\n           mutations.extend_from_slice(COMMON_MUTATIONS);\n           mutations.extend_from_slice(\u003CLANGUAGE>_MUTATIONS);\n           Self { mutations }\n       }\n   }\n   \n   impl LanguageEngine for \u003CLanguage>LanguageEngine {\n       fn name(&self) -> &'static str {\n           \"\u003CLanguage>\"\n       }\n   \n       fn extensions(&self) -> &[&'static str] {\n           &[\"\u003Cext>\"]\n       }\n   \n       fn get_mutations(&self) -> &[Mutation] {\n           &self.mutations\n       }\n   \n       fn mutate(&self, target: &Target) -> Vec\u003CMutant> {\n           let source = &target.text;\n           \n           \u002F\u002F Load grammar once and cache it\n           let language = \u003CLANGUAGE>_LANGUAGE\n               .get_or_init(|| unsafe { TsLanguage::from_raw(tree_sitter_\u003Clanguage>()) });\n           \n           let tree = match parse_source(source, language) {\n               Some(t) => t,\n               None => return Vec::new(),\n           };\n           let root = tree.root_node();\n   \n           let mut all_mutants = Vec::new();\n           for m in &self.mutations {\n               match m.slug {\n                   \"ER\" => {\n                       all_mutants.extend(\n                           patterns::replace(\n                               root,\n                               source,\n                               &[nodes::EXPRESSION_STATEMENT, nodes::RETURN_STATEMENT],\n                               \"panic!(\\\"mewt\\\")\",  \u002F\u002F Use language-appropriate error\n                               &|node, src| !node_text(node, src).contains(\"panic!\"),\n                           )\n                           .into_iter()\n                           .map(|p| Mutant::from_partial(p, target, \"ER\")),\n                       )\n                   }\n                   \"IF\" => {\n                       all_mutants.extend(\n                           patterns::replace_condition(\n                               root,\n                               source,\n                               nodes::IF_STATEMENT,\n                               fields::CONDITION,\n                               &[\"if\"],\n                               \"false\",\n                           )\n                           .into_iter()\n                           .map(|p| Mutant::from_partial(p, target, \"IF\")),\n                       )\n                   }\n                   \u002F\u002F Add more mutation patterns - see src\u002Flanguages\u002Frust\u002Fengine.rs\n                   _ => {}\n               }\n           }\n           all_mutants\n       }\n   }\n   \n   impl Default for \u003CLanguage>LanguageEngine {\n       fn default() -> Self {\n           Self::new()\n       }\n   }\n   ```\n\n**Exit Criteria**:\n- [ ] All 4 trait methods implemented\n- [ ] Grammar loaded inline in `mutate()` (no helper methods)\n- [ ] At least ER and IF mutations implemented\n- [ ] Code compiles with `cargo check`\n\n### Phase 4: Language Registration\n\n**Dialect-aware note**: If the language can have multiple dialects under one extension, also wire\u002Fupdate registry resolver metadata and canonical labeling rules so command flows consume one resolved selection object.\n\n**Entry Criteria**: Engine implementation compiles\n\n**Actions**:\n\n1. Use Edit to add module to `src\u002Flanguages\u002Fmod.rs`:\n   ```rust\n   pub mod \u003Clanguage>;\n   ```\n\n2. Use Edit to register in `src\u002Fmain.rs` (find the LanguageRegistry section):\n   ```rust\n   registry.register(mewt::languages::\u003Clanguage>::engine::\u003CLanguage>LanguageEngine::new());\n   ```\n\n**Exit Criteria**:\n- [ ] Module exported in `src\u002Flanguages\u002Fmod.rs`\n- [ ] Engine registered in `src\u002Fmain.rs`\n- [ ] `cargo build --release` succeeds\n\n### Phase 5: Tests and Examples\n\nFor dialect-aware families that share an extension, add:\n- Resolver integration tests proving deterministic selection for ambiguous extension paths.\n- Dialect-divergence tests with at least one construct accepted by one dialect and rejected (or treated differently) by another.\n- Filter\u002Fquery tests using canonical labels\u002Fselectors (no implicit legacy alias guarantees).\n\n**Entry Criteria**: Language builds and registers\n\n**Actions**:\n\n1. Scaffold the test directories:\n   ```bash\n   mkdir -p tests\u002F\u003Clanguage>\u002Fmutations\n   ```\n   The mutation folder must contain one Rust module per slug (for example `tests\u002F\u003Clanguage>\u002Fmutations\u002FAOS.rs`).\n\n2. Write canonical example fixture(s):\n   - Most languages: `tests\u002F\u003Clanguage>\u002Fexample.\u003Cext>`.\n   - JavaScript-family languages: one canonical fixture per supported extension (`example.js`, `example.ts`, `example.jsx`, `example.tsx`) as needed.\n   - Keep examples syntactically valid and representative, but small enough to stay smoke-test friendly.\n\n3. Wire the language into the integration test entrypoint (`tests\u002Flanguages.rs`):\n   ```rust\n   mod \u003Clanguage>;\n   ```\n\n4. Create `tests\u002F\u003Clanguage>\u002Fmod.rs` to expose both integration and per-slug suites:\n   ```rust\n   mod integration_tests;\n   mod mutations;\n   ```\n\n5. Author `tests\u002F\u003Clanguage>\u002Fmutations\u002Fmod.rs` that re-exports every slug module:\n   ```rust\n   #![allow(non_snake_case)]\n\n   #[path = \"AAOS.rs\"]\n   mod aaos;\n   #[path = \"AOS.rs\"]\n   mod aos;\n   \u002F\u002F Repeat for every slug returned by engine.get_mutations()\n   ```\n   - Use uppercase filenames that match the slug (`\u003CSLUG>.rs`) and map to lowercase module names via `#[path = ...]` where needed.\n   - Keep manual slug wiring in `mutations\u002Fmod.rs` in sync with files on disk.\n\n6. For each slug surfaced by `engine.get_mutations()`, create `tests\u002F\u003Clanguage>\u002Fmutations\u002F\u003CSLUG>.rs`:\n   - Prefer inline source fixtures for precise, slug-focused assertions.\n   - Use integration helpers (`create_test_target`, shared slug assertion helpers) rather than duplicating setup code.\n   - For operator families (AAOS\u002FBAOS\u002FSAOS\u002FAOS\u002FBOS\u002FCOS\u002FLOS), cover all supported operators and include negative cases where useful.\n\n7. Create `tests\u002F\u003Clanguage>\u002Fintegration_tests.rs` with this pattern:\n   - Define a thin `create_test_target(...)` wrapper that delegates to `tests\u002Futils.rs`.\n   - Run `conformance::run_common_language_checks(...)` for baseline behavior.\n   - Add canonical example-file smoke tests (`!mutants.is_empty()`).\n   - Add only language-specific integration assertions beyond conformance (for example parser edge cases).\n\n8. Update the guard in `tests\u002Flanguages.rs` so the new language participates in per-slug coverage checks (import the engine and add a `check_language(...)` call).\n\n**Exit Criteria**:\n- [ ] Canonical example fixture(s) created at `tests\u002F\u003Clanguage>\u002Fexample.\u003Cext>` (or JavaScript `example.*` set)\n- [ ] Integration and per-slug test modules compiled into `tests\u002Flanguages.rs`\n- [ ] (Dialect-aware only) Resolver tests cover deterministic extension resolution and canonical dialect labeling\n- [ ] (Dialect-aware only) Divergence tests assert meaningful behavior differences between dialects\n- [ ] `tests\u002F\u003Clanguage>\u002Fintegration_tests.rs` runs `run_common_language_checks(...)`\n- [ ] Every slug exposed by the engine has a dedicated test module under `tests\u002F\u003Clanguage>\u002Fmutations`\n- [ ] Guard test passes without missing or unexpected modules\n- [ ] `cargo test` (or `just test`) passes the full suite\n\n### Phase 6: Validation\n\n**Entry Criteria**: All tests pass\n\n**Actions**:\n\n1. Build release binary:\n   ```bash\n   cargo build --release\n   ```\n\n2. Verify mutations are registered:\n   ```bash\n   .\u002Ftarget\u002Frelease\u002Fmewt print mutations --language \u003Clanguage>\n   ```\n   - Should list COMMON_MUTATIONS (ER, CR, IF, etc.)\n\n3. Generate and verify mutants:\n   ```bash\n   .\u002Ftarget\u002Frelease\u002Fmewt print mutants --target tests\u002F\u003Clanguage>\u002Fexample.\u003Cext>\n   ```\n   - Verify reasonable number of mutants\n   - Check mutations are diverse (ER, IF, CR, etc.)\n   - Verify line numbers are accurate\n\n4. Run full test suite:\n   ```bash\n   just test\n   ```\n\n**Exit Criteria**:\n- [ ] `cargo build --release` succeeds\n- [ ] `mewt print mutations --language \u003Clanguage>` lists mutations\n- [ ] `mewt print mutants` generates mutants from example file\n- [ ] All tests pass with `just test`\n- [ ] No warnings with `cargo check`\n\n## API Quick Reference\n\n### The 4-Method Trait\n\n```rust\npub trait LanguageEngine: Send + Sync {\n    fn name(&self) -> &'static str;              \u002F\u002F Language name\n    fn extensions(&self) -> &[&'static str];     \u002F\u002F File extensions\n    fn get_mutations(&self) -> &[Mutation];      \u002F\u002F Available mutations\n    fn mutate(&self, target: &Target) -> Vec\u003CMutant>;  \u002F\u002F Generate mutants\n}\n```\n\n**Key changes from older versions:**\n- ✅ `mutate()` replaces `apply_all_mutations()`\n- ✅ No `tree_sitter_language()` method - load grammar inline\n- ✅ No helper methods - keep implementations minimal\n\n### Common Mutation Patterns\n\nUse Read on `src\u002Flanguages\u002Frust\u002Fengine.rs` for complete examples of:\n\n| Slug | Pattern | Purpose |\n|------|---------|---------|\n| ER | `patterns::replace()` | Replace statements with errors |\n| CR | `patterns::replace()` | Replace statements with comments |\n| IF | `patterns::replace_condition()` | Replace if conditions with false |\n| IT | `patterns::replace_condition()` | Replace if conditions with true |\n| WF | `patterns::replace_condition()` | Replace while conditions with false |\n| LC | `patterns::swap_branches()` | Swap true\u002Ffalse branches |\n| BL | `patterns::replace()` | Replace boolean literals |\n| AOS | `patterns::replace_operator()` | Replace arithmetic operators |\n| BOS | `patterns::replace_operator()` | Replace bitwise operators |\n| LOS | `patterns::replace_operator()` | Replace logical operators |\n| COS | `patterns::replace_operator()` | Replace comparison operators |\n\n## Common Pitfalls\n\n### Node Type Mismatches\n\n**Problem**: Using documentation names instead of actual grammar names  \n**Solution**: Always verify in `grammars\u002F\u003Clanguage>\u002Fsrc\u002Fnode-types.json`\n\n### FFI Function Naming\n\n**Problem**: Incorrect external function name  \n**Solution**: Must be exactly `tree_sitter_\u003Clanguage>` (all lowercase, underscores for hyphens)\n\n### Missing Scanner\n\n**Problem**: Build fails during C compilation  \n**Solution**: Some grammars need `scanner.c` - the update script handles this automatically\n\n### Over-Engineering\n\n**Problem**: Adding helper methods, custom parsing logic  \n**Solution**: Keep it minimal - just implement the 4 trait methods\n\n### Too Many Custom Mutations\n\n**Problem**: Adding language-specific mutations before verifying common ones work  \n**Solution**: Start with COMMON_MUTATIONS only. Most languages need zero custom mutations.\n\n### Compound Assignment Node Kinds\n\n**Problem**: Assuming compound assignments share the `binary_expression` node kind  \n**Solution**: Check `node-types.json` for the exact node kind (e.g., `augmented_assignment_expression`, `compound_assignment_expr`) and wire AAOS\u002FBAOS\u002FSAOS to that. Include all language-specific operator tokens when configuring `patterns::shuffle_operators`.\n\n## Success Checklist\n\n### Dialect-Aware Extension Checklist (apply when relevant)\n- [ ] Resolver owns final language+dialect selection (no command-level branching)\n- [ ] Canonical dialect labels\u002Fselectors are documented and used consistently\n- [ ] Ambiguous extension handling is deterministic and test-covered\n- [ ] Dialect-divergence behavior is explicit and test-enforced\n- [ ] Store\u002Ffilter behavior uses canonical labels without assuming legacy alias support\n\n## Success Checklist\n\n- [ ] Grammar files extracted to `grammars\u002F\u003Clanguage>\u002Fsrc\u002F`\n- [ ] Build system updated in `build.rs`\n- [ ] Module structure created (mod.rs, syntax.rs, mutations.rs, engine.rs)\n- [ ] Syntax mappings verified from node-types.json\n- [ ] Engine implements exactly 4 trait methods (no extras)\n- [ ] Grammar loaded inline in `mutate()` using OnceLock\n- [ ] Language registered in src\u002Flanguages\u002Fmod.rs and src\u002Fmain.rs\n- [ ] Example files created with diverse syntax\n- [ ] Integration tests written and passing\n- [ ] `cargo build --release` succeeds without warnings\n- [ ] `mewt print mutations --language \u003Clanguage>` works\n- [ ] `mewt print mutants` generates mutants from examples\n- [ ] All tests pass with `just test`\n\n## Example: Adding Go Support\n\nCondensed walkthrough assuming tree-sitter-go URL is known:\n\n```bash\n# Phase 1: Edit grammars\u002Fupdate.sh to add go configuration, then:\ncd grammars && bash update.sh go false\n\n# Phase 2: Edit build.rs to add build_grammar call for go\n\n# Phase 3: Create language implementation\nmkdir -p src\u002Flanguages\u002Fgo\n# Create mod.rs, syntax.rs, mutations.rs, engine.rs\n\n# Phase 4: Edit src\u002Flanguages\u002Fmod.rs to export go module\n# Edit src\u002Fmain.rs to register GoLanguageEngine\n\n# Phase 5: Create tests\nmkdir -p tests\u002Fgo\u002Fexamples\n# Create example.go and integration_tests.rs\n\n# Phase 6: Validate\ncargo build --release\n.\u002Ftarget\u002Frelease\u002Fmewt print mutations --language go\n.\u002Ftarget\u002Frelease\u002Fmewt print mutants --target tests\u002Fgo\u002Fexample.go\njust test\n```\n",{"data":35,"body":46},{"name":4,"description":6,"license":26,"metadata":36,"allowed-tools":39},{"author":11,"version":37,"mewt-version":38},"1.1",">=2.0.0",[40,41,42,43,44,45],"Read","Write","Edit","Bash","Glob","AskUserQuestion",{"type":47,"children":48},"root",[49,58,64,71,76,101,107,127,137,143,153,163,173,206,216,242,268,323,333,338,361,366,403,409,416,426,436,708,717,786,792,801,809,883,891,921,927,936,944,2160,2168,2221,2227,2237,2246,2254,2310,2318,2366,2372,2377,2395,2404,2412,2833,2841,2970,2976,2985,2993,3203,3211,3289,3295,3301,3355,3363,3402,3408,3419,3687,3693,3699,3724,3730,3756,3762,3787,3793,3811,3817,3835,3841,3894,3900,3906,3955,3960,4119,4125,4130,4382],{"type":50,"tag":51,"props":52,"children":54},"element","h1",{"id":53},"adding-language-support-to-mewt",[55],{"type":56,"value":57},"text","Adding Language Support to Mewt",{"type":50,"tag":59,"props":60,"children":61},"p",{},[62],{"type":56,"value":63},"Implements mutation testing support for new programming languages using tree-sitter grammars and the LanguageEngine trait.",{"type":50,"tag":65,"props":66,"children":68},"h2",{"id":67},"when-to-use",[69],{"type":56,"value":70},"When to Use",{"type":50,"tag":59,"props":72,"children":73},{},[74],{"type":56,"value":75},"Use this skill when:",{"type":50,"tag":77,"props":78,"children":79},"ul",{},[80,86,91,96],{"type":50,"tag":81,"props":82,"children":83},"li",{},[84],{"type":56,"value":85},"Adding support for a new programming language (Python, JavaScript, Go, etc.)",{"type":50,"tag":81,"props":87,"children":88},{},[89],{"type":56,"value":90},"Implementing tree-sitter grammar integration",{"type":50,"tag":81,"props":92,"children":93},{},[94],{"type":56,"value":95},"User asks to \"add language support\" or \"implement X language\"",{"type":50,"tag":81,"props":97,"children":98},{},[99],{"type":56,"value":100},"Extending mewt's language capabilities",{"type":50,"tag":65,"props":102,"children":104},{"id":103},"when-not-to-use",[105],{"type":56,"value":106},"When NOT to Use",{"type":50,"tag":59,"props":108,"children":109},{},[110,116,118,125],{"type":50,"tag":111,"props":112,"children":113},"strong",{},[114],{"type":56,"value":115},"Don't use for using mewt:",{"type":56,"value":117}," If the user wants to USE mewt for mutation testing (not add language support), use the ",{"type":50,"tag":119,"props":120,"children":122},"code",{"className":121},[],[123],{"type":56,"value":124},"mewt",{"type":56,"value":126}," skill instead.",{"type":50,"tag":59,"props":128,"children":129},{},[130,135],{"type":50,"tag":111,"props":131,"children":132},{},[133],{"type":56,"value":134},"Don't use for grammar development:",{"type":56,"value":136}," This assumes a tree-sitter grammar already exists. If no grammar exists, that's a separate specialized task beyond this skill's scope.",{"type":50,"tag":65,"props":138,"children":140},{"id":139},"essential-principles",[141],{"type":56,"value":142},"Essential Principles",{"type":50,"tag":59,"props":144,"children":145},{},[146,151],{"type":50,"tag":111,"props":147,"children":148},{},[149],{"type":56,"value":150},"Grammar First",{"type":56,"value":152},": Never attempt to write a tree-sitter grammar from scratch. Always find and verify an existing tree-sitter grammar repository before proceeding. Grammar development requires specialized expertise.",{"type":50,"tag":59,"props":154,"children":155},{},[156,161],{"type":50,"tag":111,"props":157,"children":158},{},[159],{"type":56,"value":160},"API Simplicity",{"type":56,"value":162},": The LanguageEngine trait has only 4 methods. Keep implementations minimal - no helper methods, just the trait interface and inline grammar loading.",{"type":50,"tag":59,"props":164,"children":165},{},[166,171],{"type":50,"tag":111,"props":167,"children":168},{},[169],{"type":56,"value":170},"Resolver First (Dialect-Aware Families)",{"type":56,"value":172},": If a language family has multiple dialects sharing an extension, resolution must be owned by the registry\u002Fresolver layer (precedence, canonical labeling, deterministic ambiguity handling). Do not add command-specific branching for final language+dialect selection.",{"type":50,"tag":59,"props":174,"children":175},{},[176,181,183,189,191,197,198,204],{"type":50,"tag":111,"props":177,"children":178},{},[179],{"type":56,"value":180},"Canonical Labels Only",{"type":56,"value":182},": For dialect-aware families, use canonical selectors\u002Flabels (e.g., ",{"type":50,"tag":119,"props":184,"children":186},{"className":185},[],[187],{"type":56,"value":188},"move",{"type":56,"value":190},", ",{"type":50,"tag":119,"props":192,"children":194},{"className":193},[],[195],{"type":56,"value":196},"move\u002Fsui",{"type":56,"value":190},{"type":50,"tag":119,"props":199,"children":201},{"className":200},[],[202],{"type":56,"value":203},"move\u002Fiota",{"type":56,"value":205},") and avoid introducing legacy alias compatibility unless explicitly requested.",{"type":50,"tag":59,"props":207,"children":208},{},[209,214],{"type":50,"tag":111,"props":210,"children":211},{},[212],{"type":56,"value":213},"Common First",{"type":56,"value":215},": Start with COMMON_MUTATIONS only. Add language-specific mutations only for unique constructs not covered by common patterns. Most languages need zero custom mutations.",{"type":50,"tag":59,"props":217,"children":218},{},[219,224,226,232,234,240],{"type":50,"tag":111,"props":220,"children":221},{},[222],{"type":56,"value":223},"Per-Slug Mutation Tests",{"type":56,"value":225},": Every mutation slug exposed by the engine must have a dedicated test module under ",{"type":50,"tag":119,"props":227,"children":229},{"className":228},[],[230],{"type":56,"value":231},"tests\u002F\u003Clanguage>\u002Fmutations\u002F\u003CSLUG>.rs",{"type":56,"value":233},". The guard test in ",{"type":50,"tag":119,"props":235,"children":237},{"className":236},[],[238],{"type":56,"value":239},"tests\u002Flanguages.rs",{"type":56,"value":241}," enforces this convention. New languages must be wired into the guard before landing.",{"type":50,"tag":59,"props":243,"children":244},{},[245,250,252,258,260,266],{"type":50,"tag":111,"props":246,"children":247},{},[248],{"type":56,"value":249},"Integration Conformance First",{"type":56,"value":251},": Every language ",{"type":50,"tag":119,"props":253,"children":255},{"className":254},[],[256],{"type":56,"value":257},"tests\u002F\u003Clanguage>\u002Fintegration_tests.rs",{"type":56,"value":259}," must run the shared conformance harness from ",{"type":50,"tag":119,"props":261,"children":263},{"className":262},[],[264],{"type":56,"value":265},"tests\u002Fconformance.rs",{"type":56,"value":267},", then add language-specific integration assertions as needed.",{"type":50,"tag":59,"props":269,"children":270},{},[271,276,278,284,286,292,293,299,300,306,307,313,315,321],{"type":50,"tag":111,"props":272,"children":273},{},[274],{"type":56,"value":275},"Example Fixture Policy",{"type":56,"value":277},": Keep canonical example fixtures at ",{"type":50,"tag":119,"props":279,"children":281},{"className":280},[],[282],{"type":56,"value":283},"tests\u002F\u003Clanguage>\u002Fexample.\u003Cext>",{"type":56,"value":285}," (JavaScript may keep multiple canonical fixtures: ",{"type":50,"tag":119,"props":287,"children":289},{"className":288},[],[290],{"type":56,"value":291},"example.js",{"type":56,"value":190},{"type":50,"tag":119,"props":294,"children":296},{"className":295},[],[297],{"type":56,"value":298},"example.ts",{"type":56,"value":190},{"type":50,"tag":119,"props":301,"children":303},{"className":302},[],[304],{"type":56,"value":305},"example.jsx",{"type":56,"value":190},{"type":50,"tag":119,"props":308,"children":310},{"className":309},[],[311],{"type":56,"value":312},"example.tsx",{"type":56,"value":314},"). Integration tests should treat these as smoke checks (",{"type":50,"tag":119,"props":316,"children":318},{"className":317},[],[319],{"type":56,"value":320},"!mutants.is_empty()",{"type":56,"value":322},"), while per-slug tests should use inline fixtures for precise assertions.",{"type":50,"tag":59,"props":324,"children":325},{},[326,331],{"type":50,"tag":111,"props":327,"children":328},{},[329],{"type":56,"value":330},"Verification Required",{"type":56,"value":332},": Each phase has explicit exit criteria. Do not proceed to the next phase until all validation passes.",{"type":50,"tag":65,"props":334,"children":336},{"id":335},"when-to-use-1",[337],{"type":56,"value":70},{"type":50,"tag":77,"props":339,"children":340},{},[341,346,351,356],{"type":50,"tag":81,"props":342,"children":343},{},[344],{"type":56,"value":345},"User explicitly requests adding support for a specific programming language",{"type":50,"tag":81,"props":347,"children":348},{},[349],{"type":56,"value":350},"User mentions \"add language support\" or \"new language\"",{"type":50,"tag":81,"props":352,"children":353},{},[354],{"type":56,"value":355},"User provides a tree-sitter grammar repository URL",{"type":50,"tag":81,"props":357,"children":358},{},[359],{"type":56,"value":360},"User asks how to extend mewt with new languages",{"type":50,"tag":65,"props":362,"children":364},{"id":363},"when-not-to-use-1",[365],{"type":56,"value":106},{"type":50,"tag":77,"props":367,"children":368},{},[369,382,387,398],{"type":50,"tag":81,"props":370,"children":371},{},[372,374,380],{"type":56,"value":373},"Language already supported (check ",{"type":50,"tag":119,"props":375,"children":377},{"className":376},[],[378],{"type":56,"value":379},"src\u002Flanguages\u002F",{"type":56,"value":381},") - use existing implementation",{"type":50,"tag":81,"props":383,"children":384},{},[385],{"type":56,"value":386},"User wants to modify existing language support - use general code editing",{"type":50,"tag":81,"props":388,"children":389},{},[390,392],{"type":56,"value":391},"User wants to add mutations to existing language - edit ",{"type":50,"tag":119,"props":393,"children":395},{"className":394},[],[396],{"type":56,"value":397},"src\u002Flanguages\u002F\u003Clang>\u002Fmutations.rs",{"type":50,"tag":81,"props":399,"children":400},{},[401],{"type":56,"value":402},"No tree-sitter grammar exists - inform user and halt (cannot create grammars)",{"type":50,"tag":65,"props":404,"children":406},{"id":405},"linear-progression",[407],{"type":56,"value":408},"Linear Progression",{"type":50,"tag":410,"props":411,"children":413},"h3",{"id":412},"phase-1-grammar-acquisition",[414],{"type":56,"value":415},"Phase 1: Grammar Acquisition",{"type":50,"tag":59,"props":417,"children":418},{},[419,424],{"type":50,"tag":111,"props":420,"children":421},{},[422],{"type":56,"value":423},"Entry Criteria",{"type":56,"value":425},": User has requested language support",{"type":50,"tag":59,"props":427,"children":428},{},[429,434],{"type":50,"tag":111,"props":430,"children":431},{},[432],{"type":56,"value":433},"Actions",{"type":56,"value":435},":",{"type":50,"tag":437,"props":438,"children":439},"ol",{},[440,479,641],{"type":50,"tag":81,"props":441,"children":442},{},[443,445],{"type":56,"value":444},"Check if tree-sitter grammar repository URL is provided",{"type":50,"tag":77,"props":446,"children":447},{},[448,474],{"type":50,"tag":81,"props":449,"children":450},{},[451,453],{"type":56,"value":452},"If not, ask user with common patterns:\n",{"type":50,"tag":77,"props":454,"children":455},{},[456,465],{"type":50,"tag":81,"props":457,"children":458},{},[459],{"type":50,"tag":119,"props":460,"children":462},{"className":461},[],[463],{"type":56,"value":464},"https:\u002F\u002Fgithub.com\u002Ftree-sitter\u002Ftree-sitter-\u003Clanguage>",{"type":50,"tag":81,"props":466,"children":467},{},[468],{"type":50,"tag":119,"props":469,"children":471},{"className":470},[],[472],{"type":56,"value":473},"https:\u002F\u002Fgithub.com\u002F\u003Cmaintainer>\u002Ftree-sitter-\u003Clanguage>",{"type":50,"tag":81,"props":475,"children":476},{},[477],{"type":56,"value":478},"Offer to search the web if needed",{"type":50,"tag":81,"props":480,"children":481},{},[482,484,490,492],{"type":56,"value":483},"Once URL confirmed, use Edit to add to ",{"type":50,"tag":119,"props":485,"children":487},{"className":486},[],[488],{"type":56,"value":489},"grammars\u002Fupdate.sh",{"type":56,"value":491}," (lines 15-23):",{"type":50,"tag":493,"props":494,"children":499},"pre",{"className":495,"code":496,"language":497,"meta":498,"style":498},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","declare -A REPO_URLS=(\n  [\"\u003Clanguage>\"]=\"\u003Ctree-sitter-repo-url>\"\n)\n\ndeclare -A GRAMMAR_PATHS=(\n  [\"\u003Clanguage>\"]=\"\"  # or subdirectory if nested\n)\n","bash","",[500],{"type":50,"tag":119,"props":501,"children":502},{"__ignoreMap":498},[503,533,566,575,585,606,633],{"type":50,"tag":504,"props":505,"children":508},"span",{"class":506,"line":507},"line",1,[509,515,521,527],{"type":50,"tag":504,"props":510,"children":512},{"style":511},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[513],{"type":56,"value":514},"declare",{"type":50,"tag":504,"props":516,"children":518},{"style":517},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[519],{"type":56,"value":520}," -A",{"type":50,"tag":504,"props":522,"children":524},{"style":523},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[525],{"type":56,"value":526}," REPO_URLS",{"type":50,"tag":504,"props":528,"children":530},{"style":529},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[531],{"type":56,"value":532},"=(\n",{"type":50,"tag":504,"props":534,"children":535},{"class":506,"line":27},[536,541,546,551,556,561],{"type":50,"tag":504,"props":537,"children":538},{"style":529},[539],{"type":56,"value":540},"  [",{"type":50,"tag":504,"props":542,"children":543},{"style":511},[544],{"type":56,"value":545},"\"\u003Clanguage>\"",{"type":50,"tag":504,"props":547,"children":548},{"style":529},[549],{"type":56,"value":550},"]=",{"type":50,"tag":504,"props":552,"children":553},{"style":529},[554],{"type":56,"value":555},"\"",{"type":50,"tag":504,"props":557,"children":558},{"style":517},[559],{"type":56,"value":560},"\u003Ctree-sitter-repo-url>",{"type":50,"tag":504,"props":562,"children":563},{"style":529},[564],{"type":56,"value":565},"\"\n",{"type":50,"tag":504,"props":567,"children":569},{"class":506,"line":568},3,[570],{"type":50,"tag":504,"props":571,"children":572},{"style":529},[573],{"type":56,"value":574},")\n",{"type":50,"tag":504,"props":576,"children":578},{"class":506,"line":577},4,[579],{"type":50,"tag":504,"props":580,"children":582},{"emptyLinePlaceholder":581},true,[583],{"type":56,"value":584},"\n",{"type":50,"tag":504,"props":586,"children":588},{"class":506,"line":587},5,[589,593,597,602],{"type":50,"tag":504,"props":590,"children":591},{"style":511},[592],{"type":56,"value":514},{"type":50,"tag":504,"props":594,"children":595},{"style":517},[596],{"type":56,"value":520},{"type":50,"tag":504,"props":598,"children":599},{"style":523},[600],{"type":56,"value":601}," GRAMMAR_PATHS",{"type":50,"tag":504,"props":603,"children":604},{"style":529},[605],{"type":56,"value":532},{"type":50,"tag":504,"props":607,"children":609},{"class":506,"line":608},6,[610,614,618,622,627],{"type":50,"tag":504,"props":611,"children":612},{"style":529},[613],{"type":56,"value":540},{"type":50,"tag":504,"props":615,"children":616},{"style":511},[617],{"type":56,"value":545},{"type":50,"tag":504,"props":619,"children":620},{"style":529},[621],{"type":56,"value":550},{"type":50,"tag":504,"props":623,"children":624},{"style":529},[625],{"type":56,"value":626},"\"\"",{"type":50,"tag":504,"props":628,"children":630},{"style":629},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[631],{"type":56,"value":632},"  # or subdirectory if nested\n",{"type":50,"tag":504,"props":634,"children":636},{"class":506,"line":635},7,[637],{"type":50,"tag":504,"props":638,"children":639},{"style":529},[640],{"type":56,"value":574},{"type":50,"tag":81,"props":642,"children":643},{},[644,646],{"type":56,"value":645},"Run grammar extraction:",{"type":50,"tag":493,"props":647,"children":649},{"className":495,"code":648,"language":497,"meta":498,"style":498},"cd grammars && bash update.sh \u003Clanguage> false\n",[650],{"type":50,"tag":119,"props":651,"children":652},{"__ignoreMap":498},[653],{"type":50,"tag":504,"props":654,"children":655},{"class":506,"line":507},[656,662,667,672,678,683,688,693,698,703],{"type":50,"tag":504,"props":657,"children":659},{"style":658},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[660],{"type":56,"value":661},"cd",{"type":50,"tag":504,"props":663,"children":664},{"style":517},[665],{"type":56,"value":666}," grammars",{"type":50,"tag":504,"props":668,"children":669},{"style":529},[670],{"type":56,"value":671}," &&",{"type":50,"tag":504,"props":673,"children":675},{"style":674},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[676],{"type":56,"value":677}," bash",{"type":50,"tag":504,"props":679,"children":680},{"style":517},[681],{"type":56,"value":682}," update.sh",{"type":50,"tag":504,"props":684,"children":685},{"style":529},[686],{"type":56,"value":687}," \u003C",{"type":50,"tag":504,"props":689,"children":690},{"style":517},[691],{"type":56,"value":692},"languag",{"type":50,"tag":504,"props":694,"children":695},{"style":523},[696],{"type":56,"value":697},"e",{"type":50,"tag":504,"props":699,"children":700},{"style":529},[701],{"type":56,"value":702},">",{"type":50,"tag":504,"props":704,"children":705},{"style":529},[706],{"type":56,"value":707}," false\n",{"type":50,"tag":59,"props":709,"children":710},{},[711,716],{"type":50,"tag":111,"props":712,"children":713},{},[714],{"type":56,"value":715},"Exit Criteria",{"type":56,"value":435},{"type":50,"tag":77,"props":718,"children":721},{"className":719},[720],"contains-task-list",[722,740,764],{"type":50,"tag":81,"props":723,"children":726},{"className":724},[725],"task-list-item",[727,732,734],{"type":50,"tag":728,"props":729,"children":731},"input",{"disabled":581,"type":730},"checkbox",[],{"type":56,"value":733}," Grammar files exist in ",{"type":50,"tag":119,"props":735,"children":737},{"className":736},[],[738],{"type":56,"value":739},"grammars\u002F\u003Clanguage>\u002Fsrc\u002F",{"type":50,"tag":81,"props":741,"children":743},{"className":742},[725],[744,747,749,755,756,762],{"type":50,"tag":728,"props":745,"children":746},{"disabled":581,"type":730},[],{"type":56,"value":748}," Must have: ",{"type":50,"tag":119,"props":750,"children":752},{"className":751},[],[753],{"type":56,"value":754},"parser.c",{"type":56,"value":190},{"type":50,"tag":119,"props":757,"children":759},{"className":758},[],[760],{"type":56,"value":761},"tree_sitter\u002F",{"type":56,"value":763}," directory",{"type":50,"tag":81,"props":765,"children":767},{"className":766},[725],[768,771,773,779,780],{"type":50,"tag":728,"props":769,"children":770},{"disabled":581,"type":730},[],{"type":56,"value":772}," May have: ",{"type":50,"tag":119,"props":774,"children":776},{"className":775},[],[777],{"type":56,"value":778},"scanner.c",{"type":56,"value":190},{"type":50,"tag":119,"props":781,"children":783},{"className":782},[],[784],{"type":56,"value":785},"node-types.json",{"type":50,"tag":410,"props":787,"children":789},{"id":788},"phase-2-build-system-integration",[790],{"type":56,"value":791},"Phase 2: Build System Integration",{"type":50,"tag":59,"props":793,"children":794},{},[795,799],{"type":50,"tag":111,"props":796,"children":797},{},[798],{"type":56,"value":423},{"type":56,"value":800},": Grammar files extracted successfully",{"type":50,"tag":59,"props":802,"children":803},{},[804,808],{"type":50,"tag":111,"props":805,"children":806},{},[807],{"type":56,"value":433},{"type":56,"value":435},{"type":50,"tag":437,"props":810,"children":811},{},[812,858],{"type":50,"tag":81,"props":813,"children":814},{},[815,817,823,825],{"type":56,"value":816},"Use Edit to add build configuration to ",{"type":50,"tag":119,"props":818,"children":820},{"className":819},[],[821],{"type":56,"value":822},"build.rs",{"type":56,"value":824}," after line 57:",{"type":50,"tag":493,"props":826,"children":830},{"className":827,"code":828,"language":829,"meta":498,"style":498},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Build \u003CLanguage> grammar\nlet \u003Clanguage>_dir: PathBuf = [\"grammars\", \"\u003Clanguage>\", \"src\"].iter().collect();\nbuild_grammar(&\u003Clanguage>_dir, \"tree-sitter-\u003Clanguage>\");\n","rust",[831],{"type":50,"tag":119,"props":832,"children":833},{"__ignoreMap":498},[834,842,850],{"type":50,"tag":504,"props":835,"children":836},{"class":506,"line":507},[837],{"type":50,"tag":504,"props":838,"children":839},{},[840],{"type":56,"value":841},"\u002F\u002F Build \u003CLanguage> grammar\n",{"type":50,"tag":504,"props":843,"children":844},{"class":506,"line":27},[845],{"type":50,"tag":504,"props":846,"children":847},{},[848],{"type":56,"value":849},"let \u003Clanguage>_dir: PathBuf = [\"grammars\", \"\u003Clanguage>\", \"src\"].iter().collect();\n",{"type":50,"tag":504,"props":851,"children":852},{"class":506,"line":568},[853],{"type":50,"tag":504,"props":854,"children":855},{},[856],{"type":56,"value":857},"build_grammar(&\u003Clanguage>_dir, \"tree-sitter-\u003Clanguage>\");\n",{"type":50,"tag":81,"props":859,"children":860},{},[861,863],{"type":56,"value":862},"Verify compilation:",{"type":50,"tag":493,"props":864,"children":866},{"className":495,"code":865,"language":497,"meta":498,"style":498},"cargo check\n",[867],{"type":50,"tag":119,"props":868,"children":869},{"__ignoreMap":498},[870],{"type":50,"tag":504,"props":871,"children":872},{"class":506,"line":507},[873,878],{"type":50,"tag":504,"props":874,"children":875},{"style":674},[876],{"type":56,"value":877},"cargo",{"type":50,"tag":504,"props":879,"children":880},{"style":517},[881],{"type":56,"value":882}," check\n",{"type":50,"tag":59,"props":884,"children":885},{},[886,890],{"type":50,"tag":111,"props":887,"children":888},{},[889],{"type":56,"value":715},{"type":56,"value":435},{"type":50,"tag":77,"props":892,"children":894},{"className":893},[720],[895,912],{"type":50,"tag":81,"props":896,"children":898},{"className":897},[725],[899,902,904,910],{"type":50,"tag":728,"props":900,"children":901},{"disabled":581,"type":730},[],{"type":56,"value":903}," ",{"type":50,"tag":119,"props":905,"children":907},{"className":906},[],[908],{"type":56,"value":909},"cargo check",{"type":56,"value":911}," completes without errors",{"type":50,"tag":81,"props":913,"children":915},{"className":914},[725],[916,919],{"type":50,"tag":728,"props":917,"children":918},{"disabled":581,"type":730},[],{"type":56,"value":920}," Grammar library compiles successfully",{"type":50,"tag":410,"props":922,"children":924},{"id":923},"phase-3-language-engine-implementation",[925],{"type":56,"value":926},"Phase 3: Language Engine Implementation",{"type":50,"tag":59,"props":928,"children":929},{},[930,934],{"type":50,"tag":111,"props":931,"children":932},{},[933],{"type":56,"value":423},{"type":56,"value":935},": Grammar builds successfully",{"type":50,"tag":59,"props":937,"children":938},{},[939,943],{"type":50,"tag":111,"props":940,"children":941},{},[942],{"type":56,"value":433},{"type":56,"value":435},{"type":50,"tag":437,"props":945,"children":946},{},[947,995,1039,1221,1256],{"type":50,"tag":81,"props":948,"children":949},{},[950,952],{"type":56,"value":951},"Create language module structure:",{"type":50,"tag":493,"props":953,"children":955},{"className":495,"code":954,"language":497,"meta":498,"style":498},"mkdir -p src\u002Flanguages\u002F\u003Clanguage>\n",[956],{"type":50,"tag":119,"props":957,"children":958},{"__ignoreMap":498},[959],{"type":50,"tag":504,"props":960,"children":961},{"class":506,"line":507},[962,967,972,977,982,986,990],{"type":50,"tag":504,"props":963,"children":964},{"style":674},[965],{"type":56,"value":966},"mkdir",{"type":50,"tag":504,"props":968,"children":969},{"style":517},[970],{"type":56,"value":971}," -p",{"type":50,"tag":504,"props":973,"children":974},{"style":517},[975],{"type":56,"value":976}," src\u002Flanguages\u002F",{"type":50,"tag":504,"props":978,"children":979},{"style":529},[980],{"type":56,"value":981},"\u003C",{"type":50,"tag":504,"props":983,"children":984},{"style":517},[985],{"type":56,"value":692},{"type":50,"tag":504,"props":987,"children":988},{"style":523},[989],{"type":56,"value":697},{"type":50,"tag":504,"props":991,"children":992},{"style":529},[993],{"type":56,"value":994},">\n",{"type":50,"tag":81,"props":996,"children":997},{},[998,1000,1006,1008],{"type":56,"value":999},"Write module declaration (",{"type":50,"tag":119,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":56,"value":1005},"src\u002Flanguages\u002F\u003Clanguage>\u002Fmod.rs",{"type":56,"value":1007},"):",{"type":50,"tag":493,"props":1009,"children":1011},{"className":827,"code":1010,"language":829,"meta":498,"style":498},"pub mod engine;\npub mod mutations;\npub mod syntax;\n",[1012],{"type":50,"tag":119,"props":1013,"children":1014},{"__ignoreMap":498},[1015,1023,1031],{"type":50,"tag":504,"props":1016,"children":1017},{"class":506,"line":507},[1018],{"type":50,"tag":504,"props":1019,"children":1020},{},[1021],{"type":56,"value":1022},"pub mod engine;\n",{"type":50,"tag":504,"props":1024,"children":1025},{"class":506,"line":27},[1026],{"type":50,"tag":504,"props":1027,"children":1028},{},[1029],{"type":56,"value":1030},"pub mod mutations;\n",{"type":50,"tag":504,"props":1032,"children":1033},{"class":506,"line":568},[1034],{"type":50,"tag":504,"props":1035,"children":1036},{},[1037],{"type":56,"value":1038},"pub mod syntax;\n",{"type":50,"tag":81,"props":1040,"children":1041},{},[1042,1044,1050,1051,1070,1158],{"type":56,"value":1043},"Create syntax mappings (",{"type":50,"tag":119,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":56,"value":1049},"src\u002Flanguages\u002F\u003Clanguage>\u002Fsyntax.rs",{"type":56,"value":1007},{"type":50,"tag":77,"props":1052,"children":1053},{},[1054,1065],{"type":50,"tag":81,"props":1055,"children":1056},{},[1057,1059],{"type":56,"value":1058},"Use Read to examine ",{"type":50,"tag":119,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":56,"value":1064},"grammars\u002F\u003Clanguage>\u002Fsrc\u002Fnode-types.json",{"type":50,"tag":81,"props":1066,"children":1067},{},[1068],{"type":56,"value":1069},"Map node and field names from the grammar",{"type":50,"tag":493,"props":1071,"children":1073},{"className":827,"code":1072,"language":829,"meta":498,"style":498},"pub mod nodes {\n    pub const IF_STATEMENT: &str = \"if_statement\";\n    pub const RETURN_STATEMENT: &str = \"return_statement\";\n    \u002F\u002F Add more from node-types.json\n}\n\npub mod fields {\n    pub const CONDITION: &str = \"condition\";\n    pub const ARGUMENTS: &str = \"arguments\";\n}\n",[1074],{"type":50,"tag":119,"props":1075,"children":1076},{"__ignoreMap":498},[1077,1085,1093,1101,1109,1117,1124,1132,1141,1150],{"type":50,"tag":504,"props":1078,"children":1079},{"class":506,"line":507},[1080],{"type":50,"tag":504,"props":1081,"children":1082},{},[1083],{"type":56,"value":1084},"pub mod nodes {\n",{"type":50,"tag":504,"props":1086,"children":1087},{"class":506,"line":27},[1088],{"type":50,"tag":504,"props":1089,"children":1090},{},[1091],{"type":56,"value":1092},"    pub const IF_STATEMENT: &str = \"if_statement\";\n",{"type":50,"tag":504,"props":1094,"children":1095},{"class":506,"line":568},[1096],{"type":50,"tag":504,"props":1097,"children":1098},{},[1099],{"type":56,"value":1100},"    pub const RETURN_STATEMENT: &str = \"return_statement\";\n",{"type":50,"tag":504,"props":1102,"children":1103},{"class":506,"line":577},[1104],{"type":50,"tag":504,"props":1105,"children":1106},{},[1107],{"type":56,"value":1108},"    \u002F\u002F Add more from node-types.json\n",{"type":50,"tag":504,"props":1110,"children":1111},{"class":506,"line":587},[1112],{"type":50,"tag":504,"props":1113,"children":1114},{},[1115],{"type":56,"value":1116},"}\n",{"type":50,"tag":504,"props":1118,"children":1119},{"class":506,"line":608},[1120],{"type":50,"tag":504,"props":1121,"children":1122},{"emptyLinePlaceholder":581},[1123],{"type":56,"value":584},{"type":50,"tag":504,"props":1125,"children":1126},{"class":506,"line":635},[1127],{"type":50,"tag":504,"props":1128,"children":1129},{},[1130],{"type":56,"value":1131},"pub mod fields {\n",{"type":50,"tag":504,"props":1133,"children":1135},{"class":506,"line":1134},8,[1136],{"type":50,"tag":504,"props":1137,"children":1138},{},[1139],{"type":56,"value":1140},"    pub const CONDITION: &str = \"condition\";\n",{"type":50,"tag":504,"props":1142,"children":1144},{"class":506,"line":1143},9,[1145],{"type":50,"tag":504,"props":1146,"children":1147},{},[1148],{"type":56,"value":1149},"    pub const ARGUMENTS: &str = \"arguments\";\n",{"type":50,"tag":504,"props":1151,"children":1153},{"class":506,"line":1152},10,[1154],{"type":50,"tag":504,"props":1155,"children":1156},{},[1157],{"type":56,"value":1116},{"type":50,"tag":77,"props":1159,"children":1160},{},[1161],{"type":50,"tag":81,"props":1162,"children":1163},{},[1164,1166,1172,1174,1180,1182,1188,1190,1195,1197,1203,1205,1211,1213,1219],{"type":56,"value":1165},"For every operator-focused slug (AOS, AAOS, BOS, BAOS, LOS, SAOS, COS), confirm which node kinds the grammar uses for those operators (e.g., ",{"type":50,"tag":119,"props":1167,"children":1169},{"className":1168},[],[1170],{"type":56,"value":1171},"augmented_assignment_expression",{"type":56,"value":1173}," versus ",{"type":50,"tag":119,"props":1175,"children":1177},{"className":1176},[],[1178],{"type":56,"value":1179},"binary_expression",{"type":56,"value":1181},"). Only plug a node kind into ",{"type":50,"tag":119,"props":1183,"children":1185},{"className":1184},[],[1186],{"type":56,"value":1187},"patterns::shuffle_*",{"type":56,"value":1189}," after verifying it in ",{"type":50,"tag":119,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":56,"value":785},{"type":56,"value":1196},", and include any language-specific operator tokens (such as Go's ",{"type":50,"tag":119,"props":1198,"children":1200},{"className":1199},[],[1201],{"type":56,"value":1202},"&^=",{"type":56,"value":1204}," or JavaScript's ",{"type":50,"tag":119,"props":1206,"children":1208},{"className":1207},[],[1209],{"type":56,"value":1210},"**=",{"type":56,"value":1212},"\u002F",{"type":50,"tag":119,"props":1214,"children":1216},{"className":1215},[],[1217],{"type":56,"value":1218},">>>=",{"type":56,"value":1220},").",{"type":50,"tag":81,"props":1222,"children":1223},{},[1224,1226,1232,1233],{"type":56,"value":1225},"Create mutations file (",{"type":50,"tag":119,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":56,"value":1231},"src\u002Flanguages\u002F\u003Clanguage>\u002Fmutations.rs",{"type":56,"value":1007},{"type":50,"tag":493,"props":1234,"children":1236},{"className":827,"code":1235,"language":829,"meta":498,"style":498},"use crate::types::Mutation;\npub const \u003CLANGUAGE>_MUTATIONS: &[Mutation] = &[];\n",[1237],{"type":50,"tag":119,"props":1238,"children":1239},{"__ignoreMap":498},[1240,1248],{"type":50,"tag":504,"props":1241,"children":1242},{"class":506,"line":507},[1243],{"type":50,"tag":504,"props":1244,"children":1245},{},[1246],{"type":56,"value":1247},"use crate::types::Mutation;\n",{"type":50,"tag":504,"props":1249,"children":1250},{"class":506,"line":27},[1251],{"type":50,"tag":504,"props":1252,"children":1253},{},[1254],{"type":56,"value":1255},"pub const \u003CLANGUAGE>_MUTATIONS: &[Mutation] = &[];\n",{"type":50,"tag":81,"props":1257,"children":1258},{},[1259,1261,1267,1268,1289],{"type":56,"value":1260},"Implement engine (",{"type":50,"tag":119,"props":1262,"children":1264},{"className":1263},[],[1265],{"type":56,"value":1266},"src\u002Flanguages\u002F\u003Clanguage>\u002Fengine.rs",{"type":56,"value":1007},{"type":50,"tag":77,"props":1269,"children":1270},{},[1271,1284],{"type":50,"tag":81,"props":1272,"children":1273},{},[1274,1276,1282],{"type":56,"value":1275},"Use Read on ",{"type":50,"tag":119,"props":1277,"children":1279},{"className":1278},[],[1280],{"type":56,"value":1281},"src\u002Flanguages\u002Frust\u002Fengine.rs",{"type":56,"value":1283}," as reference",{"type":50,"tag":81,"props":1285,"children":1286},{},[1287],{"type":56,"value":1288},"Follow the 4-method trait pattern:",{"type":50,"tag":493,"props":1290,"children":1292},{"className":827,"code":1291,"language":829,"meta":498,"style":498},"use std::sync::OnceLock;\nuse tree_sitter::Language as TsLanguage;\n\nuse crate::LanguageEngine;\nuse crate::mutations::COMMON_MUTATIONS;\nuse crate::patterns;\nuse crate::types::{Mutant, Mutation, Target};\nuse crate::utils::{node_text, parse_source};\n\nuse super::mutations::\u003CLANGUAGE>_MUTATIONS;\nuse super::syntax::{fields, nodes};\n\nstatic \u003CLANGUAGE>_LANGUAGE: OnceLock\u003CTsLanguage> = OnceLock::new();\n\nunsafe extern \"C\" {\n    fn tree_sitter_\u003Clanguage>() -> *const tree_sitter::ffi::TSLanguage;\n}\n\npub struct \u003CLanguage>LanguageEngine {\n    mutations: Vec\u003CMutation>,\n}\n\nimpl \u003CLanguage>LanguageEngine {\n    pub fn new() -> Self {\n        let mut mutations: Vec\u003CMutation> = Vec::new();\n        mutations.extend_from_slice(COMMON_MUTATIONS);\n        mutations.extend_from_slice(\u003CLANGUAGE>_MUTATIONS);\n        Self { mutations }\n    }\n}\n\nimpl LanguageEngine for \u003CLanguage>LanguageEngine {\n    fn name(&self) -> &'static str {\n        \"\u003CLanguage>\"\n    }\n\n    fn extensions(&self) -> &[&'static str] {\n        &[\"\u003Cext>\"]\n    }\n\n    fn get_mutations(&self) -> &[Mutation] {\n        &self.mutations\n    }\n\n    fn mutate(&self, target: &Target) -> Vec\u003CMutant> {\n        let source = &target.text;\n        \n        \u002F\u002F Load grammar once and cache it\n        let language = \u003CLANGUAGE>_LANGUAGE\n            .get_or_init(|| unsafe { TsLanguage::from_raw(tree_sitter_\u003Clanguage>()) });\n        \n        let tree = match parse_source(source, language) {\n            Some(t) => t,\n            None => return Vec::new(),\n        };\n        let root = tree.root_node();\n\n        let mut all_mutants = Vec::new();\n        for m in &self.mutations {\n            match m.slug {\n                \"ER\" => {\n                    all_mutants.extend(\n                        patterns::replace(\n                            root,\n                            source,\n                            &[nodes::EXPRESSION_STATEMENT, nodes::RETURN_STATEMENT],\n                            \"panic!(\\\"mewt\\\")\",  \u002F\u002F Use language-appropriate error\n                            &|node, src| !node_text(node, src).contains(\"panic!\"),\n                        )\n                        .into_iter()\n                        .map(|p| Mutant::from_partial(p, target, \"ER\")),\n                    )\n                }\n                \"IF\" => {\n                    all_mutants.extend(\n                        patterns::replace_condition(\n                            root,\n                            source,\n                            nodes::IF_STATEMENT,\n                            fields::CONDITION,\n                            &[\"if\"],\n                            \"false\",\n                        )\n                        .into_iter()\n                        .map(|p| Mutant::from_partial(p, target, \"IF\")),\n                    )\n                }\n                \u002F\u002F Add more mutation patterns - see src\u002Flanguages\u002Frust\u002Fengine.rs\n                _ => {}\n            }\n        }\n        all_mutants\n    }\n}\n\nimpl Default for \u003CLanguage>LanguageEngine {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n",[1293],{"type":50,"tag":119,"props":1294,"children":1295},{"__ignoreMap":498},[1296,1304,1312,1319,1327,1335,1343,1351,1359,1366,1374,1383,1391,1400,1408,1417,1426,1434,1442,1451,1460,1468,1476,1485,1494,1503,1512,1521,1530,1539,1547,1555,1564,1573,1582,1590,1598,1607,1616,1624,1632,1641,1650,1658,1666,1675,1684,1693,1702,1711,1719,1727,1736,1745,1754,1763,1772,1780,1789,1798,1807,1816,1825,1834,1843,1852,1861,1875,1884,1893,1902,1911,1920,1929,1938,1946,1955,1963,1971,1980,1989,1998,2007,2015,2023,2032,2040,2048,2057,2066,2075,2084,2093,2101,2109,2117,2126,2135,2144,2152],{"type":50,"tag":504,"props":1297,"children":1298},{"class":506,"line":507},[1299],{"type":50,"tag":504,"props":1300,"children":1301},{},[1302],{"type":56,"value":1303},"use std::sync::OnceLock;\n",{"type":50,"tag":504,"props":1305,"children":1306},{"class":506,"line":27},[1307],{"type":50,"tag":504,"props":1308,"children":1309},{},[1310],{"type":56,"value":1311},"use tree_sitter::Language as TsLanguage;\n",{"type":50,"tag":504,"props":1313,"children":1314},{"class":506,"line":568},[1315],{"type":50,"tag":504,"props":1316,"children":1317},{"emptyLinePlaceholder":581},[1318],{"type":56,"value":584},{"type":50,"tag":504,"props":1320,"children":1321},{"class":506,"line":577},[1322],{"type":50,"tag":504,"props":1323,"children":1324},{},[1325],{"type":56,"value":1326},"use crate::LanguageEngine;\n",{"type":50,"tag":504,"props":1328,"children":1329},{"class":506,"line":587},[1330],{"type":50,"tag":504,"props":1331,"children":1332},{},[1333],{"type":56,"value":1334},"use crate::mutations::COMMON_MUTATIONS;\n",{"type":50,"tag":504,"props":1336,"children":1337},{"class":506,"line":608},[1338],{"type":50,"tag":504,"props":1339,"children":1340},{},[1341],{"type":56,"value":1342},"use crate::patterns;\n",{"type":50,"tag":504,"props":1344,"children":1345},{"class":506,"line":635},[1346],{"type":50,"tag":504,"props":1347,"children":1348},{},[1349],{"type":56,"value":1350},"use crate::types::{Mutant, Mutation, Target};\n",{"type":50,"tag":504,"props":1352,"children":1353},{"class":506,"line":1134},[1354],{"type":50,"tag":504,"props":1355,"children":1356},{},[1357],{"type":56,"value":1358},"use crate::utils::{node_text, parse_source};\n",{"type":50,"tag":504,"props":1360,"children":1361},{"class":506,"line":1143},[1362],{"type":50,"tag":504,"props":1363,"children":1364},{"emptyLinePlaceholder":581},[1365],{"type":56,"value":584},{"type":50,"tag":504,"props":1367,"children":1368},{"class":506,"line":1152},[1369],{"type":50,"tag":504,"props":1370,"children":1371},{},[1372],{"type":56,"value":1373},"use super::mutations::\u003CLANGUAGE>_MUTATIONS;\n",{"type":50,"tag":504,"props":1375,"children":1377},{"class":506,"line":1376},11,[1378],{"type":50,"tag":504,"props":1379,"children":1380},{},[1381],{"type":56,"value":1382},"use super::syntax::{fields, nodes};\n",{"type":50,"tag":504,"props":1384,"children":1386},{"class":506,"line":1385},12,[1387],{"type":50,"tag":504,"props":1388,"children":1389},{"emptyLinePlaceholder":581},[1390],{"type":56,"value":584},{"type":50,"tag":504,"props":1392,"children":1394},{"class":506,"line":1393},13,[1395],{"type":50,"tag":504,"props":1396,"children":1397},{},[1398],{"type":56,"value":1399},"static \u003CLANGUAGE>_LANGUAGE: OnceLock\u003CTsLanguage> = OnceLock::new();\n",{"type":50,"tag":504,"props":1401,"children":1403},{"class":506,"line":1402},14,[1404],{"type":50,"tag":504,"props":1405,"children":1406},{"emptyLinePlaceholder":581},[1407],{"type":56,"value":584},{"type":50,"tag":504,"props":1409,"children":1411},{"class":506,"line":1410},15,[1412],{"type":50,"tag":504,"props":1413,"children":1414},{},[1415],{"type":56,"value":1416},"unsafe extern \"C\" {\n",{"type":50,"tag":504,"props":1418,"children":1420},{"class":506,"line":1419},16,[1421],{"type":50,"tag":504,"props":1422,"children":1423},{},[1424],{"type":56,"value":1425},"    fn tree_sitter_\u003Clanguage>() -> *const tree_sitter::ffi::TSLanguage;\n",{"type":50,"tag":504,"props":1427,"children":1429},{"class":506,"line":1428},17,[1430],{"type":50,"tag":504,"props":1431,"children":1432},{},[1433],{"type":56,"value":1116},{"type":50,"tag":504,"props":1435,"children":1437},{"class":506,"line":1436},18,[1438],{"type":50,"tag":504,"props":1439,"children":1440},{"emptyLinePlaceholder":581},[1441],{"type":56,"value":584},{"type":50,"tag":504,"props":1443,"children":1445},{"class":506,"line":1444},19,[1446],{"type":50,"tag":504,"props":1447,"children":1448},{},[1449],{"type":56,"value":1450},"pub struct \u003CLanguage>LanguageEngine {\n",{"type":50,"tag":504,"props":1452,"children":1454},{"class":506,"line":1453},20,[1455],{"type":50,"tag":504,"props":1456,"children":1457},{},[1458],{"type":56,"value":1459},"    mutations: Vec\u003CMutation>,\n",{"type":50,"tag":504,"props":1461,"children":1463},{"class":506,"line":1462},21,[1464],{"type":50,"tag":504,"props":1465,"children":1466},{},[1467],{"type":56,"value":1116},{"type":50,"tag":504,"props":1469,"children":1471},{"class":506,"line":1470},22,[1472],{"type":50,"tag":504,"props":1473,"children":1474},{"emptyLinePlaceholder":581},[1475],{"type":56,"value":584},{"type":50,"tag":504,"props":1477,"children":1479},{"class":506,"line":1478},23,[1480],{"type":50,"tag":504,"props":1481,"children":1482},{},[1483],{"type":56,"value":1484},"impl \u003CLanguage>LanguageEngine {\n",{"type":50,"tag":504,"props":1486,"children":1488},{"class":506,"line":1487},24,[1489],{"type":50,"tag":504,"props":1490,"children":1491},{},[1492],{"type":56,"value":1493},"    pub fn new() -> Self {\n",{"type":50,"tag":504,"props":1495,"children":1497},{"class":506,"line":1496},25,[1498],{"type":50,"tag":504,"props":1499,"children":1500},{},[1501],{"type":56,"value":1502},"        let mut mutations: Vec\u003CMutation> = Vec::new();\n",{"type":50,"tag":504,"props":1504,"children":1506},{"class":506,"line":1505},26,[1507],{"type":50,"tag":504,"props":1508,"children":1509},{},[1510],{"type":56,"value":1511},"        mutations.extend_from_slice(COMMON_MUTATIONS);\n",{"type":50,"tag":504,"props":1513,"children":1515},{"class":506,"line":1514},27,[1516],{"type":50,"tag":504,"props":1517,"children":1518},{},[1519],{"type":56,"value":1520},"        mutations.extend_from_slice(\u003CLANGUAGE>_MUTATIONS);\n",{"type":50,"tag":504,"props":1522,"children":1524},{"class":506,"line":1523},28,[1525],{"type":50,"tag":504,"props":1526,"children":1527},{},[1528],{"type":56,"value":1529},"        Self { mutations }\n",{"type":50,"tag":504,"props":1531,"children":1533},{"class":506,"line":1532},29,[1534],{"type":50,"tag":504,"props":1535,"children":1536},{},[1537],{"type":56,"value":1538},"    }\n",{"type":50,"tag":504,"props":1540,"children":1542},{"class":506,"line":1541},30,[1543],{"type":50,"tag":504,"props":1544,"children":1545},{},[1546],{"type":56,"value":1116},{"type":50,"tag":504,"props":1548,"children":1550},{"class":506,"line":1549},31,[1551],{"type":50,"tag":504,"props":1552,"children":1553},{"emptyLinePlaceholder":581},[1554],{"type":56,"value":584},{"type":50,"tag":504,"props":1556,"children":1558},{"class":506,"line":1557},32,[1559],{"type":50,"tag":504,"props":1560,"children":1561},{},[1562],{"type":56,"value":1563},"impl LanguageEngine for \u003CLanguage>LanguageEngine {\n",{"type":50,"tag":504,"props":1565,"children":1567},{"class":506,"line":1566},33,[1568],{"type":50,"tag":504,"props":1569,"children":1570},{},[1571],{"type":56,"value":1572},"    fn name(&self) -> &'static str {\n",{"type":50,"tag":504,"props":1574,"children":1576},{"class":506,"line":1575},34,[1577],{"type":50,"tag":504,"props":1578,"children":1579},{},[1580],{"type":56,"value":1581},"        \"\u003CLanguage>\"\n",{"type":50,"tag":504,"props":1583,"children":1585},{"class":506,"line":1584},35,[1586],{"type":50,"tag":504,"props":1587,"children":1588},{},[1589],{"type":56,"value":1538},{"type":50,"tag":504,"props":1591,"children":1593},{"class":506,"line":1592},36,[1594],{"type":50,"tag":504,"props":1595,"children":1596},{"emptyLinePlaceholder":581},[1597],{"type":56,"value":584},{"type":50,"tag":504,"props":1599,"children":1601},{"class":506,"line":1600},37,[1602],{"type":50,"tag":504,"props":1603,"children":1604},{},[1605],{"type":56,"value":1606},"    fn extensions(&self) -> &[&'static str] {\n",{"type":50,"tag":504,"props":1608,"children":1610},{"class":506,"line":1609},38,[1611],{"type":50,"tag":504,"props":1612,"children":1613},{},[1614],{"type":56,"value":1615},"        &[\"\u003Cext>\"]\n",{"type":50,"tag":504,"props":1617,"children":1619},{"class":506,"line":1618},39,[1620],{"type":50,"tag":504,"props":1621,"children":1622},{},[1623],{"type":56,"value":1538},{"type":50,"tag":504,"props":1625,"children":1627},{"class":506,"line":1626},40,[1628],{"type":50,"tag":504,"props":1629,"children":1630},{"emptyLinePlaceholder":581},[1631],{"type":56,"value":584},{"type":50,"tag":504,"props":1633,"children":1635},{"class":506,"line":1634},41,[1636],{"type":50,"tag":504,"props":1637,"children":1638},{},[1639],{"type":56,"value":1640},"    fn get_mutations(&self) -> &[Mutation] {\n",{"type":50,"tag":504,"props":1642,"children":1644},{"class":506,"line":1643},42,[1645],{"type":50,"tag":504,"props":1646,"children":1647},{},[1648],{"type":56,"value":1649},"        &self.mutations\n",{"type":50,"tag":504,"props":1651,"children":1653},{"class":506,"line":1652},43,[1654],{"type":50,"tag":504,"props":1655,"children":1656},{},[1657],{"type":56,"value":1538},{"type":50,"tag":504,"props":1659,"children":1661},{"class":506,"line":1660},44,[1662],{"type":50,"tag":504,"props":1663,"children":1664},{"emptyLinePlaceholder":581},[1665],{"type":56,"value":584},{"type":50,"tag":504,"props":1667,"children":1669},{"class":506,"line":1668},45,[1670],{"type":50,"tag":504,"props":1671,"children":1672},{},[1673],{"type":56,"value":1674},"    fn mutate(&self, target: &Target) -> Vec\u003CMutant> {\n",{"type":50,"tag":504,"props":1676,"children":1678},{"class":506,"line":1677},46,[1679],{"type":50,"tag":504,"props":1680,"children":1681},{},[1682],{"type":56,"value":1683},"        let source = &target.text;\n",{"type":50,"tag":504,"props":1685,"children":1687},{"class":506,"line":1686},47,[1688],{"type":50,"tag":504,"props":1689,"children":1690},{},[1691],{"type":56,"value":1692},"        \n",{"type":50,"tag":504,"props":1694,"children":1696},{"class":506,"line":1695},48,[1697],{"type":50,"tag":504,"props":1698,"children":1699},{},[1700],{"type":56,"value":1701},"        \u002F\u002F Load grammar once and cache it\n",{"type":50,"tag":504,"props":1703,"children":1705},{"class":506,"line":1704},49,[1706],{"type":50,"tag":504,"props":1707,"children":1708},{},[1709],{"type":56,"value":1710},"        let language = \u003CLANGUAGE>_LANGUAGE\n",{"type":50,"tag":504,"props":1712,"children":1713},{"class":506,"line":23},[1714],{"type":50,"tag":504,"props":1715,"children":1716},{},[1717],{"type":56,"value":1718},"            .get_or_init(|| unsafe { TsLanguage::from_raw(tree_sitter_\u003Clanguage>()) });\n",{"type":50,"tag":504,"props":1720,"children":1722},{"class":506,"line":1721},51,[1723],{"type":50,"tag":504,"props":1724,"children":1725},{},[1726],{"type":56,"value":1692},{"type":50,"tag":504,"props":1728,"children":1730},{"class":506,"line":1729},52,[1731],{"type":50,"tag":504,"props":1732,"children":1733},{},[1734],{"type":56,"value":1735},"        let tree = match parse_source(source, language) {\n",{"type":50,"tag":504,"props":1737,"children":1739},{"class":506,"line":1738},53,[1740],{"type":50,"tag":504,"props":1741,"children":1742},{},[1743],{"type":56,"value":1744},"            Some(t) => t,\n",{"type":50,"tag":504,"props":1746,"children":1748},{"class":506,"line":1747},54,[1749],{"type":50,"tag":504,"props":1750,"children":1751},{},[1752],{"type":56,"value":1753},"            None => return Vec::new(),\n",{"type":50,"tag":504,"props":1755,"children":1757},{"class":506,"line":1756},55,[1758],{"type":50,"tag":504,"props":1759,"children":1760},{},[1761],{"type":56,"value":1762},"        };\n",{"type":50,"tag":504,"props":1764,"children":1766},{"class":506,"line":1765},56,[1767],{"type":50,"tag":504,"props":1768,"children":1769},{},[1770],{"type":56,"value":1771},"        let root = tree.root_node();\n",{"type":50,"tag":504,"props":1773,"children":1775},{"class":506,"line":1774},57,[1776],{"type":50,"tag":504,"props":1777,"children":1778},{"emptyLinePlaceholder":581},[1779],{"type":56,"value":584},{"type":50,"tag":504,"props":1781,"children":1783},{"class":506,"line":1782},58,[1784],{"type":50,"tag":504,"props":1785,"children":1786},{},[1787],{"type":56,"value":1788},"        let mut all_mutants = Vec::new();\n",{"type":50,"tag":504,"props":1790,"children":1792},{"class":506,"line":1791},59,[1793],{"type":50,"tag":504,"props":1794,"children":1795},{},[1796],{"type":56,"value":1797},"        for m in &self.mutations {\n",{"type":50,"tag":504,"props":1799,"children":1801},{"class":506,"line":1800},60,[1802],{"type":50,"tag":504,"props":1803,"children":1804},{},[1805],{"type":56,"value":1806},"            match m.slug {\n",{"type":50,"tag":504,"props":1808,"children":1810},{"class":506,"line":1809},61,[1811],{"type":50,"tag":504,"props":1812,"children":1813},{},[1814],{"type":56,"value":1815},"                \"ER\" => {\n",{"type":50,"tag":504,"props":1817,"children":1819},{"class":506,"line":1818},62,[1820],{"type":50,"tag":504,"props":1821,"children":1822},{},[1823],{"type":56,"value":1824},"                    all_mutants.extend(\n",{"type":50,"tag":504,"props":1826,"children":1828},{"class":506,"line":1827},63,[1829],{"type":50,"tag":504,"props":1830,"children":1831},{},[1832],{"type":56,"value":1833},"                        patterns::replace(\n",{"type":50,"tag":504,"props":1835,"children":1837},{"class":506,"line":1836},64,[1838],{"type":50,"tag":504,"props":1839,"children":1840},{},[1841],{"type":56,"value":1842},"                            root,\n",{"type":50,"tag":504,"props":1844,"children":1846},{"class":506,"line":1845},65,[1847],{"type":50,"tag":504,"props":1848,"children":1849},{},[1850],{"type":56,"value":1851},"                            source,\n",{"type":50,"tag":504,"props":1853,"children":1855},{"class":506,"line":1854},66,[1856],{"type":50,"tag":504,"props":1857,"children":1858},{},[1859],{"type":56,"value":1860},"                            &[nodes::EXPRESSION_STATEMENT, nodes::RETURN_STATEMENT],\n",{"type":50,"tag":504,"props":1862,"children":1864},{"class":506,"line":1863},67,[1865,1870],{"type":50,"tag":504,"props":1866,"children":1867},{},[1868],{"type":56,"value":1869},"                            \"panic!(\\\"mewt\\\")\",",{"type":50,"tag":504,"props":1871,"children":1872},{},[1873],{"type":56,"value":1874},"  \u002F\u002F Use language-appropriate error\n",{"type":50,"tag":504,"props":1876,"children":1878},{"class":506,"line":1877},68,[1879],{"type":50,"tag":504,"props":1880,"children":1881},{},[1882],{"type":56,"value":1883},"                            &|node, src| !node_text(node, src).contains(\"panic!\"),\n",{"type":50,"tag":504,"props":1885,"children":1887},{"class":506,"line":1886},69,[1888],{"type":50,"tag":504,"props":1889,"children":1890},{},[1891],{"type":56,"value":1892},"                        )\n",{"type":50,"tag":504,"props":1894,"children":1896},{"class":506,"line":1895},70,[1897],{"type":50,"tag":504,"props":1898,"children":1899},{},[1900],{"type":56,"value":1901},"                        .into_iter()\n",{"type":50,"tag":504,"props":1903,"children":1905},{"class":506,"line":1904},71,[1906],{"type":50,"tag":504,"props":1907,"children":1908},{},[1909],{"type":56,"value":1910},"                        .map(|p| Mutant::from_partial(p, target, \"ER\")),\n",{"type":50,"tag":504,"props":1912,"children":1914},{"class":506,"line":1913},72,[1915],{"type":50,"tag":504,"props":1916,"children":1917},{},[1918],{"type":56,"value":1919},"                    )\n",{"type":50,"tag":504,"props":1921,"children":1923},{"class":506,"line":1922},73,[1924],{"type":50,"tag":504,"props":1925,"children":1926},{},[1927],{"type":56,"value":1928},"                }\n",{"type":50,"tag":504,"props":1930,"children":1932},{"class":506,"line":1931},74,[1933],{"type":50,"tag":504,"props":1934,"children":1935},{},[1936],{"type":56,"value":1937},"                \"IF\" => {\n",{"type":50,"tag":504,"props":1939,"children":1941},{"class":506,"line":1940},75,[1942],{"type":50,"tag":504,"props":1943,"children":1944},{},[1945],{"type":56,"value":1824},{"type":50,"tag":504,"props":1947,"children":1949},{"class":506,"line":1948},76,[1950],{"type":50,"tag":504,"props":1951,"children":1952},{},[1953],{"type":56,"value":1954},"                        patterns::replace_condition(\n",{"type":50,"tag":504,"props":1956,"children":1958},{"class":506,"line":1957},77,[1959],{"type":50,"tag":504,"props":1960,"children":1961},{},[1962],{"type":56,"value":1842},{"type":50,"tag":504,"props":1964,"children":1966},{"class":506,"line":1965},78,[1967],{"type":50,"tag":504,"props":1968,"children":1969},{},[1970],{"type":56,"value":1851},{"type":50,"tag":504,"props":1972,"children":1974},{"class":506,"line":1973},79,[1975],{"type":50,"tag":504,"props":1976,"children":1977},{},[1978],{"type":56,"value":1979},"                            nodes::IF_STATEMENT,\n",{"type":50,"tag":504,"props":1981,"children":1983},{"class":506,"line":1982},80,[1984],{"type":50,"tag":504,"props":1985,"children":1986},{},[1987],{"type":56,"value":1988},"                            fields::CONDITION,\n",{"type":50,"tag":504,"props":1990,"children":1992},{"class":506,"line":1991},81,[1993],{"type":50,"tag":504,"props":1994,"children":1995},{},[1996],{"type":56,"value":1997},"                            &[\"if\"],\n",{"type":50,"tag":504,"props":1999,"children":2001},{"class":506,"line":2000},82,[2002],{"type":50,"tag":504,"props":2003,"children":2004},{},[2005],{"type":56,"value":2006},"                            \"false\",\n",{"type":50,"tag":504,"props":2008,"children":2010},{"class":506,"line":2009},83,[2011],{"type":50,"tag":504,"props":2012,"children":2013},{},[2014],{"type":56,"value":1892},{"type":50,"tag":504,"props":2016,"children":2018},{"class":506,"line":2017},84,[2019],{"type":50,"tag":504,"props":2020,"children":2021},{},[2022],{"type":56,"value":1901},{"type":50,"tag":504,"props":2024,"children":2026},{"class":506,"line":2025},85,[2027],{"type":50,"tag":504,"props":2028,"children":2029},{},[2030],{"type":56,"value":2031},"                        .map(|p| Mutant::from_partial(p, target, \"IF\")),\n",{"type":50,"tag":504,"props":2033,"children":2035},{"class":506,"line":2034},86,[2036],{"type":50,"tag":504,"props":2037,"children":2038},{},[2039],{"type":56,"value":1919},{"type":50,"tag":504,"props":2041,"children":2043},{"class":506,"line":2042},87,[2044],{"type":50,"tag":504,"props":2045,"children":2046},{},[2047],{"type":56,"value":1928},{"type":50,"tag":504,"props":2049,"children":2051},{"class":506,"line":2050},88,[2052],{"type":50,"tag":504,"props":2053,"children":2054},{},[2055],{"type":56,"value":2056},"                \u002F\u002F Add more mutation patterns - see src\u002Flanguages\u002Frust\u002Fengine.rs\n",{"type":50,"tag":504,"props":2058,"children":2060},{"class":506,"line":2059},89,[2061],{"type":50,"tag":504,"props":2062,"children":2063},{},[2064],{"type":56,"value":2065},"                _ => {}\n",{"type":50,"tag":504,"props":2067,"children":2069},{"class":506,"line":2068},90,[2070],{"type":50,"tag":504,"props":2071,"children":2072},{},[2073],{"type":56,"value":2074},"            }\n",{"type":50,"tag":504,"props":2076,"children":2078},{"class":506,"line":2077},91,[2079],{"type":50,"tag":504,"props":2080,"children":2081},{},[2082],{"type":56,"value":2083},"        }\n",{"type":50,"tag":504,"props":2085,"children":2087},{"class":506,"line":2086},92,[2088],{"type":50,"tag":504,"props":2089,"children":2090},{},[2091],{"type":56,"value":2092},"        all_mutants\n",{"type":50,"tag":504,"props":2094,"children":2096},{"class":506,"line":2095},93,[2097],{"type":50,"tag":504,"props":2098,"children":2099},{},[2100],{"type":56,"value":1538},{"type":50,"tag":504,"props":2102,"children":2104},{"class":506,"line":2103},94,[2105],{"type":50,"tag":504,"props":2106,"children":2107},{},[2108],{"type":56,"value":1116},{"type":50,"tag":504,"props":2110,"children":2112},{"class":506,"line":2111},95,[2113],{"type":50,"tag":504,"props":2114,"children":2115},{"emptyLinePlaceholder":581},[2116],{"type":56,"value":584},{"type":50,"tag":504,"props":2118,"children":2120},{"class":506,"line":2119},96,[2121],{"type":50,"tag":504,"props":2122,"children":2123},{},[2124],{"type":56,"value":2125},"impl Default for \u003CLanguage>LanguageEngine {\n",{"type":50,"tag":504,"props":2127,"children":2129},{"class":506,"line":2128},97,[2130],{"type":50,"tag":504,"props":2131,"children":2132},{},[2133],{"type":56,"value":2134},"    fn default() -> Self {\n",{"type":50,"tag":504,"props":2136,"children":2138},{"class":506,"line":2137},98,[2139],{"type":50,"tag":504,"props":2140,"children":2141},{},[2142],{"type":56,"value":2143},"        Self::new()\n",{"type":50,"tag":504,"props":2145,"children":2147},{"class":506,"line":2146},99,[2148],{"type":50,"tag":504,"props":2149,"children":2150},{},[2151],{"type":56,"value":1538},{"type":50,"tag":504,"props":2153,"children":2155},{"class":506,"line":2154},100,[2156],{"type":50,"tag":504,"props":2157,"children":2158},{},[2159],{"type":56,"value":1116},{"type":50,"tag":59,"props":2161,"children":2162},{},[2163,2167],{"type":50,"tag":111,"props":2164,"children":2165},{},[2166],{"type":56,"value":715},{"type":56,"value":435},{"type":50,"tag":77,"props":2169,"children":2171},{"className":2170},[720],[2172,2181,2198,2207],{"type":50,"tag":81,"props":2173,"children":2175},{"className":2174},[725],[2176,2179],{"type":50,"tag":728,"props":2177,"children":2178},{"disabled":581,"type":730},[],{"type":56,"value":2180}," All 4 trait methods implemented",{"type":50,"tag":81,"props":2182,"children":2184},{"className":2183},[725],[2185,2188,2190,2196],{"type":50,"tag":728,"props":2186,"children":2187},{"disabled":581,"type":730},[],{"type":56,"value":2189}," Grammar loaded inline in ",{"type":50,"tag":119,"props":2191,"children":2193},{"className":2192},[],[2194],{"type":56,"value":2195},"mutate()",{"type":56,"value":2197}," (no helper methods)",{"type":50,"tag":81,"props":2199,"children":2201},{"className":2200},[725],[2202,2205],{"type":50,"tag":728,"props":2203,"children":2204},{"disabled":581,"type":730},[],{"type":56,"value":2206}," At least ER and IF mutations implemented",{"type":50,"tag":81,"props":2208,"children":2210},{"className":2209},[725],[2211,2214,2216],{"type":50,"tag":728,"props":2212,"children":2213},{"disabled":581,"type":730},[],{"type":56,"value":2215}," Code compiles with ",{"type":50,"tag":119,"props":2217,"children":2219},{"className":2218},[],[2220],{"type":56,"value":909},{"type":50,"tag":410,"props":2222,"children":2224},{"id":2223},"phase-4-language-registration",[2225],{"type":56,"value":2226},"Phase 4: Language Registration",{"type":50,"tag":59,"props":2228,"children":2229},{},[2230,2235],{"type":50,"tag":111,"props":2231,"children":2232},{},[2233],{"type":56,"value":2234},"Dialect-aware note",{"type":56,"value":2236},": If the language can have multiple dialects under one extension, also wire\u002Fupdate registry resolver metadata and canonical labeling rules so command flows consume one resolved selection object.",{"type":50,"tag":59,"props":2238,"children":2239},{},[2240,2244],{"type":50,"tag":111,"props":2241,"children":2242},{},[2243],{"type":56,"value":423},{"type":56,"value":2245},": Engine implementation compiles",{"type":50,"tag":59,"props":2247,"children":2248},{},[2249,2253],{"type":50,"tag":111,"props":2250,"children":2251},{},[2252],{"type":56,"value":433},{"type":56,"value":435},{"type":50,"tag":437,"props":2255,"children":2256},{},[2257,2283],{"type":50,"tag":81,"props":2258,"children":2259},{},[2260,2262,2268,2269],{"type":56,"value":2261},"Use Edit to add module to ",{"type":50,"tag":119,"props":2263,"children":2265},{"className":2264},[],[2266],{"type":56,"value":2267},"src\u002Flanguages\u002Fmod.rs",{"type":56,"value":435},{"type":50,"tag":493,"props":2270,"children":2272},{"className":827,"code":2271,"language":829,"meta":498,"style":498},"pub mod \u003Clanguage>;\n",[2273],{"type":50,"tag":119,"props":2274,"children":2275},{"__ignoreMap":498},[2276],{"type":50,"tag":504,"props":2277,"children":2278},{"class":506,"line":507},[2279],{"type":50,"tag":504,"props":2280,"children":2281},{},[2282],{"type":56,"value":2271},{"type":50,"tag":81,"props":2284,"children":2285},{},[2286,2288,2294,2296],{"type":56,"value":2287},"Use Edit to register in ",{"type":50,"tag":119,"props":2289,"children":2291},{"className":2290},[],[2292],{"type":56,"value":2293},"src\u002Fmain.rs",{"type":56,"value":2295}," (find the LanguageRegistry section):",{"type":50,"tag":493,"props":2297,"children":2299},{"className":827,"code":2298,"language":829,"meta":498,"style":498},"registry.register(mewt::languages::\u003Clanguage>::engine::\u003CLanguage>LanguageEngine::new());\n",[2300],{"type":50,"tag":119,"props":2301,"children":2302},{"__ignoreMap":498},[2303],{"type":50,"tag":504,"props":2304,"children":2305},{"class":506,"line":507},[2306],{"type":50,"tag":504,"props":2307,"children":2308},{},[2309],{"type":56,"value":2298},{"type":50,"tag":59,"props":2311,"children":2312},{},[2313,2317],{"type":50,"tag":111,"props":2314,"children":2315},{},[2316],{"type":56,"value":715},{"type":56,"value":435},{"type":50,"tag":77,"props":2319,"children":2321},{"className":2320},[720],[2322,2336,2350],{"type":50,"tag":81,"props":2323,"children":2325},{"className":2324},[725],[2326,2329,2331],{"type":50,"tag":728,"props":2327,"children":2328},{"disabled":581,"type":730},[],{"type":56,"value":2330}," Module exported in ",{"type":50,"tag":119,"props":2332,"children":2334},{"className":2333},[],[2335],{"type":56,"value":2267},{"type":50,"tag":81,"props":2337,"children":2339},{"className":2338},[725],[2340,2343,2345],{"type":50,"tag":728,"props":2341,"children":2342},{"disabled":581,"type":730},[],{"type":56,"value":2344}," Engine registered in ",{"type":50,"tag":119,"props":2346,"children":2348},{"className":2347},[],[2349],{"type":56,"value":2293},{"type":50,"tag":81,"props":2351,"children":2353},{"className":2352},[725],[2354,2357,2358,2364],{"type":50,"tag":728,"props":2355,"children":2356},{"disabled":581,"type":730},[],{"type":56,"value":903},{"type":50,"tag":119,"props":2359,"children":2361},{"className":2360},[],[2362],{"type":56,"value":2363},"cargo build --release",{"type":56,"value":2365}," succeeds",{"type":50,"tag":410,"props":2367,"children":2369},{"id":2368},"phase-5-tests-and-examples",[2370],{"type":56,"value":2371},"Phase 5: Tests and Examples",{"type":50,"tag":59,"props":2373,"children":2374},{},[2375],{"type":56,"value":2376},"For dialect-aware families that share an extension, add:",{"type":50,"tag":77,"props":2378,"children":2379},{},[2380,2385,2390],{"type":50,"tag":81,"props":2381,"children":2382},{},[2383],{"type":56,"value":2384},"Resolver integration tests proving deterministic selection for ambiguous extension paths.",{"type":50,"tag":81,"props":2386,"children":2387},{},[2388],{"type":56,"value":2389},"Dialect-divergence tests with at least one construct accepted by one dialect and rejected (or treated differently) by another.",{"type":50,"tag":81,"props":2391,"children":2392},{},[2393],{"type":56,"value":2394},"Filter\u002Fquery tests using canonical labels\u002Fselectors (no implicit legacy alias guarantees).",{"type":50,"tag":59,"props":2396,"children":2397},{},[2398,2402],{"type":50,"tag":111,"props":2399,"children":2400},{},[2401],{"type":56,"value":423},{"type":56,"value":2403},": Language builds and registers",{"type":50,"tag":59,"props":2405,"children":2406},{},[2407,2411],{"type":50,"tag":111,"props":2408,"children":2409},{},[2410],{"type":56,"value":433},{"type":56,"value":435},{"type":50,"tag":437,"props":2413,"children":2414},{},[2415,2477,2532,2557,2593,2705,2750,2813],{"type":50,"tag":81,"props":2416,"children":2417},{},[2418,2420,2464,2468,2470,2476],{"type":56,"value":2419},"Scaffold the test directories:",{"type":50,"tag":493,"props":2421,"children":2423},{"className":495,"code":2422,"language":497,"meta":498,"style":498},"mkdir -p tests\u002F\u003Clanguage>\u002Fmutations\n",[2424],{"type":50,"tag":119,"props":2425,"children":2426},{"__ignoreMap":498},[2427],{"type":50,"tag":504,"props":2428,"children":2429},{"class":506,"line":507},[2430,2434,2438,2443,2447,2451,2455,2459],{"type":50,"tag":504,"props":2431,"children":2432},{"style":674},[2433],{"type":56,"value":966},{"type":50,"tag":504,"props":2435,"children":2436},{"style":517},[2437],{"type":56,"value":971},{"type":50,"tag":504,"props":2439,"children":2440},{"style":517},[2441],{"type":56,"value":2442}," tests\u002F",{"type":50,"tag":504,"props":2444,"children":2445},{"style":529},[2446],{"type":56,"value":981},{"type":50,"tag":504,"props":2448,"children":2449},{"style":517},[2450],{"type":56,"value":692},{"type":50,"tag":504,"props":2452,"children":2453},{"style":523},[2454],{"type":56,"value":697},{"type":50,"tag":504,"props":2456,"children":2457},{"style":529},[2458],{"type":56,"value":702},{"type":50,"tag":504,"props":2460,"children":2461},{"style":517},[2462],{"type":56,"value":2463},"\u002Fmutations\n",{"type":50,"tag":2465,"props":2466,"children":2467},"br",{},[],{"type":56,"value":2469},"The mutation folder must contain one Rust module per slug (for example ",{"type":50,"tag":119,"props":2471,"children":2473},{"className":2472},[],[2474],{"type":56,"value":2475},"tests\u002F\u003Clanguage>\u002Fmutations\u002FAOS.rs",{"type":56,"value":1220},{"type":50,"tag":81,"props":2478,"children":2479},{},[2480,2482],{"type":56,"value":2481},"Write canonical example fixture(s):",{"type":50,"tag":77,"props":2483,"children":2484},{},[2485,2497,2527],{"type":50,"tag":81,"props":2486,"children":2487},{},[2488,2490,2495],{"type":56,"value":2489},"Most languages: ",{"type":50,"tag":119,"props":2491,"children":2493},{"className":2492},[],[2494],{"type":56,"value":283},{"type":56,"value":2496},".",{"type":50,"tag":81,"props":2498,"children":2499},{},[2500,2502,2507,2508,2513,2514,2519,2520,2525],{"type":56,"value":2501},"JavaScript-family languages: one canonical fixture per supported extension (",{"type":50,"tag":119,"props":2503,"children":2505},{"className":2504},[],[2506],{"type":56,"value":291},{"type":56,"value":190},{"type":50,"tag":119,"props":2509,"children":2511},{"className":2510},[],[2512],{"type":56,"value":298},{"type":56,"value":190},{"type":50,"tag":119,"props":2515,"children":2517},{"className":2516},[],[2518],{"type":56,"value":305},{"type":56,"value":190},{"type":50,"tag":119,"props":2521,"children":2523},{"className":2522},[],[2524],{"type":56,"value":312},{"type":56,"value":2526},") as needed.",{"type":50,"tag":81,"props":2528,"children":2529},{},[2530],{"type":56,"value":2531},"Keep examples syntactically valid and representative, but small enough to stay smoke-test friendly.",{"type":50,"tag":81,"props":2533,"children":2534},{},[2535,2537,2542,2543],{"type":56,"value":2536},"Wire the language into the integration test entrypoint (",{"type":50,"tag":119,"props":2538,"children":2540},{"className":2539},[],[2541],{"type":56,"value":239},{"type":56,"value":1007},{"type":50,"tag":493,"props":2544,"children":2546},{"className":827,"code":2545,"language":829,"meta":498,"style":498},"mod \u003Clanguage>;\n",[2547],{"type":50,"tag":119,"props":2548,"children":2549},{"__ignoreMap":498},[2550],{"type":50,"tag":504,"props":2551,"children":2552},{"class":506,"line":507},[2553],{"type":50,"tag":504,"props":2554,"children":2555},{},[2556],{"type":56,"value":2545},{"type":50,"tag":81,"props":2558,"children":2559},{},[2560,2562,2568,2570],{"type":56,"value":2561},"Create ",{"type":50,"tag":119,"props":2563,"children":2565},{"className":2564},[],[2566],{"type":56,"value":2567},"tests\u002F\u003Clanguage>\u002Fmod.rs",{"type":56,"value":2569}," to expose both integration and per-slug suites:",{"type":50,"tag":493,"props":2571,"children":2573},{"className":827,"code":2572,"language":829,"meta":498,"style":498},"mod integration_tests;\nmod mutations;\n",[2574],{"type":50,"tag":119,"props":2575,"children":2576},{"__ignoreMap":498},[2577,2585],{"type":50,"tag":504,"props":2578,"children":2579},{"class":506,"line":507},[2580],{"type":50,"tag":504,"props":2581,"children":2582},{},[2583],{"type":56,"value":2584},"mod integration_tests;\n",{"type":50,"tag":504,"props":2586,"children":2587},{"class":506,"line":27},[2588],{"type":50,"tag":504,"props":2589,"children":2590},{},[2591],{"type":56,"value":2592},"mod mutations;\n",{"type":50,"tag":81,"props":2594,"children":2595},{},[2596,2598,2604,2606,2668],{"type":56,"value":2597},"Author ",{"type":50,"tag":119,"props":2599,"children":2601},{"className":2600},[],[2602],{"type":56,"value":2603},"tests\u002F\u003Clanguage>\u002Fmutations\u002Fmod.rs",{"type":56,"value":2605}," that re-exports every slug module:",{"type":50,"tag":493,"props":2607,"children":2609},{"className":827,"code":2608,"language":829,"meta":498,"style":498},"#![allow(non_snake_case)]\n\n#[path = \"AAOS.rs\"]\nmod aaos;\n#[path = \"AOS.rs\"]\nmod aos;\n\u002F\u002F Repeat for every slug returned by engine.get_mutations()\n",[2610],{"type":50,"tag":119,"props":2611,"children":2612},{"__ignoreMap":498},[2613,2621,2628,2636,2644,2652,2660],{"type":50,"tag":504,"props":2614,"children":2615},{"class":506,"line":507},[2616],{"type":50,"tag":504,"props":2617,"children":2618},{},[2619],{"type":56,"value":2620},"#![allow(non_snake_case)]\n",{"type":50,"tag":504,"props":2622,"children":2623},{"class":506,"line":27},[2624],{"type":50,"tag":504,"props":2625,"children":2626},{"emptyLinePlaceholder":581},[2627],{"type":56,"value":584},{"type":50,"tag":504,"props":2629,"children":2630},{"class":506,"line":568},[2631],{"type":50,"tag":504,"props":2632,"children":2633},{},[2634],{"type":56,"value":2635},"#[path = \"AAOS.rs\"]\n",{"type":50,"tag":504,"props":2637,"children":2638},{"class":506,"line":577},[2639],{"type":50,"tag":504,"props":2640,"children":2641},{},[2642],{"type":56,"value":2643},"mod aaos;\n",{"type":50,"tag":504,"props":2645,"children":2646},{"class":506,"line":587},[2647],{"type":50,"tag":504,"props":2648,"children":2649},{},[2650],{"type":56,"value":2651},"#[path = \"AOS.rs\"]\n",{"type":50,"tag":504,"props":2653,"children":2654},{"class":506,"line":608},[2655],{"type":50,"tag":504,"props":2656,"children":2657},{},[2658],{"type":56,"value":2659},"mod aos;\n",{"type":50,"tag":504,"props":2661,"children":2662},{"class":506,"line":635},[2663],{"type":50,"tag":504,"props":2664,"children":2665},{},[2666],{"type":56,"value":2667},"\u002F\u002F Repeat for every slug returned by engine.get_mutations()\n",{"type":50,"tag":77,"props":2669,"children":2670},{},[2671,2692],{"type":50,"tag":81,"props":2672,"children":2673},{},[2674,2676,2682,2684,2690],{"type":56,"value":2675},"Use uppercase filenames that match the slug (",{"type":50,"tag":119,"props":2677,"children":2679},{"className":2678},[],[2680],{"type":56,"value":2681},"\u003CSLUG>.rs",{"type":56,"value":2683},") and map to lowercase module names via ",{"type":50,"tag":119,"props":2685,"children":2687},{"className":2686},[],[2688],{"type":56,"value":2689},"#[path = ...]",{"type":56,"value":2691}," where needed.",{"type":50,"tag":81,"props":2693,"children":2694},{},[2695,2697,2703],{"type":56,"value":2696},"Keep manual slug wiring in ",{"type":50,"tag":119,"props":2698,"children":2700},{"className":2699},[],[2701],{"type":56,"value":2702},"mutations\u002Fmod.rs",{"type":56,"value":2704}," in sync with files on disk.",{"type":50,"tag":81,"props":2706,"children":2707},{},[2708,2710,2716,2718,2723,2724],{"type":56,"value":2709},"For each slug surfaced by ",{"type":50,"tag":119,"props":2711,"children":2713},{"className":2712},[],[2714],{"type":56,"value":2715},"engine.get_mutations()",{"type":56,"value":2717},", create ",{"type":50,"tag":119,"props":2719,"children":2721},{"className":2720},[],[2722],{"type":56,"value":231},{"type":56,"value":435},{"type":50,"tag":77,"props":2725,"children":2726},{},[2727,2732,2745],{"type":50,"tag":81,"props":2728,"children":2729},{},[2730],{"type":56,"value":2731},"Prefer inline source fixtures for precise, slug-focused assertions.",{"type":50,"tag":81,"props":2733,"children":2734},{},[2735,2737,2743],{"type":56,"value":2736},"Use integration helpers (",{"type":50,"tag":119,"props":2738,"children":2740},{"className":2739},[],[2741],{"type":56,"value":2742},"create_test_target",{"type":56,"value":2744},", shared slug assertion helpers) rather than duplicating setup code.",{"type":50,"tag":81,"props":2746,"children":2747},{},[2748],{"type":56,"value":2749},"For operator families (AAOS\u002FBAOS\u002FSAOS\u002FAOS\u002FBOS\u002FCOS\u002FLOS), cover all supported operators and include negative cases where useful.",{"type":50,"tag":81,"props":2751,"children":2752},{},[2753,2754,2759,2761],{"type":56,"value":2561},{"type":50,"tag":119,"props":2755,"children":2757},{"className":2756},[],[2758],{"type":56,"value":257},{"type":56,"value":2760}," with this pattern:",{"type":50,"tag":77,"props":2762,"children":2763},{},[2764,2784,2797,2808],{"type":50,"tag":81,"props":2765,"children":2766},{},[2767,2769,2775,2777,2783],{"type":56,"value":2768},"Define a thin ",{"type":50,"tag":119,"props":2770,"children":2772},{"className":2771},[],[2773],{"type":56,"value":2774},"create_test_target(...)",{"type":56,"value":2776}," wrapper that delegates to ",{"type":50,"tag":119,"props":2778,"children":2780},{"className":2779},[],[2781],{"type":56,"value":2782},"tests\u002Futils.rs",{"type":56,"value":2496},{"type":50,"tag":81,"props":2785,"children":2786},{},[2787,2789,2795],{"type":56,"value":2788},"Run ",{"type":50,"tag":119,"props":2790,"children":2792},{"className":2791},[],[2793],{"type":56,"value":2794},"conformance::run_common_language_checks(...)",{"type":56,"value":2796}," for baseline behavior.",{"type":50,"tag":81,"props":2798,"children":2799},{},[2800,2802,2807],{"type":56,"value":2801},"Add canonical example-file smoke tests (",{"type":50,"tag":119,"props":2803,"children":2805},{"className":2804},[],[2806],{"type":56,"value":320},{"type":56,"value":1220},{"type":50,"tag":81,"props":2809,"children":2810},{},[2811],{"type":56,"value":2812},"Add only language-specific integration assertions beyond conformance (for example parser edge cases).",{"type":50,"tag":81,"props":2814,"children":2815},{},[2816,2818,2823,2825,2831],{"type":56,"value":2817},"Update the guard in ",{"type":50,"tag":119,"props":2819,"children":2821},{"className":2820},[],[2822],{"type":56,"value":239},{"type":56,"value":2824}," so the new language participates in per-slug coverage checks (import the engine and add a ",{"type":50,"tag":119,"props":2826,"children":2828},{"className":2827},[],[2829],{"type":56,"value":2830},"check_language(...)",{"type":56,"value":2832}," call).",{"type":50,"tag":59,"props":2834,"children":2835},{},[2836,2840],{"type":50,"tag":111,"props":2837,"children":2838},{},[2839],{"type":56,"value":715},{"type":56,"value":435},{"type":50,"tag":77,"props":2842,"children":2844},{"className":2843},[720],[2845,2869,2883,2892,2901,2922,2937,2946],{"type":50,"tag":81,"props":2846,"children":2848},{"className":2847},[725],[2849,2852,2854,2859,2861,2867],{"type":50,"tag":728,"props":2850,"children":2851},{"disabled":581,"type":730},[],{"type":56,"value":2853}," Canonical example fixture(s) created at ",{"type":50,"tag":119,"props":2855,"children":2857},{"className":2856},[],[2858],{"type":56,"value":283},{"type":56,"value":2860}," (or JavaScript ",{"type":50,"tag":119,"props":2862,"children":2864},{"className":2863},[],[2865],{"type":56,"value":2866},"example.*",{"type":56,"value":2868}," set)",{"type":50,"tag":81,"props":2870,"children":2872},{"className":2871},[725],[2873,2876,2878],{"type":50,"tag":728,"props":2874,"children":2875},{"disabled":581,"type":730},[],{"type":56,"value":2877}," Integration and per-slug test modules compiled into ",{"type":50,"tag":119,"props":2879,"children":2881},{"className":2880},[],[2882],{"type":56,"value":239},{"type":50,"tag":81,"props":2884,"children":2886},{"className":2885},[725],[2887,2890],{"type":50,"tag":728,"props":2888,"children":2889},{"disabled":581,"type":730},[],{"type":56,"value":2891}," (Dialect-aware only) Resolver tests cover deterministic extension resolution and canonical dialect labeling",{"type":50,"tag":81,"props":2893,"children":2895},{"className":2894},[725],[2896,2899],{"type":50,"tag":728,"props":2897,"children":2898},{"disabled":581,"type":730},[],{"type":56,"value":2900}," (Dialect-aware only) Divergence tests assert meaningful behavior differences between dialects",{"type":50,"tag":81,"props":2902,"children":2904},{"className":2903},[725],[2905,2908,2909,2914,2916],{"type":50,"tag":728,"props":2906,"children":2907},{"disabled":581,"type":730},[],{"type":56,"value":903},{"type":50,"tag":119,"props":2910,"children":2912},{"className":2911},[],[2913],{"type":56,"value":257},{"type":56,"value":2915}," runs ",{"type":50,"tag":119,"props":2917,"children":2919},{"className":2918},[],[2920],{"type":56,"value":2921},"run_common_language_checks(...)",{"type":50,"tag":81,"props":2923,"children":2925},{"className":2924},[725],[2926,2929,2931],{"type":50,"tag":728,"props":2927,"children":2928},{"disabled":581,"type":730},[],{"type":56,"value":2930}," Every slug exposed by the engine has a dedicated test module under ",{"type":50,"tag":119,"props":2932,"children":2934},{"className":2933},[],[2935],{"type":56,"value":2936},"tests\u002F\u003Clanguage>\u002Fmutations",{"type":50,"tag":81,"props":2938,"children":2940},{"className":2939},[725],[2941,2944],{"type":50,"tag":728,"props":2942,"children":2943},{"disabled":581,"type":730},[],{"type":56,"value":2945}," Guard test passes without missing or unexpected modules",{"type":50,"tag":81,"props":2947,"children":2949},{"className":2948},[725],[2950,2953,2954,2960,2962,2968],{"type":50,"tag":728,"props":2951,"children":2952},{"disabled":581,"type":730},[],{"type":56,"value":903},{"type":50,"tag":119,"props":2955,"children":2957},{"className":2956},[],[2958],{"type":56,"value":2959},"cargo test",{"type":56,"value":2961}," (or ",{"type":50,"tag":119,"props":2963,"children":2965},{"className":2964},[],[2966],{"type":56,"value":2967},"just test",{"type":56,"value":2969},") passes the full suite",{"type":50,"tag":410,"props":2971,"children":2973},{"id":2972},"phase-6-validation",[2974],{"type":56,"value":2975},"Phase 6: Validation",{"type":50,"tag":59,"props":2977,"children":2978},{},[2979,2983],{"type":50,"tag":111,"props":2980,"children":2981},{},[2982],{"type":56,"value":423},{"type":56,"value":2984},": All tests pass",{"type":50,"tag":59,"props":2986,"children":2987},{},[2988,2992],{"type":50,"tag":111,"props":2989,"children":2990},{},[2991],{"type":56,"value":433},{"type":56,"value":435},{"type":50,"tag":437,"props":2994,"children":2995},{},[2996,3025,3084,3178],{"type":50,"tag":81,"props":2997,"children":2998},{},[2999,3001],{"type":56,"value":3000},"Build release binary:",{"type":50,"tag":493,"props":3002,"children":3004},{"className":495,"code":3003,"language":497,"meta":498,"style":498},"cargo build --release\n",[3005],{"type":50,"tag":119,"props":3006,"children":3007},{"__ignoreMap":498},[3008],{"type":50,"tag":504,"props":3009,"children":3010},{"class":506,"line":507},[3011,3015,3020],{"type":50,"tag":504,"props":3012,"children":3013},{"style":674},[3014],{"type":56,"value":877},{"type":50,"tag":504,"props":3016,"children":3017},{"style":517},[3018],{"type":56,"value":3019}," build",{"type":50,"tag":504,"props":3021,"children":3022},{"style":517},[3023],{"type":56,"value":3024}," --release\n",{"type":50,"tag":81,"props":3026,"children":3027},{},[3028,3030,3076],{"type":56,"value":3029},"Verify mutations are registered:",{"type":50,"tag":493,"props":3031,"children":3033},{"className":495,"code":3032,"language":497,"meta":498,"style":498},".\u002Ftarget\u002Frelease\u002Fmewt print mutations --language \u003Clanguage>\n",[3034],{"type":50,"tag":119,"props":3035,"children":3036},{"__ignoreMap":498},[3037],{"type":50,"tag":504,"props":3038,"children":3039},{"class":506,"line":507},[3040,3045,3050,3055,3060,3064,3068,3072],{"type":50,"tag":504,"props":3041,"children":3042},{"style":674},[3043],{"type":56,"value":3044},".\u002Ftarget\u002Frelease\u002Fmewt",{"type":50,"tag":504,"props":3046,"children":3047},{"style":517},[3048],{"type":56,"value":3049}," print",{"type":50,"tag":504,"props":3051,"children":3052},{"style":517},[3053],{"type":56,"value":3054}," mutations",{"type":50,"tag":504,"props":3056,"children":3057},{"style":517},[3058],{"type":56,"value":3059}," --language",{"type":50,"tag":504,"props":3061,"children":3062},{"style":529},[3063],{"type":56,"value":687},{"type":50,"tag":504,"props":3065,"children":3066},{"style":517},[3067],{"type":56,"value":692},{"type":50,"tag":504,"props":3069,"children":3070},{"style":523},[3071],{"type":56,"value":697},{"type":50,"tag":504,"props":3073,"children":3074},{"style":529},[3075],{"type":56,"value":994},{"type":50,"tag":77,"props":3077,"children":3078},{},[3079],{"type":50,"tag":81,"props":3080,"children":3081},{},[3082],{"type":56,"value":3083},"Should list COMMON_MUTATIONS (ER, CR, IF, etc.)",{"type":50,"tag":81,"props":3085,"children":3086},{},[3087,3089,3160],{"type":56,"value":3088},"Generate and verify mutants:",{"type":50,"tag":493,"props":3090,"children":3092},{"className":495,"code":3091,"language":497,"meta":498,"style":498},".\u002Ftarget\u002Frelease\u002Fmewt print mutants --target tests\u002F\u003Clanguage>\u002Fexample.\u003Cext>\n",[3093],{"type":50,"tag":119,"props":3094,"children":3095},{"__ignoreMap":498},[3096],{"type":50,"tag":504,"props":3097,"children":3098},{"class":506,"line":507},[3099,3103,3107,3112,3117,3121,3125,3129,3133,3137,3142,3146,3151,3156],{"type":50,"tag":504,"props":3100,"children":3101},{"style":674},[3102],{"type":56,"value":3044},{"type":50,"tag":504,"props":3104,"children":3105},{"style":517},[3106],{"type":56,"value":3049},{"type":50,"tag":504,"props":3108,"children":3109},{"style":517},[3110],{"type":56,"value":3111}," mutants",{"type":50,"tag":504,"props":3113,"children":3114},{"style":517},[3115],{"type":56,"value":3116}," --target",{"type":50,"tag":504,"props":3118,"children":3119},{"style":517},[3120],{"type":56,"value":2442},{"type":50,"tag":504,"props":3122,"children":3123},{"style":529},[3124],{"type":56,"value":981},{"type":50,"tag":504,"props":3126,"children":3127},{"style":517},[3128],{"type":56,"value":692},{"type":50,"tag":504,"props":3130,"children":3131},{"style":523},[3132],{"type":56,"value":697},{"type":50,"tag":504,"props":3134,"children":3135},{"style":529},[3136],{"type":56,"value":702},{"type":50,"tag":504,"props":3138,"children":3139},{"style":517},[3140],{"type":56,"value":3141},"\u002Fexample.",{"type":50,"tag":504,"props":3143,"children":3144},{"style":529},[3145],{"type":56,"value":981},{"type":50,"tag":504,"props":3147,"children":3148},{"style":517},[3149],{"type":56,"value":3150},"ex",{"type":50,"tag":504,"props":3152,"children":3153},{"style":523},[3154],{"type":56,"value":3155},"t",{"type":50,"tag":504,"props":3157,"children":3158},{"style":529},[3159],{"type":56,"value":994},{"type":50,"tag":77,"props":3161,"children":3162},{},[3163,3168,3173],{"type":50,"tag":81,"props":3164,"children":3165},{},[3166],{"type":56,"value":3167},"Verify reasonable number of mutants",{"type":50,"tag":81,"props":3169,"children":3170},{},[3171],{"type":56,"value":3172},"Check mutations are diverse (ER, IF, CR, etc.)",{"type":50,"tag":81,"props":3174,"children":3175},{},[3176],{"type":56,"value":3177},"Verify line numbers are accurate",{"type":50,"tag":81,"props":3179,"children":3180},{},[3181,3183],{"type":56,"value":3182},"Run full test suite:",{"type":50,"tag":493,"props":3184,"children":3186},{"className":495,"code":3185,"language":497,"meta":498,"style":498},"just test\n",[3187],{"type":50,"tag":119,"props":3188,"children":3189},{"__ignoreMap":498},[3190],{"type":50,"tag":504,"props":3191,"children":3192},{"class":506,"line":507},[3193,3198],{"type":50,"tag":504,"props":3194,"children":3195},{"style":674},[3196],{"type":56,"value":3197},"just",{"type":50,"tag":504,"props":3199,"children":3200},{"style":517},[3201],{"type":56,"value":3202}," test\n",{"type":50,"tag":59,"props":3204,"children":3205},{},[3206,3210],{"type":50,"tag":111,"props":3207,"children":3208},{},[3209],{"type":56,"value":715},{"type":56,"value":435},{"type":50,"tag":77,"props":3212,"children":3214},{"className":3213},[720],[3215,3229,3245,3261,3275],{"type":50,"tag":81,"props":3216,"children":3218},{"className":3217},[725],[3219,3222,3223,3228],{"type":50,"tag":728,"props":3220,"children":3221},{"disabled":581,"type":730},[],{"type":56,"value":903},{"type":50,"tag":119,"props":3224,"children":3226},{"className":3225},[],[3227],{"type":56,"value":2363},{"type":56,"value":2365},{"type":50,"tag":81,"props":3230,"children":3232},{"className":3231},[725],[3233,3236,3237,3243],{"type":50,"tag":728,"props":3234,"children":3235},{"disabled":581,"type":730},[],{"type":56,"value":903},{"type":50,"tag":119,"props":3238,"children":3240},{"className":3239},[],[3241],{"type":56,"value":3242},"mewt print mutations --language \u003Clanguage>",{"type":56,"value":3244}," lists mutations",{"type":50,"tag":81,"props":3246,"children":3248},{"className":3247},[725],[3249,3252,3253,3259],{"type":50,"tag":728,"props":3250,"children":3251},{"disabled":581,"type":730},[],{"type":56,"value":903},{"type":50,"tag":119,"props":3254,"children":3256},{"className":3255},[],[3257],{"type":56,"value":3258},"mewt print mutants",{"type":56,"value":3260}," generates mutants from example file",{"type":50,"tag":81,"props":3262,"children":3264},{"className":3263},[725],[3265,3268,3270],{"type":50,"tag":728,"props":3266,"children":3267},{"disabled":581,"type":730},[],{"type":56,"value":3269}," All tests pass with ",{"type":50,"tag":119,"props":3271,"children":3273},{"className":3272},[],[3274],{"type":56,"value":2967},{"type":50,"tag":81,"props":3276,"children":3278},{"className":3277},[725],[3279,3282,3284],{"type":50,"tag":728,"props":3280,"children":3281},{"disabled":581,"type":730},[],{"type":56,"value":3283}," No warnings with ",{"type":50,"tag":119,"props":3285,"children":3287},{"className":3286},[],[3288],{"type":56,"value":909},{"type":50,"tag":65,"props":3290,"children":3292},{"id":3291},"api-quick-reference",[3293],{"type":56,"value":3294},"API Quick Reference",{"type":50,"tag":410,"props":3296,"children":3298},{"id":3297},"the-4-method-trait",[3299],{"type":56,"value":3300},"The 4-Method Trait",{"type":50,"tag":493,"props":3302,"children":3304},{"className":827,"code":3303,"language":829,"meta":498,"style":498},"pub trait LanguageEngine: Send + Sync {\n    fn name(&self) -> &'static str;              \u002F\u002F Language name\n    fn extensions(&self) -> &[&'static str];     \u002F\u002F File extensions\n    fn get_mutations(&self) -> &[Mutation];      \u002F\u002F Available mutations\n    fn mutate(&self, target: &Target) -> Vec\u003CMutant>;  \u002F\u002F Generate mutants\n}\n",[3305],{"type":50,"tag":119,"props":3306,"children":3307},{"__ignoreMap":498},[3308,3316,3324,3332,3340,3348],{"type":50,"tag":504,"props":3309,"children":3310},{"class":506,"line":507},[3311],{"type":50,"tag":504,"props":3312,"children":3313},{},[3314],{"type":56,"value":3315},"pub trait LanguageEngine: Send + Sync {\n",{"type":50,"tag":504,"props":3317,"children":3318},{"class":506,"line":27},[3319],{"type":50,"tag":504,"props":3320,"children":3321},{},[3322],{"type":56,"value":3323},"    fn name(&self) -> &'static str;              \u002F\u002F Language name\n",{"type":50,"tag":504,"props":3325,"children":3326},{"class":506,"line":568},[3327],{"type":50,"tag":504,"props":3328,"children":3329},{},[3330],{"type":56,"value":3331},"    fn extensions(&self) -> &[&'static str];     \u002F\u002F File extensions\n",{"type":50,"tag":504,"props":3333,"children":3334},{"class":506,"line":577},[3335],{"type":50,"tag":504,"props":3336,"children":3337},{},[3338],{"type":56,"value":3339},"    fn get_mutations(&self) -> &[Mutation];      \u002F\u002F Available mutations\n",{"type":50,"tag":504,"props":3341,"children":3342},{"class":506,"line":587},[3343],{"type":50,"tag":504,"props":3344,"children":3345},{},[3346],{"type":56,"value":3347},"    fn mutate(&self, target: &Target) -> Vec\u003CMutant>;  \u002F\u002F Generate mutants\n",{"type":50,"tag":504,"props":3349,"children":3350},{"class":506,"line":608},[3351],{"type":50,"tag":504,"props":3352,"children":3353},{},[3354],{"type":56,"value":1116},{"type":50,"tag":59,"props":3356,"children":3357},{},[3358],{"type":50,"tag":111,"props":3359,"children":3360},{},[3361],{"type":56,"value":3362},"Key changes from older versions:",{"type":50,"tag":77,"props":3364,"children":3365},{},[3366,3384,3397],{"type":50,"tag":81,"props":3367,"children":3368},{},[3369,3371,3376,3378],{"type":56,"value":3370},"✅ ",{"type":50,"tag":119,"props":3372,"children":3374},{"className":3373},[],[3375],{"type":56,"value":2195},{"type":56,"value":3377}," replaces ",{"type":50,"tag":119,"props":3379,"children":3381},{"className":3380},[],[3382],{"type":56,"value":3383},"apply_all_mutations()",{"type":50,"tag":81,"props":3385,"children":3386},{},[3387,3389,3395],{"type":56,"value":3388},"✅ No ",{"type":50,"tag":119,"props":3390,"children":3392},{"className":3391},[],[3393],{"type":56,"value":3394},"tree_sitter_language()",{"type":56,"value":3396}," method - load grammar inline",{"type":50,"tag":81,"props":3398,"children":3399},{},[3400],{"type":56,"value":3401},"✅ No helper methods - keep implementations minimal",{"type":50,"tag":410,"props":3403,"children":3405},{"id":3404},"common-mutation-patterns",[3406],{"type":56,"value":3407},"Common Mutation Patterns",{"type":50,"tag":59,"props":3409,"children":3410},{},[3411,3412,3417],{"type":56,"value":1275},{"type":50,"tag":119,"props":3413,"children":3415},{"className":3414},[],[3416],{"type":56,"value":1281},{"type":56,"value":3418}," for complete examples of:",{"type":50,"tag":3420,"props":3421,"children":3422},"table",{},[3423,3447],{"type":50,"tag":3424,"props":3425,"children":3426},"thead",{},[3427],{"type":50,"tag":3428,"props":3429,"children":3430},"tr",{},[3431,3437,3442],{"type":50,"tag":3432,"props":3433,"children":3434},"th",{},[3435],{"type":56,"value":3436},"Slug",{"type":50,"tag":3432,"props":3438,"children":3439},{},[3440],{"type":56,"value":3441},"Pattern",{"type":50,"tag":3432,"props":3443,"children":3444},{},[3445],{"type":56,"value":3446},"Purpose",{"type":50,"tag":3448,"props":3449,"children":3450},"tbody",{},[3451,3474,3495,3517,3538,3559,3581,3602,3624,3645,3666],{"type":50,"tag":3428,"props":3452,"children":3453},{},[3454,3460,3469],{"type":50,"tag":3455,"props":3456,"children":3457},"td",{},[3458],{"type":56,"value":3459},"ER",{"type":50,"tag":3455,"props":3461,"children":3462},{},[3463],{"type":50,"tag":119,"props":3464,"children":3466},{"className":3465},[],[3467],{"type":56,"value":3468},"patterns::replace()",{"type":50,"tag":3455,"props":3470,"children":3471},{},[3472],{"type":56,"value":3473},"Replace statements with errors",{"type":50,"tag":3428,"props":3475,"children":3476},{},[3477,3482,3490],{"type":50,"tag":3455,"props":3478,"children":3479},{},[3480],{"type":56,"value":3481},"CR",{"type":50,"tag":3455,"props":3483,"children":3484},{},[3485],{"type":50,"tag":119,"props":3486,"children":3488},{"className":3487},[],[3489],{"type":56,"value":3468},{"type":50,"tag":3455,"props":3491,"children":3492},{},[3493],{"type":56,"value":3494},"Replace statements with comments",{"type":50,"tag":3428,"props":3496,"children":3497},{},[3498,3503,3512],{"type":50,"tag":3455,"props":3499,"children":3500},{},[3501],{"type":56,"value":3502},"IF",{"type":50,"tag":3455,"props":3504,"children":3505},{},[3506],{"type":50,"tag":119,"props":3507,"children":3509},{"className":3508},[],[3510],{"type":56,"value":3511},"patterns::replace_condition()",{"type":50,"tag":3455,"props":3513,"children":3514},{},[3515],{"type":56,"value":3516},"Replace if conditions with false",{"type":50,"tag":3428,"props":3518,"children":3519},{},[3520,3525,3533],{"type":50,"tag":3455,"props":3521,"children":3522},{},[3523],{"type":56,"value":3524},"IT",{"type":50,"tag":3455,"props":3526,"children":3527},{},[3528],{"type":50,"tag":119,"props":3529,"children":3531},{"className":3530},[],[3532],{"type":56,"value":3511},{"type":50,"tag":3455,"props":3534,"children":3535},{},[3536],{"type":56,"value":3537},"Replace if conditions with true",{"type":50,"tag":3428,"props":3539,"children":3540},{},[3541,3546,3554],{"type":50,"tag":3455,"props":3542,"children":3543},{},[3544],{"type":56,"value":3545},"WF",{"type":50,"tag":3455,"props":3547,"children":3548},{},[3549],{"type":50,"tag":119,"props":3550,"children":3552},{"className":3551},[],[3553],{"type":56,"value":3511},{"type":50,"tag":3455,"props":3555,"children":3556},{},[3557],{"type":56,"value":3558},"Replace while conditions with false",{"type":50,"tag":3428,"props":3560,"children":3561},{},[3562,3567,3576],{"type":50,"tag":3455,"props":3563,"children":3564},{},[3565],{"type":56,"value":3566},"LC",{"type":50,"tag":3455,"props":3568,"children":3569},{},[3570],{"type":50,"tag":119,"props":3571,"children":3573},{"className":3572},[],[3574],{"type":56,"value":3575},"patterns::swap_branches()",{"type":50,"tag":3455,"props":3577,"children":3578},{},[3579],{"type":56,"value":3580},"Swap true\u002Ffalse branches",{"type":50,"tag":3428,"props":3582,"children":3583},{},[3584,3589,3597],{"type":50,"tag":3455,"props":3585,"children":3586},{},[3587],{"type":56,"value":3588},"BL",{"type":50,"tag":3455,"props":3590,"children":3591},{},[3592],{"type":50,"tag":119,"props":3593,"children":3595},{"className":3594},[],[3596],{"type":56,"value":3468},{"type":50,"tag":3455,"props":3598,"children":3599},{},[3600],{"type":56,"value":3601},"Replace boolean literals",{"type":50,"tag":3428,"props":3603,"children":3604},{},[3605,3610,3619],{"type":50,"tag":3455,"props":3606,"children":3607},{},[3608],{"type":56,"value":3609},"AOS",{"type":50,"tag":3455,"props":3611,"children":3612},{},[3613],{"type":50,"tag":119,"props":3614,"children":3616},{"className":3615},[],[3617],{"type":56,"value":3618},"patterns::replace_operator()",{"type":50,"tag":3455,"props":3620,"children":3621},{},[3622],{"type":56,"value":3623},"Replace arithmetic operators",{"type":50,"tag":3428,"props":3625,"children":3626},{},[3627,3632,3640],{"type":50,"tag":3455,"props":3628,"children":3629},{},[3630],{"type":56,"value":3631},"BOS",{"type":50,"tag":3455,"props":3633,"children":3634},{},[3635],{"type":50,"tag":119,"props":3636,"children":3638},{"className":3637},[],[3639],{"type":56,"value":3618},{"type":50,"tag":3455,"props":3641,"children":3642},{},[3643],{"type":56,"value":3644},"Replace bitwise operators",{"type":50,"tag":3428,"props":3646,"children":3647},{},[3648,3653,3661],{"type":50,"tag":3455,"props":3649,"children":3650},{},[3651],{"type":56,"value":3652},"LOS",{"type":50,"tag":3455,"props":3654,"children":3655},{},[3656],{"type":50,"tag":119,"props":3657,"children":3659},{"className":3658},[],[3660],{"type":56,"value":3618},{"type":50,"tag":3455,"props":3662,"children":3663},{},[3664],{"type":56,"value":3665},"Replace logical operators",{"type":50,"tag":3428,"props":3667,"children":3668},{},[3669,3674,3682],{"type":50,"tag":3455,"props":3670,"children":3671},{},[3672],{"type":56,"value":3673},"COS",{"type":50,"tag":3455,"props":3675,"children":3676},{},[3677],{"type":50,"tag":119,"props":3678,"children":3680},{"className":3679},[],[3681],{"type":56,"value":3618},{"type":50,"tag":3455,"props":3683,"children":3684},{},[3685],{"type":56,"value":3686},"Replace comparison operators",{"type":50,"tag":65,"props":3688,"children":3690},{"id":3689},"common-pitfalls",[3691],{"type":56,"value":3692},"Common Pitfalls",{"type":50,"tag":410,"props":3694,"children":3696},{"id":3695},"node-type-mismatches",[3697],{"type":56,"value":3698},"Node Type Mismatches",{"type":50,"tag":59,"props":3700,"children":3701},{},[3702,3707,3709,3712,3717,3719],{"type":50,"tag":111,"props":3703,"children":3704},{},[3705],{"type":56,"value":3706},"Problem",{"type":56,"value":3708},": Using documentation names instead of actual grammar names",{"type":50,"tag":2465,"props":3710,"children":3711},{},[],{"type":50,"tag":111,"props":3713,"children":3714},{},[3715],{"type":56,"value":3716},"Solution",{"type":56,"value":3718},": Always verify in ",{"type":50,"tag":119,"props":3720,"children":3722},{"className":3721},[],[3723],{"type":56,"value":1064},{"type":50,"tag":410,"props":3725,"children":3727},{"id":3726},"ffi-function-naming",[3728],{"type":56,"value":3729},"FFI Function Naming",{"type":50,"tag":59,"props":3731,"children":3732},{},[3733,3737,3739,3742,3746,3748,3754],{"type":50,"tag":111,"props":3734,"children":3735},{},[3736],{"type":56,"value":3706},{"type":56,"value":3738},": Incorrect external function name",{"type":50,"tag":2465,"props":3740,"children":3741},{},[],{"type":50,"tag":111,"props":3743,"children":3744},{},[3745],{"type":56,"value":3716},{"type":56,"value":3747},": Must be exactly ",{"type":50,"tag":119,"props":3749,"children":3751},{"className":3750},[],[3752],{"type":56,"value":3753},"tree_sitter_\u003Clanguage>",{"type":56,"value":3755}," (all lowercase, underscores for hyphens)",{"type":50,"tag":410,"props":3757,"children":3759},{"id":3758},"missing-scanner",[3760],{"type":56,"value":3761},"Missing Scanner",{"type":50,"tag":59,"props":3763,"children":3764},{},[3765,3769,3771,3774,3778,3780,3785],{"type":50,"tag":111,"props":3766,"children":3767},{},[3768],{"type":56,"value":3706},{"type":56,"value":3770},": Build fails during C compilation",{"type":50,"tag":2465,"props":3772,"children":3773},{},[],{"type":50,"tag":111,"props":3775,"children":3776},{},[3777],{"type":56,"value":3716},{"type":56,"value":3779},": Some grammars need ",{"type":50,"tag":119,"props":3781,"children":3783},{"className":3782},[],[3784],{"type":56,"value":778},{"type":56,"value":3786}," - the update script handles this automatically",{"type":50,"tag":410,"props":3788,"children":3790},{"id":3789},"over-engineering",[3791],{"type":56,"value":3792},"Over-Engineering",{"type":50,"tag":59,"props":3794,"children":3795},{},[3796,3800,3802,3805,3809],{"type":50,"tag":111,"props":3797,"children":3798},{},[3799],{"type":56,"value":3706},{"type":56,"value":3801},": Adding helper methods, custom parsing logic",{"type":50,"tag":2465,"props":3803,"children":3804},{},[],{"type":50,"tag":111,"props":3806,"children":3807},{},[3808],{"type":56,"value":3716},{"type":56,"value":3810},": Keep it minimal - just implement the 4 trait methods",{"type":50,"tag":410,"props":3812,"children":3814},{"id":3813},"too-many-custom-mutations",[3815],{"type":56,"value":3816},"Too Many Custom Mutations",{"type":50,"tag":59,"props":3818,"children":3819},{},[3820,3824,3826,3829,3833],{"type":50,"tag":111,"props":3821,"children":3822},{},[3823],{"type":56,"value":3706},{"type":56,"value":3825},": Adding language-specific mutations before verifying common ones work",{"type":50,"tag":2465,"props":3827,"children":3828},{},[],{"type":50,"tag":111,"props":3830,"children":3831},{},[3832],{"type":56,"value":3716},{"type":56,"value":3834},": Start with COMMON_MUTATIONS only. Most languages need zero custom mutations.",{"type":50,"tag":410,"props":3836,"children":3838},{"id":3837},"compound-assignment-node-kinds",[3839],{"type":56,"value":3840},"Compound Assignment Node Kinds",{"type":50,"tag":59,"props":3842,"children":3843},{},[3844,3848,3850,3855,3857,3860,3864,3866,3871,3873,3878,3879,3885,3887,3893],{"type":50,"tag":111,"props":3845,"children":3846},{},[3847],{"type":56,"value":3706},{"type":56,"value":3849},": Assuming compound assignments share the ",{"type":50,"tag":119,"props":3851,"children":3853},{"className":3852},[],[3854],{"type":56,"value":1179},{"type":56,"value":3856}," node kind",{"type":50,"tag":2465,"props":3858,"children":3859},{},[],{"type":50,"tag":111,"props":3861,"children":3862},{},[3863],{"type":56,"value":3716},{"type":56,"value":3865},": Check ",{"type":50,"tag":119,"props":3867,"children":3869},{"className":3868},[],[3870],{"type":56,"value":785},{"type":56,"value":3872}," for the exact node kind (e.g., ",{"type":50,"tag":119,"props":3874,"children":3876},{"className":3875},[],[3877],{"type":56,"value":1171},{"type":56,"value":190},{"type":50,"tag":119,"props":3880,"children":3882},{"className":3881},[],[3883],{"type":56,"value":3884},"compound_assignment_expr",{"type":56,"value":3886},") and wire AAOS\u002FBAOS\u002FSAOS to that. Include all language-specific operator tokens when configuring ",{"type":50,"tag":119,"props":3888,"children":3890},{"className":3889},[],[3891],{"type":56,"value":3892},"patterns::shuffle_operators",{"type":56,"value":2496},{"type":50,"tag":65,"props":3895,"children":3897},{"id":3896},"success-checklist",[3898],{"type":56,"value":3899},"Success Checklist",{"type":50,"tag":410,"props":3901,"children":3903},{"id":3902},"dialect-aware-extension-checklist-apply-when-relevant",[3904],{"type":56,"value":3905},"Dialect-Aware Extension Checklist (apply when relevant)",{"type":50,"tag":77,"props":3907,"children":3909},{"className":3908},[720],[3910,3919,3928,3937,3946],{"type":50,"tag":81,"props":3911,"children":3913},{"className":3912},[725],[3914,3917],{"type":50,"tag":728,"props":3915,"children":3916},{"disabled":581,"type":730},[],{"type":56,"value":3918}," Resolver owns final language+dialect selection (no command-level branching)",{"type":50,"tag":81,"props":3920,"children":3922},{"className":3921},[725],[3923,3926],{"type":50,"tag":728,"props":3924,"children":3925},{"disabled":581,"type":730},[],{"type":56,"value":3927}," Canonical dialect labels\u002Fselectors are documented and used consistently",{"type":50,"tag":81,"props":3929,"children":3931},{"className":3930},[725],[3932,3935],{"type":50,"tag":728,"props":3933,"children":3934},{"disabled":581,"type":730},[],{"type":56,"value":3936}," Ambiguous extension handling is deterministic and test-covered",{"type":50,"tag":81,"props":3938,"children":3940},{"className":3939},[725],[3941,3944],{"type":50,"tag":728,"props":3942,"children":3943},{"disabled":581,"type":730},[],{"type":56,"value":3945}," Dialect-divergence behavior is explicit and test-enforced",{"type":50,"tag":81,"props":3947,"children":3949},{"className":3948},[725],[3950,3953],{"type":50,"tag":728,"props":3951,"children":3952},{"disabled":581,"type":730},[],{"type":56,"value":3954}," Store\u002Ffilter behavior uses canonical labels without assuming legacy alias support",{"type":50,"tag":65,"props":3956,"children":3958},{"id":3957},"success-checklist-1",[3959],{"type":56,"value":3899},{"type":50,"tag":77,"props":3961,"children":3963},{"className":3962},[720],[3964,3978,3992,4001,4010,4019,4034,4043,4052,4061,4076,4091,4106],{"type":50,"tag":81,"props":3965,"children":3967},{"className":3966},[725],[3968,3971,3973],{"type":50,"tag":728,"props":3969,"children":3970},{"disabled":581,"type":730},[],{"type":56,"value":3972}," Grammar files extracted to ",{"type":50,"tag":119,"props":3974,"children":3976},{"className":3975},[],[3977],{"type":56,"value":739},{"type":50,"tag":81,"props":3979,"children":3981},{"className":3980},[725],[3982,3985,3987],{"type":50,"tag":728,"props":3983,"children":3984},{"disabled":581,"type":730},[],{"type":56,"value":3986}," Build system updated in ",{"type":50,"tag":119,"props":3988,"children":3990},{"className":3989},[],[3991],{"type":56,"value":822},{"type":50,"tag":81,"props":3993,"children":3995},{"className":3994},[725],[3996,3999],{"type":50,"tag":728,"props":3997,"children":3998},{"disabled":581,"type":730},[],{"type":56,"value":4000}," Module structure created (mod.rs, syntax.rs, mutations.rs, engine.rs)",{"type":50,"tag":81,"props":4002,"children":4004},{"className":4003},[725],[4005,4008],{"type":50,"tag":728,"props":4006,"children":4007},{"disabled":581,"type":730},[],{"type":56,"value":4009}," Syntax mappings verified from node-types.json",{"type":50,"tag":81,"props":4011,"children":4013},{"className":4012},[725],[4014,4017],{"type":50,"tag":728,"props":4015,"children":4016},{"disabled":581,"type":730},[],{"type":56,"value":4018}," Engine implements exactly 4 trait methods (no extras)",{"type":50,"tag":81,"props":4020,"children":4022},{"className":4021},[725],[4023,4026,4027,4032],{"type":50,"tag":728,"props":4024,"children":4025},{"disabled":581,"type":730},[],{"type":56,"value":2189},{"type":50,"tag":119,"props":4028,"children":4030},{"className":4029},[],[4031],{"type":56,"value":2195},{"type":56,"value":4033}," using OnceLock",{"type":50,"tag":81,"props":4035,"children":4037},{"className":4036},[725],[4038,4041],{"type":50,"tag":728,"props":4039,"children":4040},{"disabled":581,"type":730},[],{"type":56,"value":4042}," Language registered in src\u002Flanguages\u002Fmod.rs and src\u002Fmain.rs",{"type":50,"tag":81,"props":4044,"children":4046},{"className":4045},[725],[4047,4050],{"type":50,"tag":728,"props":4048,"children":4049},{"disabled":581,"type":730},[],{"type":56,"value":4051}," Example files created with diverse syntax",{"type":50,"tag":81,"props":4053,"children":4055},{"className":4054},[725],[4056,4059],{"type":50,"tag":728,"props":4057,"children":4058},{"disabled":581,"type":730},[],{"type":56,"value":4060}," Integration tests written and passing",{"type":50,"tag":81,"props":4062,"children":4064},{"className":4063},[725],[4065,4068,4069,4074],{"type":50,"tag":728,"props":4066,"children":4067},{"disabled":581,"type":730},[],{"type":56,"value":903},{"type":50,"tag":119,"props":4070,"children":4072},{"className":4071},[],[4073],{"type":56,"value":2363},{"type":56,"value":4075}," succeeds without warnings",{"type":50,"tag":81,"props":4077,"children":4079},{"className":4078},[725],[4080,4083,4084,4089],{"type":50,"tag":728,"props":4081,"children":4082},{"disabled":581,"type":730},[],{"type":56,"value":903},{"type":50,"tag":119,"props":4085,"children":4087},{"className":4086},[],[4088],{"type":56,"value":3242},{"type":56,"value":4090}," works",{"type":50,"tag":81,"props":4092,"children":4094},{"className":4093},[725],[4095,4098,4099,4104],{"type":50,"tag":728,"props":4096,"children":4097},{"disabled":581,"type":730},[],{"type":56,"value":903},{"type":50,"tag":119,"props":4100,"children":4102},{"className":4101},[],[4103],{"type":56,"value":3258},{"type":56,"value":4105}," generates mutants from examples",{"type":50,"tag":81,"props":4107,"children":4109},{"className":4108},[725],[4110,4113,4114],{"type":50,"tag":728,"props":4111,"children":4112},{"disabled":581,"type":730},[],{"type":56,"value":3269},{"type":50,"tag":119,"props":4115,"children":4117},{"className":4116},[],[4118],{"type":56,"value":2967},{"type":50,"tag":65,"props":4120,"children":4122},{"id":4121},"example-adding-go-support",[4123],{"type":56,"value":4124},"Example: Adding Go Support",{"type":50,"tag":59,"props":4126,"children":4127},{},[4128],{"type":56,"value":4129},"Condensed walkthrough assuming tree-sitter-go URL is known:",{"type":50,"tag":493,"props":4131,"children":4133},{"className":495,"code":4132,"language":497,"meta":498,"style":498},"# Phase 1: Edit grammars\u002Fupdate.sh to add go configuration, then:\ncd grammars && bash update.sh go false\n\n# Phase 2: Edit build.rs to add build_grammar call for go\n\n# Phase 3: Create language implementation\nmkdir -p src\u002Flanguages\u002Fgo\n# Create mod.rs, syntax.rs, mutations.rs, engine.rs\n\n# Phase 4: Edit src\u002Flanguages\u002Fmod.rs to export go module\n# Edit src\u002Fmain.rs to register GoLanguageEngine\n\n# Phase 5: Create tests\nmkdir -p tests\u002Fgo\u002Fexamples\n# Create example.go and integration_tests.rs\n\n# Phase 6: Validate\ncargo build --release\n.\u002Ftarget\u002Frelease\u002Fmewt print mutations --language go\n.\u002Ftarget\u002Frelease\u002Fmewt print mutants --target tests\u002Fgo\u002Fexample.go\njust test\n",[4134],{"type":50,"tag":119,"props":4135,"children":4136},{"__ignoreMap":498},[4137,4145,4177,4184,4192,4199,4207,4223,4231,4238,4246,4254,4261,4269,4285,4293,4300,4308,4323,4347,4371],{"type":50,"tag":504,"props":4138,"children":4139},{"class":506,"line":507},[4140],{"type":50,"tag":504,"props":4141,"children":4142},{"style":629},[4143],{"type":56,"value":4144},"# Phase 1: Edit grammars\u002Fupdate.sh to add go configuration, then:\n",{"type":50,"tag":504,"props":4146,"children":4147},{"class":506,"line":27},[4148,4152,4156,4160,4164,4168,4173],{"type":50,"tag":504,"props":4149,"children":4150},{"style":658},[4151],{"type":56,"value":661},{"type":50,"tag":504,"props":4153,"children":4154},{"style":517},[4155],{"type":56,"value":666},{"type":50,"tag":504,"props":4157,"children":4158},{"style":529},[4159],{"type":56,"value":671},{"type":50,"tag":504,"props":4161,"children":4162},{"style":674},[4163],{"type":56,"value":677},{"type":50,"tag":504,"props":4165,"children":4166},{"style":517},[4167],{"type":56,"value":682},{"type":50,"tag":504,"props":4169,"children":4170},{"style":517},[4171],{"type":56,"value":4172}," go",{"type":50,"tag":504,"props":4174,"children":4175},{"style":529},[4176],{"type":56,"value":707},{"type":50,"tag":504,"props":4178,"children":4179},{"class":506,"line":568},[4180],{"type":50,"tag":504,"props":4181,"children":4182},{"emptyLinePlaceholder":581},[4183],{"type":56,"value":584},{"type":50,"tag":504,"props":4185,"children":4186},{"class":506,"line":577},[4187],{"type":50,"tag":504,"props":4188,"children":4189},{"style":629},[4190],{"type":56,"value":4191},"# Phase 2: Edit build.rs to add build_grammar call for go\n",{"type":50,"tag":504,"props":4193,"children":4194},{"class":506,"line":587},[4195],{"type":50,"tag":504,"props":4196,"children":4197},{"emptyLinePlaceholder":581},[4198],{"type":56,"value":584},{"type":50,"tag":504,"props":4200,"children":4201},{"class":506,"line":608},[4202],{"type":50,"tag":504,"props":4203,"children":4204},{"style":629},[4205],{"type":56,"value":4206},"# Phase 3: Create language implementation\n",{"type":50,"tag":504,"props":4208,"children":4209},{"class":506,"line":635},[4210,4214,4218],{"type":50,"tag":504,"props":4211,"children":4212},{"style":674},[4213],{"type":56,"value":966},{"type":50,"tag":504,"props":4215,"children":4216},{"style":517},[4217],{"type":56,"value":971},{"type":50,"tag":504,"props":4219,"children":4220},{"style":517},[4221],{"type":56,"value":4222}," src\u002Flanguages\u002Fgo\n",{"type":50,"tag":504,"props":4224,"children":4225},{"class":506,"line":1134},[4226],{"type":50,"tag":504,"props":4227,"children":4228},{"style":629},[4229],{"type":56,"value":4230},"# Create mod.rs, syntax.rs, mutations.rs, engine.rs\n",{"type":50,"tag":504,"props":4232,"children":4233},{"class":506,"line":1143},[4234],{"type":50,"tag":504,"props":4235,"children":4236},{"emptyLinePlaceholder":581},[4237],{"type":56,"value":584},{"type":50,"tag":504,"props":4239,"children":4240},{"class":506,"line":1152},[4241],{"type":50,"tag":504,"props":4242,"children":4243},{"style":629},[4244],{"type":56,"value":4245},"# Phase 4: Edit src\u002Flanguages\u002Fmod.rs to export go module\n",{"type":50,"tag":504,"props":4247,"children":4248},{"class":506,"line":1376},[4249],{"type":50,"tag":504,"props":4250,"children":4251},{"style":629},[4252],{"type":56,"value":4253},"# Edit src\u002Fmain.rs to register GoLanguageEngine\n",{"type":50,"tag":504,"props":4255,"children":4256},{"class":506,"line":1385},[4257],{"type":50,"tag":504,"props":4258,"children":4259},{"emptyLinePlaceholder":581},[4260],{"type":56,"value":584},{"type":50,"tag":504,"props":4262,"children":4263},{"class":506,"line":1393},[4264],{"type":50,"tag":504,"props":4265,"children":4266},{"style":629},[4267],{"type":56,"value":4268},"# Phase 5: Create tests\n",{"type":50,"tag":504,"props":4270,"children":4271},{"class":506,"line":1402},[4272,4276,4280],{"type":50,"tag":504,"props":4273,"children":4274},{"style":674},[4275],{"type":56,"value":966},{"type":50,"tag":504,"props":4277,"children":4278},{"style":517},[4279],{"type":56,"value":971},{"type":50,"tag":504,"props":4281,"children":4282},{"style":517},[4283],{"type":56,"value":4284}," tests\u002Fgo\u002Fexamples\n",{"type":50,"tag":504,"props":4286,"children":4287},{"class":506,"line":1410},[4288],{"type":50,"tag":504,"props":4289,"children":4290},{"style":629},[4291],{"type":56,"value":4292},"# Create example.go and integration_tests.rs\n",{"type":50,"tag":504,"props":4294,"children":4295},{"class":506,"line":1419},[4296],{"type":50,"tag":504,"props":4297,"children":4298},{"emptyLinePlaceholder":581},[4299],{"type":56,"value":584},{"type":50,"tag":504,"props":4301,"children":4302},{"class":506,"line":1428},[4303],{"type":50,"tag":504,"props":4304,"children":4305},{"style":629},[4306],{"type":56,"value":4307},"# Phase 6: Validate\n",{"type":50,"tag":504,"props":4309,"children":4310},{"class":506,"line":1436},[4311,4315,4319],{"type":50,"tag":504,"props":4312,"children":4313},{"style":674},[4314],{"type":56,"value":877},{"type":50,"tag":504,"props":4316,"children":4317},{"style":517},[4318],{"type":56,"value":3019},{"type":50,"tag":504,"props":4320,"children":4321},{"style":517},[4322],{"type":56,"value":3024},{"type":50,"tag":504,"props":4324,"children":4325},{"class":506,"line":1444},[4326,4330,4334,4338,4342],{"type":50,"tag":504,"props":4327,"children":4328},{"style":674},[4329],{"type":56,"value":3044},{"type":50,"tag":504,"props":4331,"children":4332},{"style":517},[4333],{"type":56,"value":3049},{"type":50,"tag":504,"props":4335,"children":4336},{"style":517},[4337],{"type":56,"value":3054},{"type":50,"tag":504,"props":4339,"children":4340},{"style":517},[4341],{"type":56,"value":3059},{"type":50,"tag":504,"props":4343,"children":4344},{"style":517},[4345],{"type":56,"value":4346}," go\n",{"type":50,"tag":504,"props":4348,"children":4349},{"class":506,"line":1453},[4350,4354,4358,4362,4366],{"type":50,"tag":504,"props":4351,"children":4352},{"style":674},[4353],{"type":56,"value":3044},{"type":50,"tag":504,"props":4355,"children":4356},{"style":517},[4357],{"type":56,"value":3049},{"type":50,"tag":504,"props":4359,"children":4360},{"style":517},[4361],{"type":56,"value":3111},{"type":50,"tag":504,"props":4363,"children":4364},{"style":517},[4365],{"type":56,"value":3116},{"type":50,"tag":504,"props":4367,"children":4368},{"style":517},[4369],{"type":56,"value":4370}," tests\u002Fgo\u002Fexample.go\n",{"type":50,"tag":504,"props":4372,"children":4373},{"class":506,"line":1462},[4374,4378],{"type":50,"tag":504,"props":4375,"children":4376},{"style":674},[4377],{"type":56,"value":3197},{"type":50,"tag":504,"props":4379,"children":4380},{"style":517},[4381],{"type":56,"value":3202},{"type":50,"tag":4383,"props":4384,"children":4385},"style",{},[4386],{"type":56,"value":4387},"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":4389,"total":4543},[4390,4409,4419,4437,4452,4463,4475,4485,4498,4509,4521,4532],{"slug":4391,"name":4391,"fn":4392,"description":4393,"org":4394,"tags":4395,"stars":4406,"repoUrl":4407,"updatedAt":4408},"address-sanitizer","detect memory errors during fuzzing","AddressSanitizer detects memory errors during fuzzing. Use when fuzzing C\u002FC++ code to find buffer overflows and use-after-free bugs.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4396,4399,4402,4405],{"name":4397,"slug":4398,"type":16},"C#","c",{"name":4400,"slug":4401,"type":16},"Debugging","debugging",{"name":4403,"slug":4404,"type":16},"Security","security",{"name":21,"slug":22,"type":16},6139,"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fskills","2026-07-17T06:05:14.925095",{"slug":4410,"name":4410,"fn":4411,"description":4412,"org":4413,"tags":4414,"stars":4406,"repoUrl":4407,"updatedAt":4418},"aflpp","perform multi-core fuzzing of C\u002FC++ projects","AFL++ is a fork of AFL with better fuzzing performance and advanced features. Use for multi-core fuzzing of C\u002FC++ projects.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4415,4416,4417],{"name":4397,"slug":4398,"type":16},{"name":4403,"slug":4404,"type":16},{"name":21,"slug":22,"type":16},"2026-07-17T06:05:12.433192",{"slug":4420,"name":4420,"fn":4421,"description":4422,"org":4423,"tags":4424,"stars":4406,"repoUrl":4407,"updatedAt":4436},"agentic-actions-auditor","audit GitHub Actions for security vulnerabilities","Audits GitHub Actions workflows for security vulnerabilities in AI agent integrations including Claude Code Action, Gemini CLI, OpenAI Codex, and GitHub AI Inference. Detects attack vectors where attacker-controlled input reaches AI agents running in CI\u002FCD pipelines, including env var intermediary patterns, direct expression injection, dangerous sandbox configurations, and wildcard user allowlists. Use when reviewing workflow files that invoke AI coding agents, auditing CI\u002FCD pipeline security for prompt injection risks, or evaluating agentic action configurations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4425,4428,4431,4432,4435],{"name":4426,"slug":4427,"type":16},"Agents","agents",{"name":4429,"slug":4430,"type":16},"CI\u002FCD","ci-cd",{"name":18,"slug":19,"type":16},{"name":4433,"slug":4434,"type":16},"GitHub Actions","github-actions",{"name":4403,"slug":4404,"type":16},"2026-07-18T05:47:48.564744",{"slug":4438,"name":4438,"fn":4439,"description":4440,"org":4441,"tags":4442,"stars":4406,"repoUrl":4407,"updatedAt":4451},"algorand-vulnerability-scanner","scan Algorand smart contracts for vulnerabilities","Scans Algorand smart contracts for 11 common vulnerabilities including rekeying attacks, unchecked transaction fees, missing field validations, and access control issues. Use when auditing Algorand projects (TEAL\u002FPyTeal).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4443,4446,4447,4448],{"name":4444,"slug":4445,"type":16},"Audit","audit",{"name":18,"slug":19,"type":16},{"name":4403,"slug":4404,"type":16},{"name":4449,"slug":4450,"type":16},"Smart Contracts","smart-contracts","2026-07-18T05:47:43.989063",{"slug":4453,"name":4453,"fn":4454,"description":4455,"org":4456,"tags":4457,"stars":4406,"repoUrl":4407,"updatedAt":4462},"ask-questions-if-underspecified","clarify requirements before implementation","Clarify requirements before implementing. Use when serious doubts arise.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4458,4459],{"name":14,"slug":15,"type":16},{"name":4460,"slug":4461,"type":16},"Productivity","productivity","2026-07-17T06:05:33.543262",{"slug":4464,"name":4464,"fn":4465,"description":4466,"org":4467,"tags":4468,"stars":4406,"repoUrl":4407,"updatedAt":4474},"atheris","fuzz Python code with Atheris","Atheris is a coverage-guided Python fuzzer based on libFuzzer. Use for fuzzing pure Python code and Python C extensions.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4469,4472,4473],{"name":4470,"slug":4471,"type":16},"Python","python",{"name":4403,"slug":4404,"type":16},{"name":21,"slug":22,"type":16},"2026-07-17T06:05:14.575191",{"slug":4476,"name":4476,"fn":4477,"description":4478,"org":4479,"tags":4480,"stars":4406,"repoUrl":4407,"updatedAt":4484},"audit-augmentation","augment code graphs with audit findings","Augments Trailmark code graphs with external audit findings from SARIF static analysis results, weAudit annotation files, and version-gated Trailmark 0.4.x binary-analysis graph exports. Maps findings to graph nodes by file and line overlap, creates severity-based subgraphs, and enables cross-referencing findings with pre-analysis data (blast radius, taint, etc.). Use when projecting SARIF results onto a code graph, overlaying weAudit annotations, importing binary graph findings, cross-referencing Semgrep, CodeQL, or binary-analysis findings with call graph data, or visualizing audit findings in the context of code structure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4481,4482,4483],{"name":4444,"slug":4445,"type":16},{"name":18,"slug":19,"type":16},{"name":4403,"slug":4404,"type":16},"2026-08-01T05:44:54.920542",{"slug":4486,"name":4486,"fn":4487,"description":4488,"org":4489,"tags":4490,"stars":4406,"repoUrl":4407,"updatedAt":4497},"audit-context-building","build architectural context for code analysis","Enables ultra-granular, line-by-line code analysis to build deep architectural context before vulnerability or bug finding.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4491,4494,4495,4496],{"name":4492,"slug":4493,"type":16},"Architecture","architecture",{"name":4444,"slug":4445,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},"2026-07-18T05:47:40.122449",{"slug":4499,"name":4499,"fn":4500,"description":4501,"org":4502,"tags":4503,"stars":4406,"repoUrl":4407,"updatedAt":4508},"audit-prep-assistant","prepare codebases for security audits","Prepares codebases for security review using Trail of Bits' checklist. Helps set review goals, runs static analysis tools, increases test coverage, removes dead code, ensures accessibility, and generates documentation (flowcharts, user stories, inline comments).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4504,4505,4506,4507],{"name":4444,"slug":4445,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":4403,"slug":4404,"type":16},"2026-07-18T05:47:39.210985",{"slug":4510,"name":4510,"fn":4511,"description":4512,"org":4513,"tags":4514,"stars":4406,"repoUrl":4407,"updatedAt":4520},"burpsuite-project-parser","parse Burp Suite project files","Searches and explores Burp Suite project files (.burp) from the command line. Use when searching response headers or bodies with regex patterns, extracting security audit findings, dumping proxy history or site map data, or analyzing HTTP traffic captured in a Burp project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4515,4516,4519],{"name":4444,"slug":4445,"type":16},{"name":4517,"slug":4518,"type":16},"CLI","cli",{"name":4403,"slug":4404,"type":16},"2026-07-17T06:05:33.198077",{"slug":4522,"name":4522,"fn":4523,"description":4524,"org":4525,"tags":4526,"stars":4406,"repoUrl":4407,"updatedAt":4531},"c-review","audit C and C++ code","Performs comprehensive C\u002FC++ security review for memory corruption, integer overflows, race conditions, and platform-specific vulnerabilities. Use when auditing native C\u002FC++ applications, reviewing daemons or services for memory safety, or hunting integer overflow \u002F use-after-free \u002F race conditions in userspace code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4527,4528,4529,4530],{"name":4444,"slug":4445,"type":16},{"name":4397,"slug":4398,"type":16},{"name":18,"slug":19,"type":16},{"name":4403,"slug":4404,"type":16},"2026-07-17T06:05:11.333374",{"slug":4533,"name":4533,"fn":4534,"description":4535,"org":4536,"tags":4537,"stars":4406,"repoUrl":4407,"updatedAt":4542},"cairo-vulnerability-scanner","scan Cairo and StarkNet contracts for vulnerabilities","Scans Cairo\u002FStarkNet smart contracts for 6 critical vulnerabilities including felt252 arithmetic overflow, L1-L2 messaging issues, address conversion problems, and signature replay. Use when auditing StarkNet projects.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4538,4539,4540,4541],{"name":4444,"slug":4445,"type":16},{"name":18,"slug":19,"type":16},{"name":4403,"slug":4404,"type":16},{"name":4449,"slug":4450,"type":16},"2026-07-18T05:47:42.84568",111,{"items":4545,"total":507},[4546],{"slug":4,"name":4,"fn":5,"description":6,"org":4547,"tags":4548,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4549,4550,4551],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":21,"slug":22,"type":16}]