[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-accordant-overview":3,"mdc-3u0cep-key":38,"related-org-microsoft-accordant-overview":860,"related-repo-microsoft-accordant-overview":1057},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":33,"sourceUrl":36,"mdContent":37},"accordant-overview","explain Accordant model-based testing concepts","What Accordant is, when to use model-based testing, and core concepts - use this skill when starting with Accordant or explaining its purpose",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,19],{"name":13,"slug":14,"type":15},"Documentation","documentation","tag",{"name":17,"slug":18,"type":15},"Reference","reference",{"name":20,"slug":21,"type":15},"Testing","testing",53,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant","2026-07-07T06:53:44.67572",null,5,[28,29,30,31,32],"concurrency-testing","conformance-testing","linearizability","model-based-testing","test-generation",{"repoUrl":23,"stars":22,"forks":26,"topics":34,"description":35},[28,29,30,31,32],"A model-based testing framework for .NET that validates implementations against behavioral specifications.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Ftree\u002FHEAD\u002Fagent\u002Fskills\u002Foverview","---\nname: accordant-overview\ndescription: What Accordant is, when to use model-based testing, and core concepts - use this skill when starting with Accordant or explaining its purpose\n---\n\n# Accordant Overview\n\nAccordant is a **model-based testing framework** for .NET. You write a *spec* — executable code that captures what your system should do — and Accordant generates tests, validates responses, and finds bugs.\n\n## When to Use Accordant\n\nAccordant excels when:\n- Your system is **stateful** (databases, caches, queues, sessions)\n- You have **many operations** that interact with shared state\n- You want to test **operation sequences** (not just individual calls)\n- You need to find **race conditions** in concurrent code\n- You want a **single source of truth** for behavior (not scattered assertions)\n\n## Core Concepts\n\n### The Spec\n\nA spec is executable code defining what your system should do:\n\n```csharp\nvar spec = new Spec\u003CBankState>();\n\nspec.Operation\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\", (accountId, state) =>\n{\n    if (state.Accounts.ContainsKey(accountId))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsConflict).SameState();\n\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == 0)\n           .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0);\n});\n```\n\n### State\n\nState is what the system \"remembers\" between operations. Keep it minimal — only what's needed to define correct behavior:\n\n```csharp\n[State]\npublic partial class BankState\n{\n    public Dictionary\u003Cstring, decimal> Accounts { get; set; } = new();\n}\n```\n\n### Operations\n\nAn operation represents an atomic action — API call, method invocation, command. Each operation has:\n- **Apply**: What *should* happen (the spec logic)\n- **Execute**: What *actually* happens (calls the real system)\n\n### Test Generation\n\nAccordant explores operation sequences by simulating the spec, then runs generated tests against your real system:\n\n```csharp\nvar testCases = spec.GenerateTests(initialState, inputs, options);\nvar results = await spec.RunTests(context, initialState, testCases, executionOptions);\n```\n\n## The Typical Workflow\n\n1. **Define State** — What does the system track?\n2. **Define Operations** — What can happen to that state?\n3. **Bind to Real System** — Connect spec operations to actual API calls\n4. **Generate & Run Tests** — Let Accordant explore and validate\n\n## Example: BankAccount Spec\n\n```csharp\n[State]\npublic partial class BankState\n{\n    public Dictionary\u003Cstring, decimal> Accounts { get; set; } = new();\n}\n\nvar spec = new Spec\u003CBankState>();\n\n\u002F\u002F Create Account\nspec.Operation\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\", (accountId, state) =>\n{\n    if (state.Accounts.ContainsKey(accountId))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsConflict).SameState();\n\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == 0)\n           .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0);\n});\n\n\u002F\u002F Withdraw\nspec.Operation\u003C(string AccountId, decimal Amount), ApiResult\u003Cdecimal>>(\"Withdraw\", (req, state) =>\n{\n    if (!state.Accounts.TryGetValue(req.AccountId, out var balance))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound).SameState();\n\n    if (balance \u003C req.Amount)\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest).SameState();\n\n    var newBalance = balance - req.Amount;\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n           .ThenState\u003CBankState>(s => s.Accounts[req.AccountId] = newBalance);\n});\n```\n\n## Key Benefits\n\n| Benefit | Description |\n|---------|-------------|\n| **Single source of truth** | Business rules live in one place, not scattered across tests |\n| **Automatic test generation** | Cover operation sequences you'd never think to write manually |\n| **Concurrency testing** | Find race conditions with linearizability checking |\n| **Confidence through change** | Refactor freely; the spec validates correctness |\n\n## Next Steps\n\n- **State Design**: Learn to model state effectively\n- **Operations**: Master the Apply\u002FExecute pattern\n- **Test Generation**: Configure and run auto-generated tests\n",{"data":39,"body":40},{"name":4,"description":6},{"type":41,"children":42},"root",[43,51,73,80,85,150,156,163,168,271,277,282,328,334,339,375,380,385,408,414,458,464,719,725,817,823,854],{"type":44,"tag":45,"props":46,"children":47},"element","h1",{"id":4},[48],{"type":49,"value":50},"text","Accordant Overview",{"type":44,"tag":52,"props":53,"children":54},"p",{},[55,57,63,65,71],{"type":49,"value":56},"Accordant is a ",{"type":44,"tag":58,"props":59,"children":60},"strong",{},[61],{"type":49,"value":62},"model-based testing framework",{"type":49,"value":64}," for .NET. You write a ",{"type":44,"tag":66,"props":67,"children":68},"em",{},[69],{"type":49,"value":70},"spec",{"type":49,"value":72}," — executable code that captures what your system should do — and Accordant generates tests, validates responses, and finds bugs.",{"type":44,"tag":74,"props":75,"children":77},"h2",{"id":76},"when-to-use-accordant",[78],{"type":49,"value":79},"When to Use Accordant",{"type":44,"tag":52,"props":81,"children":82},{},[83],{"type":49,"value":84},"Accordant excels when:",{"type":44,"tag":86,"props":87,"children":88},"ul",{},[89,102,114,126,138],{"type":44,"tag":90,"props":91,"children":92},"li",{},[93,95,100],{"type":49,"value":94},"Your system is ",{"type":44,"tag":58,"props":96,"children":97},{},[98],{"type":49,"value":99},"stateful",{"type":49,"value":101}," (databases, caches, queues, sessions)",{"type":44,"tag":90,"props":103,"children":104},{},[105,107,112],{"type":49,"value":106},"You have ",{"type":44,"tag":58,"props":108,"children":109},{},[110],{"type":49,"value":111},"many operations",{"type":49,"value":113}," that interact with shared state",{"type":44,"tag":90,"props":115,"children":116},{},[117,119,124],{"type":49,"value":118},"You want to test ",{"type":44,"tag":58,"props":120,"children":121},{},[122],{"type":49,"value":123},"operation sequences",{"type":49,"value":125}," (not just individual calls)",{"type":44,"tag":90,"props":127,"children":128},{},[129,131,136],{"type":49,"value":130},"You need to find ",{"type":44,"tag":58,"props":132,"children":133},{},[134],{"type":49,"value":135},"race conditions",{"type":49,"value":137}," in concurrent code",{"type":44,"tag":90,"props":139,"children":140},{},[141,143,148],{"type":49,"value":142},"You want a ",{"type":44,"tag":58,"props":144,"children":145},{},[146],{"type":49,"value":147},"single source of truth",{"type":49,"value":149}," for behavior (not scattered assertions)",{"type":44,"tag":74,"props":151,"children":153},{"id":152},"core-concepts",[154],{"type":49,"value":155},"Core Concepts",{"type":44,"tag":157,"props":158,"children":160},"h3",{"id":159},"the-spec",[161],{"type":49,"value":162},"The Spec",{"type":44,"tag":52,"props":164,"children":165},{},[166],{"type":49,"value":167},"A spec is executable code defining what your system should do:",{"type":44,"tag":169,"props":170,"children":175},"pre",{"className":171,"code":172,"language":173,"meta":174,"style":174},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","var spec = new Spec\u003CBankState>();\n\nspec.Operation\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\", (accountId, state) =>\n{\n    if (state.Accounts.ContainsKey(accountId))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsConflict).SameState();\n\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == 0)\n           .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0);\n});\n","csharp","",[176],{"type":44,"tag":177,"props":178,"children":179},"code",{"__ignoreMap":174},[180,191,201,210,219,227,236,244,253,262],{"type":44,"tag":181,"props":182,"children":185},"span",{"class":183,"line":184},"line",1,[186],{"type":44,"tag":181,"props":187,"children":188},{},[189],{"type":49,"value":190},"var spec = new Spec\u003CBankState>();\n",{"type":44,"tag":181,"props":192,"children":194},{"class":183,"line":193},2,[195],{"type":44,"tag":181,"props":196,"children":198},{"emptyLinePlaceholder":197},true,[199],{"type":49,"value":200},"\n",{"type":44,"tag":181,"props":202,"children":204},{"class":183,"line":203},3,[205],{"type":44,"tag":181,"props":206,"children":207},{},[208],{"type":49,"value":209},"spec.Operation\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\", (accountId, state) =>\n",{"type":44,"tag":181,"props":211,"children":213},{"class":183,"line":212},4,[214],{"type":44,"tag":181,"props":215,"children":216},{},[217],{"type":49,"value":218},"{\n",{"type":44,"tag":181,"props":220,"children":221},{"class":183,"line":26},[222],{"type":44,"tag":181,"props":223,"children":224},{},[225],{"type":49,"value":226},"    if (state.Accounts.ContainsKey(accountId))\n",{"type":44,"tag":181,"props":228,"children":230},{"class":183,"line":229},6,[231],{"type":44,"tag":181,"props":232,"children":233},{},[234],{"type":49,"value":235},"        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsConflict).SameState();\n",{"type":44,"tag":181,"props":237,"children":239},{"class":183,"line":238},7,[240],{"type":44,"tag":181,"props":241,"children":242},{"emptyLinePlaceholder":197},[243],{"type":49,"value":200},{"type":44,"tag":181,"props":245,"children":247},{"class":183,"line":246},8,[248],{"type":44,"tag":181,"props":249,"children":250},{},[251],{"type":49,"value":252},"    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == 0)\n",{"type":44,"tag":181,"props":254,"children":256},{"class":183,"line":255},9,[257],{"type":44,"tag":181,"props":258,"children":259},{},[260],{"type":49,"value":261},"           .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0);\n",{"type":44,"tag":181,"props":263,"children":265},{"class":183,"line":264},10,[266],{"type":44,"tag":181,"props":267,"children":268},{},[269],{"type":49,"value":270},"});\n",{"type":44,"tag":157,"props":272,"children":274},{"id":273},"state",[275],{"type":49,"value":276},"State",{"type":44,"tag":52,"props":278,"children":279},{},[280],{"type":49,"value":281},"State is what the system \"remembers\" between operations. Keep it minimal — only what's needed to define correct behavior:",{"type":44,"tag":169,"props":283,"children":285},{"className":171,"code":284,"language":173,"meta":174,"style":174},"[State]\npublic partial class BankState\n{\n    public Dictionary\u003Cstring, decimal> Accounts { get; set; } = new();\n}\n",[286],{"type":44,"tag":177,"props":287,"children":288},{"__ignoreMap":174},[289,297,305,312,320],{"type":44,"tag":181,"props":290,"children":291},{"class":183,"line":184},[292],{"type":44,"tag":181,"props":293,"children":294},{},[295],{"type":49,"value":296},"[State]\n",{"type":44,"tag":181,"props":298,"children":299},{"class":183,"line":193},[300],{"type":44,"tag":181,"props":301,"children":302},{},[303],{"type":49,"value":304},"public partial class BankState\n",{"type":44,"tag":181,"props":306,"children":307},{"class":183,"line":203},[308],{"type":44,"tag":181,"props":309,"children":310},{},[311],{"type":49,"value":218},{"type":44,"tag":181,"props":313,"children":314},{"class":183,"line":212},[315],{"type":44,"tag":181,"props":316,"children":317},{},[318],{"type":49,"value":319},"    public Dictionary\u003Cstring, decimal> Accounts { get; set; } = new();\n",{"type":44,"tag":181,"props":321,"children":322},{"class":183,"line":26},[323],{"type":44,"tag":181,"props":324,"children":325},{},[326],{"type":49,"value":327},"}\n",{"type":44,"tag":157,"props":329,"children":331},{"id":330},"operations",[332],{"type":49,"value":333},"Operations",{"type":44,"tag":52,"props":335,"children":336},{},[337],{"type":49,"value":338},"An operation represents an atomic action — API call, method invocation, command. Each operation has:",{"type":44,"tag":86,"props":340,"children":341},{},[342,359],{"type":44,"tag":90,"props":343,"children":344},{},[345,350,352,357],{"type":44,"tag":58,"props":346,"children":347},{},[348],{"type":49,"value":349},"Apply",{"type":49,"value":351},": What ",{"type":44,"tag":66,"props":353,"children":354},{},[355],{"type":49,"value":356},"should",{"type":49,"value":358}," happen (the spec logic)",{"type":44,"tag":90,"props":360,"children":361},{},[362,367,368,373],{"type":44,"tag":58,"props":363,"children":364},{},[365],{"type":49,"value":366},"Execute",{"type":49,"value":351},{"type":44,"tag":66,"props":369,"children":370},{},[371],{"type":49,"value":372},"actually",{"type":49,"value":374}," happens (calls the real system)",{"type":44,"tag":157,"props":376,"children":377},{"id":32},[378],{"type":49,"value":379},"Test Generation",{"type":44,"tag":52,"props":381,"children":382},{},[383],{"type":49,"value":384},"Accordant explores operation sequences by simulating the spec, then runs generated tests against your real system:",{"type":44,"tag":169,"props":386,"children":388},{"className":171,"code":387,"language":173,"meta":174,"style":174},"var testCases = spec.GenerateTests(initialState, inputs, options);\nvar results = await spec.RunTests(context, initialState, testCases, executionOptions);\n",[389],{"type":44,"tag":177,"props":390,"children":391},{"__ignoreMap":174},[392,400],{"type":44,"tag":181,"props":393,"children":394},{"class":183,"line":184},[395],{"type":44,"tag":181,"props":396,"children":397},{},[398],{"type":49,"value":399},"var testCases = spec.GenerateTests(initialState, inputs, options);\n",{"type":44,"tag":181,"props":401,"children":402},{"class":183,"line":193},[403],{"type":44,"tag":181,"props":404,"children":405},{},[406],{"type":49,"value":407},"var results = await spec.RunTests(context, initialState, testCases, executionOptions);\n",{"type":44,"tag":74,"props":409,"children":411},{"id":410},"the-typical-workflow",[412],{"type":49,"value":413},"The Typical Workflow",{"type":44,"tag":415,"props":416,"children":417},"ol",{},[418,428,438,448],{"type":44,"tag":90,"props":419,"children":420},{},[421,426],{"type":44,"tag":58,"props":422,"children":423},{},[424],{"type":49,"value":425},"Define State",{"type":49,"value":427}," — What does the system track?",{"type":44,"tag":90,"props":429,"children":430},{},[431,436],{"type":44,"tag":58,"props":432,"children":433},{},[434],{"type":49,"value":435},"Define Operations",{"type":49,"value":437}," — What can happen to that state?",{"type":44,"tag":90,"props":439,"children":440},{},[441,446],{"type":44,"tag":58,"props":442,"children":443},{},[444],{"type":49,"value":445},"Bind to Real System",{"type":49,"value":447}," — Connect spec operations to actual API calls",{"type":44,"tag":90,"props":449,"children":450},{},[451,456],{"type":44,"tag":58,"props":452,"children":453},{},[454],{"type":49,"value":455},"Generate & Run Tests",{"type":49,"value":457}," — Let Accordant explore and validate",{"type":44,"tag":74,"props":459,"children":461},{"id":460},"example-bankaccount-spec",[462],{"type":49,"value":463},"Example: BankAccount Spec",{"type":44,"tag":169,"props":465,"children":467},{"className":171,"code":466,"language":173,"meta":174,"style":174},"[State]\npublic partial class BankState\n{\n    public Dictionary\u003Cstring, decimal> Accounts { get; set; } = new();\n}\n\nvar spec = new Spec\u003CBankState>();\n\n\u002F\u002F Create Account\nspec.Operation\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\", (accountId, state) =>\n{\n    if (state.Accounts.ContainsKey(accountId))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsConflict).SameState();\n\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == 0)\n           .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0);\n});\n\n\u002F\u002F Withdraw\nspec.Operation\u003C(string AccountId, decimal Amount), ApiResult\u003Cdecimal>>(\"Withdraw\", (req, state) =>\n{\n    if (!state.Accounts.TryGetValue(req.AccountId, out var balance))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound).SameState();\n\n    if (balance \u003C req.Amount)\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest).SameState();\n\n    var newBalance = balance - req.Amount;\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n           .ThenState\u003CBankState>(s => s.Accounts[req.AccountId] = newBalance);\n});\n",[468],{"type":44,"tag":177,"props":469,"children":470},{"__ignoreMap":174},[471,478,485,492,499,506,513,520,527,535,542,550,558,566,574,582,590,598,606,615,624,632,641,650,658,667,676,684,693,702,711],{"type":44,"tag":181,"props":472,"children":473},{"class":183,"line":184},[474],{"type":44,"tag":181,"props":475,"children":476},{},[477],{"type":49,"value":296},{"type":44,"tag":181,"props":479,"children":480},{"class":183,"line":193},[481],{"type":44,"tag":181,"props":482,"children":483},{},[484],{"type":49,"value":304},{"type":44,"tag":181,"props":486,"children":487},{"class":183,"line":203},[488],{"type":44,"tag":181,"props":489,"children":490},{},[491],{"type":49,"value":218},{"type":44,"tag":181,"props":493,"children":494},{"class":183,"line":212},[495],{"type":44,"tag":181,"props":496,"children":497},{},[498],{"type":49,"value":319},{"type":44,"tag":181,"props":500,"children":501},{"class":183,"line":26},[502],{"type":44,"tag":181,"props":503,"children":504},{},[505],{"type":49,"value":327},{"type":44,"tag":181,"props":507,"children":508},{"class":183,"line":229},[509],{"type":44,"tag":181,"props":510,"children":511},{"emptyLinePlaceholder":197},[512],{"type":49,"value":200},{"type":44,"tag":181,"props":514,"children":515},{"class":183,"line":238},[516],{"type":44,"tag":181,"props":517,"children":518},{},[519],{"type":49,"value":190},{"type":44,"tag":181,"props":521,"children":522},{"class":183,"line":246},[523],{"type":44,"tag":181,"props":524,"children":525},{"emptyLinePlaceholder":197},[526],{"type":49,"value":200},{"type":44,"tag":181,"props":528,"children":529},{"class":183,"line":255},[530],{"type":44,"tag":181,"props":531,"children":532},{},[533],{"type":49,"value":534},"\u002F\u002F Create Account\n",{"type":44,"tag":181,"props":536,"children":537},{"class":183,"line":264},[538],{"type":44,"tag":181,"props":539,"children":540},{},[541],{"type":49,"value":209},{"type":44,"tag":181,"props":543,"children":545},{"class":183,"line":544},11,[546],{"type":44,"tag":181,"props":547,"children":548},{},[549],{"type":49,"value":218},{"type":44,"tag":181,"props":551,"children":553},{"class":183,"line":552},12,[554],{"type":44,"tag":181,"props":555,"children":556},{},[557],{"type":49,"value":226},{"type":44,"tag":181,"props":559,"children":561},{"class":183,"line":560},13,[562],{"type":44,"tag":181,"props":563,"children":564},{},[565],{"type":49,"value":235},{"type":44,"tag":181,"props":567,"children":569},{"class":183,"line":568},14,[570],{"type":44,"tag":181,"props":571,"children":572},{"emptyLinePlaceholder":197},[573],{"type":49,"value":200},{"type":44,"tag":181,"props":575,"children":577},{"class":183,"line":576},15,[578],{"type":44,"tag":181,"props":579,"children":580},{},[581],{"type":49,"value":252},{"type":44,"tag":181,"props":583,"children":585},{"class":183,"line":584},16,[586],{"type":44,"tag":181,"props":587,"children":588},{},[589],{"type":49,"value":261},{"type":44,"tag":181,"props":591,"children":593},{"class":183,"line":592},17,[594],{"type":44,"tag":181,"props":595,"children":596},{},[597],{"type":49,"value":270},{"type":44,"tag":181,"props":599,"children":601},{"class":183,"line":600},18,[602],{"type":44,"tag":181,"props":603,"children":604},{"emptyLinePlaceholder":197},[605],{"type":49,"value":200},{"type":44,"tag":181,"props":607,"children":609},{"class":183,"line":608},19,[610],{"type":44,"tag":181,"props":611,"children":612},{},[613],{"type":49,"value":614},"\u002F\u002F Withdraw\n",{"type":44,"tag":181,"props":616,"children":618},{"class":183,"line":617},20,[619],{"type":44,"tag":181,"props":620,"children":621},{},[622],{"type":49,"value":623},"spec.Operation\u003C(string AccountId, decimal Amount), ApiResult\u003Cdecimal>>(\"Withdraw\", (req, state) =>\n",{"type":44,"tag":181,"props":625,"children":627},{"class":183,"line":626},21,[628],{"type":44,"tag":181,"props":629,"children":630},{},[631],{"type":49,"value":218},{"type":44,"tag":181,"props":633,"children":635},{"class":183,"line":634},22,[636],{"type":44,"tag":181,"props":637,"children":638},{},[639],{"type":49,"value":640},"    if (!state.Accounts.TryGetValue(req.AccountId, out var balance))\n",{"type":44,"tag":181,"props":642,"children":644},{"class":183,"line":643},23,[645],{"type":44,"tag":181,"props":646,"children":647},{},[648],{"type":49,"value":649},"        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound).SameState();\n",{"type":44,"tag":181,"props":651,"children":653},{"class":183,"line":652},24,[654],{"type":44,"tag":181,"props":655,"children":656},{"emptyLinePlaceholder":197},[657],{"type":49,"value":200},{"type":44,"tag":181,"props":659,"children":661},{"class":183,"line":660},25,[662],{"type":44,"tag":181,"props":663,"children":664},{},[665],{"type":49,"value":666},"    if (balance \u003C req.Amount)\n",{"type":44,"tag":181,"props":668,"children":670},{"class":183,"line":669},26,[671],{"type":44,"tag":181,"props":672,"children":673},{},[674],{"type":49,"value":675},"        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest).SameState();\n",{"type":44,"tag":181,"props":677,"children":679},{"class":183,"line":678},27,[680],{"type":44,"tag":181,"props":681,"children":682},{"emptyLinePlaceholder":197},[683],{"type":49,"value":200},{"type":44,"tag":181,"props":685,"children":687},{"class":183,"line":686},28,[688],{"type":44,"tag":181,"props":689,"children":690},{},[691],{"type":49,"value":692},"    var newBalance = balance - req.Amount;\n",{"type":44,"tag":181,"props":694,"children":696},{"class":183,"line":695},29,[697],{"type":44,"tag":181,"props":698,"children":699},{},[700],{"type":49,"value":701},"    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n",{"type":44,"tag":181,"props":703,"children":705},{"class":183,"line":704},30,[706],{"type":44,"tag":181,"props":707,"children":708},{},[709],{"type":49,"value":710},"           .ThenState\u003CBankState>(s => s.Accounts[req.AccountId] = newBalance);\n",{"type":44,"tag":181,"props":712,"children":714},{"class":183,"line":713},31,[715],{"type":44,"tag":181,"props":716,"children":717},{},[718],{"type":49,"value":270},{"type":44,"tag":74,"props":720,"children":722},{"id":721},"key-benefits",[723],{"type":49,"value":724},"Key Benefits",{"type":44,"tag":726,"props":727,"children":728},"table",{},[729,748],{"type":44,"tag":730,"props":731,"children":732},"thead",{},[733],{"type":44,"tag":734,"props":735,"children":736},"tr",{},[737,743],{"type":44,"tag":738,"props":739,"children":740},"th",{},[741],{"type":49,"value":742},"Benefit",{"type":44,"tag":738,"props":744,"children":745},{},[746],{"type":49,"value":747},"Description",{"type":44,"tag":749,"props":750,"children":751},"tbody",{},[752,769,785,801],{"type":44,"tag":734,"props":753,"children":754},{},[755,764],{"type":44,"tag":756,"props":757,"children":758},"td",{},[759],{"type":44,"tag":58,"props":760,"children":761},{},[762],{"type":49,"value":763},"Single source of truth",{"type":44,"tag":756,"props":765,"children":766},{},[767],{"type":49,"value":768},"Business rules live in one place, not scattered across tests",{"type":44,"tag":734,"props":770,"children":771},{},[772,780],{"type":44,"tag":756,"props":773,"children":774},{},[775],{"type":44,"tag":58,"props":776,"children":777},{},[778],{"type":49,"value":779},"Automatic test generation",{"type":44,"tag":756,"props":781,"children":782},{},[783],{"type":49,"value":784},"Cover operation sequences you'd never think to write manually",{"type":44,"tag":734,"props":786,"children":787},{},[788,796],{"type":44,"tag":756,"props":789,"children":790},{},[791],{"type":44,"tag":58,"props":792,"children":793},{},[794],{"type":49,"value":795},"Concurrency testing",{"type":44,"tag":756,"props":797,"children":798},{},[799],{"type":49,"value":800},"Find race conditions with linearizability checking",{"type":44,"tag":734,"props":802,"children":803},{},[804,812],{"type":44,"tag":756,"props":805,"children":806},{},[807],{"type":44,"tag":58,"props":808,"children":809},{},[810],{"type":49,"value":811},"Confidence through change",{"type":44,"tag":756,"props":813,"children":814},{},[815],{"type":49,"value":816},"Refactor freely; the spec validates correctness",{"type":44,"tag":74,"props":818,"children":820},{"id":819},"next-steps",[821],{"type":49,"value":822},"Next Steps",{"type":44,"tag":86,"props":824,"children":825},{},[826,836,845],{"type":44,"tag":90,"props":827,"children":828},{},[829,834],{"type":44,"tag":58,"props":830,"children":831},{},[832],{"type":49,"value":833},"State Design",{"type":49,"value":835},": Learn to model state effectively",{"type":44,"tag":90,"props":837,"children":838},{},[839,843],{"type":44,"tag":58,"props":840,"children":841},{},[842],{"type":49,"value":333},{"type":49,"value":844},": Master the Apply\u002FExecute pattern",{"type":44,"tag":90,"props":846,"children":847},{},[848,852],{"type":44,"tag":58,"props":849,"children":850},{},[851],{"type":49,"value":379},{"type":49,"value":853},": Configure and run auto-generated tests",{"type":44,"tag":855,"props":856,"children":857},"style",{},[858],{"type":49,"value":859},"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":861,"total":1056},[862,884,905,926,941,958,969,982,997,1012,1031,1044],{"slug":863,"name":863,"fn":864,"description":865,"org":866,"tags":867,"stars":881,"repoUrl":882,"updatedAt":883},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[868,871,874,875,878],{"name":869,"slug":870,"type":15},"Engineering","engineering",{"name":872,"slug":873,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":876,"slug":877,"type":15},"Project Management","project-management",{"name":879,"slug":880,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":885,"name":885,"fn":886,"description":887,"org":888,"tags":889,"stars":902,"repoUrl":903,"updatedAt":904},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[890,893,896,899],{"name":891,"slug":892,"type":15},".NET","net",{"name":894,"slug":895,"type":15},"Agents","agents",{"name":897,"slug":898,"type":15},"Azure","azure",{"name":900,"slug":901,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":906,"name":906,"fn":907,"description":908,"org":909,"tags":910,"stars":902,"repoUrl":903,"updatedAt":925},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[911,914,915,918,921,922],{"name":912,"slug":913,"type":15},"Analytics","analytics",{"name":897,"slug":898,"type":15},{"name":916,"slug":917,"type":15},"Data Analysis","data-analysis",{"name":919,"slug":920,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":923,"slug":924,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":927,"name":927,"fn":928,"description":929,"org":930,"tags":931,"stars":902,"repoUrl":903,"updatedAt":940},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[932,935,936,937],{"name":933,"slug":934,"type":15},"AI Infrastructure","ai-infrastructure",{"name":897,"slug":898,"type":15},{"name":919,"slug":920,"type":15},{"name":938,"slug":939,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":942,"name":942,"fn":943,"description":944,"org":945,"tags":946,"stars":902,"repoUrl":903,"updatedAt":957},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[947,948,951,952,953,956],{"name":897,"slug":898,"type":15},{"name":949,"slug":950,"type":15},"Compliance","compliance",{"name":900,"slug":901,"type":15},{"name":9,"slug":8,"type":15},{"name":954,"slug":955,"type":15},"Python","python",{"name":938,"slug":939,"type":15},"2026-07-18T05:14:23.017504",{"slug":959,"name":959,"fn":960,"description":961,"org":962,"tags":963,"stars":902,"repoUrl":903,"updatedAt":968},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[964,965,966,967],{"name":912,"slug":913,"type":15},{"name":897,"slug":898,"type":15},{"name":900,"slug":901,"type":15},{"name":954,"slug":955,"type":15},"2026-07-31T05:54:29.068751",{"slug":970,"name":970,"fn":971,"description":972,"org":973,"tags":974,"stars":902,"repoUrl":903,"updatedAt":981},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[975,978,979,980],{"name":976,"slug":977,"type":15},"API Development","api-development",{"name":897,"slug":898,"type":15},{"name":9,"slug":8,"type":15},{"name":954,"slug":955,"type":15},"2026-07-18T05:14:16.988376",{"slug":983,"name":983,"fn":984,"description":985,"org":986,"tags":987,"stars":902,"repoUrl":903,"updatedAt":996},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[988,989,992,995],{"name":897,"slug":898,"type":15},{"name":990,"slug":991,"type":15},"Computer Vision","computer-vision",{"name":993,"slug":994,"type":15},"Images","images",{"name":954,"slug":955,"type":15},"2026-07-18T05:14:18.007737",{"slug":998,"name":998,"fn":999,"description":1000,"org":1001,"tags":1002,"stars":902,"repoUrl":903,"updatedAt":1011},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1003,1004,1007,1010],{"name":897,"slug":898,"type":15},{"name":1005,"slug":1006,"type":15},"Configuration","configuration",{"name":1008,"slug":1009,"type":15},"Feature Flags","feature-flags",{"name":919,"slug":920,"type":15},"2026-07-03T16:32:01.278468",{"slug":1013,"name":1013,"fn":1014,"description":1015,"org":1016,"tags":1017,"stars":902,"repoUrl":903,"updatedAt":1030},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1018,1021,1024,1027],{"name":1019,"slug":1020,"type":15},"Cosmos DB","cosmos-db",{"name":1022,"slug":1023,"type":15},"Database","database",{"name":1025,"slug":1026,"type":15},"NoSQL","nosql",{"name":1028,"slug":1029,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":1032,"name":1032,"fn":1014,"description":1033,"org":1034,"tags":1035,"stars":902,"repoUrl":903,"updatedAt":1043},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1036,1037,1038,1039,1040],{"name":1019,"slug":1020,"type":15},{"name":1022,"slug":1023,"type":15},{"name":9,"slug":8,"type":15},{"name":1025,"slug":1026,"type":15},{"name":1041,"slug":1042,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":1045,"name":1045,"fn":1046,"description":1047,"org":1048,"tags":1049,"stars":902,"repoUrl":903,"updatedAt":1055},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1050,1051,1052,1053,1054],{"name":897,"slug":898,"type":15},{"name":1019,"slug":1020,"type":15},{"name":1022,"slug":1023,"type":15},{"name":919,"slug":920,"type":15},{"name":1025,"slug":1026,"type":15},"2026-05-13T06:14:17.582229",267,{"items":1058,"total":193},[1059,1071],{"slug":1060,"name":1060,"fn":1061,"description":1062,"org":1063,"tags":1064,"stars":22,"repoUrl":23,"updatedAt":1070},"accordant-operations","define operations with Apply and Execute methods","How to define operations with Apply and Execute methods - use this skill when creating spec operations or understanding the Apply\u002FExecute pattern",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1065,1068,1069],{"name":1066,"slug":1067,"type":15},"Architecture","architecture",{"name":869,"slug":870,"type":15},{"name":9,"slug":8,"type":15},"2026-07-03T16:32:21.008623",{"slug":4,"name":4,"fn":5,"description":6,"org":1072,"tags":1073,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1074,1075,1076],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15}]