[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-accordant-operations":3,"mdc--xxc5it-key":36,"related-repo-microsoft-accordant-operations":1583,"related-org-microsoft-accordant-operations":1607},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":31,"sourceUrl":34,"mdContent":35},"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},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,17],{"name":13,"slug":14,"type":15},"Architecture","architecture","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Engineering","engineering",53,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant","2026-07-03T16:32:21.008623",null,5,[26,27,28,29,30],"concurrency-testing","conformance-testing","linearizability","model-based-testing","test-generation",{"repoUrl":21,"stars":20,"forks":24,"topics":32,"description":33},[26,27,28,29,30],"A model-based testing framework for .NET that validates implementations against behavioral specifications.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Ftree\u002FHEAD\u002Fagent\u002Fskills\u002Foperations","---\nname: accordant-operations\ndescription: How to define operations with Apply and Execute methods - use this skill when creating spec operations or understanding the Apply\u002FExecute pattern\n---\n\n# Operations in Accordant\n\nAn **operation** represents an atomic action your system can perform. Each operation has two parts:\n- **Apply**: Describes what *should* happen (pure spec logic)\n- **Execute**: Makes it *actually* happen (calls the real system)\n\n## Defining Operations\n\n### Inline Syntax\n\nFor simple specs, define operations inline:\n\n```csharp\nvar spec = new Spec\u003CBankState>();\n\nspec.Operation\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\", (accountId, state) =>\n{\n    \u002F\u002F Apply logic here\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### Binding Execution\n\nConnect spec operations to real system calls:\n\n```csharp\nspec.ExecuteWith\u003CBankApiClient>()\n    .Bind\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\",\n        (client, accountId) => client.CreateAccount(accountId).Result)\n    .Bind\u003C(string, decimal), ApiResult\u003Cdecimal>>(\"Withdraw\",\n        (client, req) => client.Withdraw(req.Item1, req.Item2).Result);\n```\n\n### Class-Based Operations\n\nFor complex operations, use classes:\n\n```csharp\npublic class WithdrawOperation : Operation\u003CWithdrawRequest, ApiResult\u003Cdecimal>, BankState>\n{\n    public override ExpectedOutcomes Apply(WithdrawRequest request, BankState state)\n    {\n        if (!state.Accounts.TryGetValue(request.AccountId, out var balance))\n            return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound).SameState();\n\n        if (balance \u003C request.Amount)\n            return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest).SameState();\n\n        var newBalance = balance - request.Amount;\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n               .ThenState\u003CBankState>(s => s.Accounts[request.AccountId] = newBalance);\n    }\n\n    public override async Task\u003CApiResult\u003Cdecimal>> ExecuteAsync(\n        WithdrawRequest request, \n        TestingContext context)\n    {\n        var client = context.Get\u003CBankApiClient>();\n        return await client.WithdrawAsync(request.AccountId, request.Amount);\n    }\n}\n```\n\n## The Apply Method\n\nApply defines expected behavior. Given a request and state, return `ExpectedOutcomes`:\n\n```csharp\nspec.Operation\u003C(string AccountId, decimal Amount), ApiResult\u003Cdecimal>>(\"Deposit\", (request, state) =>\n{\n    \u002F\u002F Check preconditions first (guard clauses)\n    if (!state.Accounts.TryGetValue(request.AccountId, out var balance))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound).SameState();\n\n    \u002F\u002F Happy path last\n    var newBalance = balance + request.Amount;\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n           .ThenState\u003CBankState>(s => s.Accounts[request.AccountId] = newBalance);\n});\n```\n\n**Key points:**\n- Apply is **pure** — no side effects, no API calls\n- Check error conditions first with early returns\n- Return expected response + state transition\n\n## Expect.That — Validating Responses\n\n### Basic Predicate\n\n```csharp\nExpect.That\u003Cint>(r => r == 42)\n```\n\n### With Explanation (Recommended)\n\n```csharp\nExpect.That\u003CApiResult\u003Cdecimal>>(\n    r => r.IsSuccess && r.Data == expectedBalance,\n    $\"Should return 200 OK with balance {expectedBalance}\")\n```\n\nExplanations appear in test failure output — crucial for debugging.\n\n### With ValidationResult\n\nFor complex validations with detailed error messages:\n\n```csharp\nExpect.That\u003CUser>(response =>\n{\n    if (response.Name != expectedName)\n        return ValidationResult.Invalid($\"Name was '{response.Name}', expected '{expectedName}'\");\n    if (response.Email == null)\n        return ValidationResult.Invalid(\"Email was null\");\n    return ValidationResult.Valid();\n})\n```\n\n## State Transitions\n\n### No Change: `.SameState()`\n\n```csharp\n\u002F\u002F Error cases\nreturn Expect.That\u003CApiResult\u003CUser>>(r => r.IsNotFound).SameState();\n\n\u002F\u002F Read-only operations\nreturn Expect.That\u003CApiResult\u003CUser>>(r => r.IsSuccess).SameState();\n```\n\n### State Change: `.ThenState()`\n\n```csharp\nreturn Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n       .ThenState\u003CBankState>(nextState => nextState.Accounts[accountId] = newBalance);\n```\n\n### Response-Dependent State\n\nWhen state depends on server-generated values:\n\n```csharp\nreturn Expect.That\u003CApiResult\u003COrder>>(r => r.IsSuccess && !string.IsNullOrEmpty(r.Data.OrderId))\n       .ThenState\u003CAppState>(\n           (ApiResult\u003COrder> response, AppState nextState) =>\n               nextState.Orders[response.Data.OrderId] = new OrderState { \u002F* ... *\u002F },\n           mock: () => new ApiResult\u003COrder> \n           { \n               Data = new Order { OrderId = Guid.NewGuid().ToString() },\n               StatusCode = 201 \n           });\n```\n\n## Multiple Valid Outcomes: Expect.OneOf\n\nWhen more than one outcome is valid (timeouts, non-determinism):\n\n```csharp\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.OneOf(\n        \u002F\u002F Success\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == 0)\n              .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0),\n              \n        \u002F\u002F Timeout - request lost\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsTimeout)\n              .SameState(),\n              \n        \u002F\u002F Timeout - response lost (account was created)\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsTimeout)\n              .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0)\n    );\n});\n```\n\n## Exception Expectations\n\nWhen operations should throw:\n\n```csharp\nspec.Operation\u003Cstring, Unit>(\"DeleteUser\", (userId, state) =>\n{\n    if (!state.Users.ContainsKey(userId))\n        return Expect.Throws\u003CNotFoundException>(\"User not found\").SameState();\n\n    if (state.Users[userId].HasPendingOrders)\n        return Expect.Throws\u003CBusinessRuleException>(\"Cannot delete user with pending orders\").SameState();\n\n    return Expect.That\u003CUnit>(r => true)\n           .ThenState\u003CAppState>(s => s.Users.Remove(userId));\n});\n```\n\nUse `Unit` as the response type for void operations.\n\n## Writing Strong Predicates\n\n**Weak** (catches fewer bugs):\n```csharp\nExpect.That\u003CApiResult\u003CUser>>(r => r.IsSuccess)  \u002F\u002F Only checks status\n```\n\n**Strong** (catches more bugs):\n```csharp\nExpect.That\u003CApiResult\u003CUser>>(\n    r => r.IsSuccess && \n         r.Data.Id == expectedId && \n         r.Data.Name == expectedName &&\n         r.Data.Email == expectedEmail)\n```\n\nThe stronger your predicates, the more bugs you'll catch.\n\n## Common Patterns\n\n### The Guard-Clause Pattern\n\n```csharp\nspec.Operation\u003CTransferRequest, ApiResult\u003Cdecimal>>(\"Transfer\", (req, state) =>\n{\n    \u002F\u002F Guards first\n    if (!state.Accounts.ContainsKey(req.FromAccount))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound, \"Source not found\").SameState();\n    \n    if (!state.Accounts.ContainsKey(req.ToAccount))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound, \"Target not found\").SameState();\n    \n    var balance = state.Accounts[req.FromAccount];\n    if (balance \u003C req.Amount)\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest, \"Insufficient funds\").SameState();\n\n    \u002F\u002F Happy path last\n    var newFromBalance = balance - req.Amount;\n    var newToBalance = state.Accounts[req.ToAccount] + req.Amount;\n    \n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newFromBalance)\n           .ThenState\u003CBankState>(s => {\n               s.Accounts[req.FromAccount] = newFromBalance;\n               s.Accounts[req.ToAccount] = newToBalance;\n           });\n});\n```\n\n## Next Steps\n\n- **Test Generation**: See how operations combine into test sequences\n- **Async Operations**: Model background work with step functions\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,50,64,104,111,118,123,235,241,246,293,299,304,501,507,520,612,620,645,651,657,671,677,708,713,719,724,794,800,812,858,870,893,899,904,983,989,994,1145,1151,1156,1247,1260,1266,1276,1290,1300,1347,1352,1358,1364,1548,1554,1577],{"type":42,"tag":43,"props":44,"children":46},"element","h1",{"id":45},"operations-in-accordant",[47],{"type":48,"value":49},"text","Operations in Accordant",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54,56,62],{"type":48,"value":55},"An ",{"type":42,"tag":57,"props":58,"children":59},"strong",{},[60],{"type":48,"value":61},"operation",{"type":48,"value":63}," represents an atomic action your system can perform. Each operation has two parts:",{"type":42,"tag":65,"props":66,"children":67},"ul",{},[68,87],{"type":42,"tag":69,"props":70,"children":71},"li",{},[72,77,79,85],{"type":42,"tag":57,"props":73,"children":74},{},[75],{"type":48,"value":76},"Apply",{"type":48,"value":78},": Describes what ",{"type":42,"tag":80,"props":81,"children":82},"em",{},[83],{"type":48,"value":84},"should",{"type":48,"value":86}," happen (pure spec logic)",{"type":42,"tag":69,"props":88,"children":89},{},[90,95,97,102],{"type":42,"tag":57,"props":91,"children":92},{},[93],{"type":48,"value":94},"Execute",{"type":48,"value":96},": Makes it ",{"type":42,"tag":80,"props":98,"children":99},{},[100],{"type":48,"value":101},"actually",{"type":48,"value":103}," happen (calls the real system)",{"type":42,"tag":105,"props":106,"children":108},"h2",{"id":107},"defining-operations",[109],{"type":48,"value":110},"Defining Operations",{"type":42,"tag":112,"props":113,"children":115},"h3",{"id":114},"inline-syntax",[116],{"type":48,"value":117},"Inline Syntax",{"type":42,"tag":51,"props":119,"children":120},{},[121],{"type":48,"value":122},"For simple specs, define operations inline:",{"type":42,"tag":124,"props":125,"children":130},"pre",{"className":126,"code":127,"language":128,"meta":129,"style":129},"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    \u002F\u002F Apply logic here\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","",[131],{"type":42,"tag":132,"props":133,"children":134},"code",{"__ignoreMap":129},[135,146,156,165,174,182,191,200,208,217,226],{"type":42,"tag":136,"props":137,"children":140},"span",{"class":138,"line":139},"line",1,[141],{"type":42,"tag":136,"props":142,"children":143},{},[144],{"type":48,"value":145},"var spec = new Spec\u003CBankState>();\n",{"type":42,"tag":136,"props":147,"children":149},{"class":138,"line":148},2,[150],{"type":42,"tag":136,"props":151,"children":153},{"emptyLinePlaceholder":152},true,[154],{"type":48,"value":155},"\n",{"type":42,"tag":136,"props":157,"children":159},{"class":138,"line":158},3,[160],{"type":42,"tag":136,"props":161,"children":162},{},[163],{"type":48,"value":164},"spec.Operation\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\", (accountId, state) =>\n",{"type":42,"tag":136,"props":166,"children":168},{"class":138,"line":167},4,[169],{"type":42,"tag":136,"props":170,"children":171},{},[172],{"type":48,"value":173},"{\n",{"type":42,"tag":136,"props":175,"children":176},{"class":138,"line":24},[177],{"type":42,"tag":136,"props":178,"children":179},{},[180],{"type":48,"value":181},"    \u002F\u002F Apply logic here\n",{"type":42,"tag":136,"props":183,"children":185},{"class":138,"line":184},6,[186],{"type":42,"tag":136,"props":187,"children":188},{},[189],{"type":48,"value":190},"    if (state.Accounts.ContainsKey(accountId))\n",{"type":42,"tag":136,"props":192,"children":194},{"class":138,"line":193},7,[195],{"type":42,"tag":136,"props":196,"children":197},{},[198],{"type":48,"value":199},"        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsConflict).SameState();\n",{"type":42,"tag":136,"props":201,"children":203},{"class":138,"line":202},8,[204],{"type":42,"tag":136,"props":205,"children":206},{"emptyLinePlaceholder":152},[207],{"type":48,"value":155},{"type":42,"tag":136,"props":209,"children":211},{"class":138,"line":210},9,[212],{"type":42,"tag":136,"props":213,"children":214},{},[215],{"type":48,"value":216},"    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == 0)\n",{"type":42,"tag":136,"props":218,"children":220},{"class":138,"line":219},10,[221],{"type":42,"tag":136,"props":222,"children":223},{},[224],{"type":48,"value":225},"           .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0);\n",{"type":42,"tag":136,"props":227,"children":229},{"class":138,"line":228},11,[230],{"type":42,"tag":136,"props":231,"children":232},{},[233],{"type":48,"value":234},"});\n",{"type":42,"tag":112,"props":236,"children":238},{"id":237},"binding-execution",[239],{"type":48,"value":240},"Binding Execution",{"type":42,"tag":51,"props":242,"children":243},{},[244],{"type":48,"value":245},"Connect spec operations to real system calls:",{"type":42,"tag":124,"props":247,"children":249},{"className":126,"code":248,"language":128,"meta":129,"style":129},"spec.ExecuteWith\u003CBankApiClient>()\n    .Bind\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\",\n        (client, accountId) => client.CreateAccount(accountId).Result)\n    .Bind\u003C(string, decimal), ApiResult\u003Cdecimal>>(\"Withdraw\",\n        (client, req) => client.Withdraw(req.Item1, req.Item2).Result);\n",[250],{"type":42,"tag":132,"props":251,"children":252},{"__ignoreMap":129},[253,261,269,277,285],{"type":42,"tag":136,"props":254,"children":255},{"class":138,"line":139},[256],{"type":42,"tag":136,"props":257,"children":258},{},[259],{"type":48,"value":260},"spec.ExecuteWith\u003CBankApiClient>()\n",{"type":42,"tag":136,"props":262,"children":263},{"class":138,"line":148},[264],{"type":42,"tag":136,"props":265,"children":266},{},[267],{"type":48,"value":268},"    .Bind\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\",\n",{"type":42,"tag":136,"props":270,"children":271},{"class":138,"line":158},[272],{"type":42,"tag":136,"props":273,"children":274},{},[275],{"type":48,"value":276},"        (client, accountId) => client.CreateAccount(accountId).Result)\n",{"type":42,"tag":136,"props":278,"children":279},{"class":138,"line":167},[280],{"type":42,"tag":136,"props":281,"children":282},{},[283],{"type":48,"value":284},"    .Bind\u003C(string, decimal), ApiResult\u003Cdecimal>>(\"Withdraw\",\n",{"type":42,"tag":136,"props":286,"children":287},{"class":138,"line":24},[288],{"type":42,"tag":136,"props":289,"children":290},{},[291],{"type":48,"value":292},"        (client, req) => client.Withdraw(req.Item1, req.Item2).Result);\n",{"type":42,"tag":112,"props":294,"children":296},{"id":295},"class-based-operations",[297],{"type":48,"value":298},"Class-Based Operations",{"type":42,"tag":51,"props":300,"children":301},{},[302],{"type":48,"value":303},"For complex operations, use classes:",{"type":42,"tag":124,"props":305,"children":307},{"className":126,"code":306,"language":128,"meta":129,"style":129},"public class WithdrawOperation : Operation\u003CWithdrawRequest, ApiResult\u003Cdecimal>, BankState>\n{\n    public override ExpectedOutcomes Apply(WithdrawRequest request, BankState state)\n    {\n        if (!state.Accounts.TryGetValue(request.AccountId, out var balance))\n            return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound).SameState();\n\n        if (balance \u003C request.Amount)\n            return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest).SameState();\n\n        var newBalance = balance - request.Amount;\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n               .ThenState\u003CBankState>(s => s.Accounts[request.AccountId] = newBalance);\n    }\n\n    public override async Task\u003CApiResult\u003Cdecimal>> ExecuteAsync(\n        WithdrawRequest request, \n        TestingContext context)\n    {\n        var client = context.Get\u003CBankApiClient>();\n        return await client.WithdrawAsync(request.AccountId, request.Amount);\n    }\n}\n",[308],{"type":42,"tag":132,"props":309,"children":310},{"__ignoreMap":129},[311,319,326,334,342,350,358,365,373,381,388,396,405,414,423,431,440,449,458,466,475,484,492],{"type":42,"tag":136,"props":312,"children":313},{"class":138,"line":139},[314],{"type":42,"tag":136,"props":315,"children":316},{},[317],{"type":48,"value":318},"public class WithdrawOperation : Operation\u003CWithdrawRequest, ApiResult\u003Cdecimal>, BankState>\n",{"type":42,"tag":136,"props":320,"children":321},{"class":138,"line":148},[322],{"type":42,"tag":136,"props":323,"children":324},{},[325],{"type":48,"value":173},{"type":42,"tag":136,"props":327,"children":328},{"class":138,"line":158},[329],{"type":42,"tag":136,"props":330,"children":331},{},[332],{"type":48,"value":333},"    public override ExpectedOutcomes Apply(WithdrawRequest request, BankState state)\n",{"type":42,"tag":136,"props":335,"children":336},{"class":138,"line":167},[337],{"type":42,"tag":136,"props":338,"children":339},{},[340],{"type":48,"value":341},"    {\n",{"type":42,"tag":136,"props":343,"children":344},{"class":138,"line":24},[345],{"type":42,"tag":136,"props":346,"children":347},{},[348],{"type":48,"value":349},"        if (!state.Accounts.TryGetValue(request.AccountId, out var balance))\n",{"type":42,"tag":136,"props":351,"children":352},{"class":138,"line":184},[353],{"type":42,"tag":136,"props":354,"children":355},{},[356],{"type":48,"value":357},"            return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound).SameState();\n",{"type":42,"tag":136,"props":359,"children":360},{"class":138,"line":193},[361],{"type":42,"tag":136,"props":362,"children":363},{"emptyLinePlaceholder":152},[364],{"type":48,"value":155},{"type":42,"tag":136,"props":366,"children":367},{"class":138,"line":202},[368],{"type":42,"tag":136,"props":369,"children":370},{},[371],{"type":48,"value":372},"        if (balance \u003C request.Amount)\n",{"type":42,"tag":136,"props":374,"children":375},{"class":138,"line":210},[376],{"type":42,"tag":136,"props":377,"children":378},{},[379],{"type":48,"value":380},"            return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest).SameState();\n",{"type":42,"tag":136,"props":382,"children":383},{"class":138,"line":219},[384],{"type":42,"tag":136,"props":385,"children":386},{"emptyLinePlaceholder":152},[387],{"type":48,"value":155},{"type":42,"tag":136,"props":389,"children":390},{"class":138,"line":228},[391],{"type":42,"tag":136,"props":392,"children":393},{},[394],{"type":48,"value":395},"        var newBalance = balance - request.Amount;\n",{"type":42,"tag":136,"props":397,"children":399},{"class":138,"line":398},12,[400],{"type":42,"tag":136,"props":401,"children":402},{},[403],{"type":48,"value":404},"        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n",{"type":42,"tag":136,"props":406,"children":408},{"class":138,"line":407},13,[409],{"type":42,"tag":136,"props":410,"children":411},{},[412],{"type":48,"value":413},"               .ThenState\u003CBankState>(s => s.Accounts[request.AccountId] = newBalance);\n",{"type":42,"tag":136,"props":415,"children":417},{"class":138,"line":416},14,[418],{"type":42,"tag":136,"props":419,"children":420},{},[421],{"type":48,"value":422},"    }\n",{"type":42,"tag":136,"props":424,"children":426},{"class":138,"line":425},15,[427],{"type":42,"tag":136,"props":428,"children":429},{"emptyLinePlaceholder":152},[430],{"type":48,"value":155},{"type":42,"tag":136,"props":432,"children":434},{"class":138,"line":433},16,[435],{"type":42,"tag":136,"props":436,"children":437},{},[438],{"type":48,"value":439},"    public override async Task\u003CApiResult\u003Cdecimal>> ExecuteAsync(\n",{"type":42,"tag":136,"props":441,"children":443},{"class":138,"line":442},17,[444],{"type":42,"tag":136,"props":445,"children":446},{},[447],{"type":48,"value":448},"        WithdrawRequest request, \n",{"type":42,"tag":136,"props":450,"children":452},{"class":138,"line":451},18,[453],{"type":42,"tag":136,"props":454,"children":455},{},[456],{"type":48,"value":457},"        TestingContext context)\n",{"type":42,"tag":136,"props":459,"children":461},{"class":138,"line":460},19,[462],{"type":42,"tag":136,"props":463,"children":464},{},[465],{"type":48,"value":341},{"type":42,"tag":136,"props":467,"children":469},{"class":138,"line":468},20,[470],{"type":42,"tag":136,"props":471,"children":472},{},[473],{"type":48,"value":474},"        var client = context.Get\u003CBankApiClient>();\n",{"type":42,"tag":136,"props":476,"children":478},{"class":138,"line":477},21,[479],{"type":42,"tag":136,"props":480,"children":481},{},[482],{"type":48,"value":483},"        return await client.WithdrawAsync(request.AccountId, request.Amount);\n",{"type":42,"tag":136,"props":485,"children":487},{"class":138,"line":486},22,[488],{"type":42,"tag":136,"props":489,"children":490},{},[491],{"type":48,"value":422},{"type":42,"tag":136,"props":493,"children":495},{"class":138,"line":494},23,[496],{"type":42,"tag":136,"props":497,"children":498},{},[499],{"type":48,"value":500},"}\n",{"type":42,"tag":105,"props":502,"children":504},{"id":503},"the-apply-method",[505],{"type":48,"value":506},"The Apply Method",{"type":42,"tag":51,"props":508,"children":509},{},[510,512,518],{"type":48,"value":511},"Apply defines expected behavior. Given a request and state, return ",{"type":42,"tag":132,"props":513,"children":515},{"className":514},[],[516],{"type":48,"value":517},"ExpectedOutcomes",{"type":48,"value":519},":",{"type":42,"tag":124,"props":521,"children":523},{"className":126,"code":522,"language":128,"meta":129,"style":129},"spec.Operation\u003C(string AccountId, decimal Amount), ApiResult\u003Cdecimal>>(\"Deposit\", (request, state) =>\n{\n    \u002F\u002F Check preconditions first (guard clauses)\n    if (!state.Accounts.TryGetValue(request.AccountId, out var balance))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound).SameState();\n\n    \u002F\u002F Happy path last\n    var newBalance = balance + request.Amount;\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n           .ThenState\u003CBankState>(s => s.Accounts[request.AccountId] = newBalance);\n});\n",[524],{"type":42,"tag":132,"props":525,"children":526},{"__ignoreMap":129},[527,535,542,550,558,566,573,581,589,597,605],{"type":42,"tag":136,"props":528,"children":529},{"class":138,"line":139},[530],{"type":42,"tag":136,"props":531,"children":532},{},[533],{"type":48,"value":534},"spec.Operation\u003C(string AccountId, decimal Amount), ApiResult\u003Cdecimal>>(\"Deposit\", (request, state) =>\n",{"type":42,"tag":136,"props":536,"children":537},{"class":138,"line":148},[538],{"type":42,"tag":136,"props":539,"children":540},{},[541],{"type":48,"value":173},{"type":42,"tag":136,"props":543,"children":544},{"class":138,"line":158},[545],{"type":42,"tag":136,"props":546,"children":547},{},[548],{"type":48,"value":549},"    \u002F\u002F Check preconditions first (guard clauses)\n",{"type":42,"tag":136,"props":551,"children":552},{"class":138,"line":167},[553],{"type":42,"tag":136,"props":554,"children":555},{},[556],{"type":48,"value":557},"    if (!state.Accounts.TryGetValue(request.AccountId, out var balance))\n",{"type":42,"tag":136,"props":559,"children":560},{"class":138,"line":24},[561],{"type":42,"tag":136,"props":562,"children":563},{},[564],{"type":48,"value":565},"        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound).SameState();\n",{"type":42,"tag":136,"props":567,"children":568},{"class":138,"line":184},[569],{"type":42,"tag":136,"props":570,"children":571},{"emptyLinePlaceholder":152},[572],{"type":48,"value":155},{"type":42,"tag":136,"props":574,"children":575},{"class":138,"line":193},[576],{"type":42,"tag":136,"props":577,"children":578},{},[579],{"type":48,"value":580},"    \u002F\u002F Happy path last\n",{"type":42,"tag":136,"props":582,"children":583},{"class":138,"line":202},[584],{"type":42,"tag":136,"props":585,"children":586},{},[587],{"type":48,"value":588},"    var newBalance = balance + request.Amount;\n",{"type":42,"tag":136,"props":590,"children":591},{"class":138,"line":210},[592],{"type":42,"tag":136,"props":593,"children":594},{},[595],{"type":48,"value":596},"    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n",{"type":42,"tag":136,"props":598,"children":599},{"class":138,"line":219},[600],{"type":42,"tag":136,"props":601,"children":602},{},[603],{"type":48,"value":604},"           .ThenState\u003CBankState>(s => s.Accounts[request.AccountId] = newBalance);\n",{"type":42,"tag":136,"props":606,"children":607},{"class":138,"line":228},[608],{"type":42,"tag":136,"props":609,"children":610},{},[611],{"type":48,"value":234},{"type":42,"tag":51,"props":613,"children":614},{},[615],{"type":42,"tag":57,"props":616,"children":617},{},[618],{"type":48,"value":619},"Key points:",{"type":42,"tag":65,"props":621,"children":622},{},[623,635,640],{"type":42,"tag":69,"props":624,"children":625},{},[626,628,633],{"type":48,"value":627},"Apply is ",{"type":42,"tag":57,"props":629,"children":630},{},[631],{"type":48,"value":632},"pure",{"type":48,"value":634}," — no side effects, no API calls",{"type":42,"tag":69,"props":636,"children":637},{},[638],{"type":48,"value":639},"Check error conditions first with early returns",{"type":42,"tag":69,"props":641,"children":642},{},[643],{"type":48,"value":644},"Return expected response + state transition",{"type":42,"tag":105,"props":646,"children":648},{"id":647},"expectthat-validating-responses",[649],{"type":48,"value":650},"Expect.That — Validating Responses",{"type":42,"tag":112,"props":652,"children":654},{"id":653},"basic-predicate",[655],{"type":48,"value":656},"Basic Predicate",{"type":42,"tag":124,"props":658,"children":660},{"className":126,"code":659,"language":128,"meta":129,"style":129},"Expect.That\u003Cint>(r => r == 42)\n",[661],{"type":42,"tag":132,"props":662,"children":663},{"__ignoreMap":129},[664],{"type":42,"tag":136,"props":665,"children":666},{"class":138,"line":139},[667],{"type":42,"tag":136,"props":668,"children":669},{},[670],{"type":48,"value":659},{"type":42,"tag":112,"props":672,"children":674},{"id":673},"with-explanation-recommended",[675],{"type":48,"value":676},"With Explanation (Recommended)",{"type":42,"tag":124,"props":678,"children":680},{"className":126,"code":679,"language":128,"meta":129,"style":129},"Expect.That\u003CApiResult\u003Cdecimal>>(\n    r => r.IsSuccess && r.Data == expectedBalance,\n    $\"Should return 200 OK with balance {expectedBalance}\")\n",[681],{"type":42,"tag":132,"props":682,"children":683},{"__ignoreMap":129},[684,692,700],{"type":42,"tag":136,"props":685,"children":686},{"class":138,"line":139},[687],{"type":42,"tag":136,"props":688,"children":689},{},[690],{"type":48,"value":691},"Expect.That\u003CApiResult\u003Cdecimal>>(\n",{"type":42,"tag":136,"props":693,"children":694},{"class":138,"line":148},[695],{"type":42,"tag":136,"props":696,"children":697},{},[698],{"type":48,"value":699},"    r => r.IsSuccess && r.Data == expectedBalance,\n",{"type":42,"tag":136,"props":701,"children":702},{"class":138,"line":158},[703],{"type":42,"tag":136,"props":704,"children":705},{},[706],{"type":48,"value":707},"    $\"Should return 200 OK with balance {expectedBalance}\")\n",{"type":42,"tag":51,"props":709,"children":710},{},[711],{"type":48,"value":712},"Explanations appear in test failure output — crucial for debugging.",{"type":42,"tag":112,"props":714,"children":716},{"id":715},"with-validationresult",[717],{"type":48,"value":718},"With ValidationResult",{"type":42,"tag":51,"props":720,"children":721},{},[722],{"type":48,"value":723},"For complex validations with detailed error messages:",{"type":42,"tag":124,"props":725,"children":727},{"className":126,"code":726,"language":128,"meta":129,"style":129},"Expect.That\u003CUser>(response =>\n{\n    if (response.Name != expectedName)\n        return ValidationResult.Invalid($\"Name was '{response.Name}', expected '{expectedName}'\");\n    if (response.Email == null)\n        return ValidationResult.Invalid(\"Email was null\");\n    return ValidationResult.Valid();\n})\n",[728],{"type":42,"tag":132,"props":729,"children":730},{"__ignoreMap":129},[731,739,746,754,762,770,778,786],{"type":42,"tag":136,"props":732,"children":733},{"class":138,"line":139},[734],{"type":42,"tag":136,"props":735,"children":736},{},[737],{"type":48,"value":738},"Expect.That\u003CUser>(response =>\n",{"type":42,"tag":136,"props":740,"children":741},{"class":138,"line":148},[742],{"type":42,"tag":136,"props":743,"children":744},{},[745],{"type":48,"value":173},{"type":42,"tag":136,"props":747,"children":748},{"class":138,"line":158},[749],{"type":42,"tag":136,"props":750,"children":751},{},[752],{"type":48,"value":753},"    if (response.Name != expectedName)\n",{"type":42,"tag":136,"props":755,"children":756},{"class":138,"line":167},[757],{"type":42,"tag":136,"props":758,"children":759},{},[760],{"type":48,"value":761},"        return ValidationResult.Invalid($\"Name was '{response.Name}', expected '{expectedName}'\");\n",{"type":42,"tag":136,"props":763,"children":764},{"class":138,"line":24},[765],{"type":42,"tag":136,"props":766,"children":767},{},[768],{"type":48,"value":769},"    if (response.Email == null)\n",{"type":42,"tag":136,"props":771,"children":772},{"class":138,"line":184},[773],{"type":42,"tag":136,"props":774,"children":775},{},[776],{"type":48,"value":777},"        return ValidationResult.Invalid(\"Email was null\");\n",{"type":42,"tag":136,"props":779,"children":780},{"class":138,"line":193},[781],{"type":42,"tag":136,"props":782,"children":783},{},[784],{"type":48,"value":785},"    return ValidationResult.Valid();\n",{"type":42,"tag":136,"props":787,"children":788},{"class":138,"line":202},[789],{"type":42,"tag":136,"props":790,"children":791},{},[792],{"type":48,"value":793},"})\n",{"type":42,"tag":105,"props":795,"children":797},{"id":796},"state-transitions",[798],{"type":48,"value":799},"State Transitions",{"type":42,"tag":112,"props":801,"children":803},{"id":802},"no-change-samestate",[804,806],{"type":48,"value":805},"No Change: ",{"type":42,"tag":132,"props":807,"children":809},{"className":808},[],[810],{"type":48,"value":811},".SameState()",{"type":42,"tag":124,"props":813,"children":815},{"className":126,"code":814,"language":128,"meta":129,"style":129},"\u002F\u002F Error cases\nreturn Expect.That\u003CApiResult\u003CUser>>(r => r.IsNotFound).SameState();\n\n\u002F\u002F Read-only operations\nreturn Expect.That\u003CApiResult\u003CUser>>(r => r.IsSuccess).SameState();\n",[816],{"type":42,"tag":132,"props":817,"children":818},{"__ignoreMap":129},[819,827,835,842,850],{"type":42,"tag":136,"props":820,"children":821},{"class":138,"line":139},[822],{"type":42,"tag":136,"props":823,"children":824},{},[825],{"type":48,"value":826},"\u002F\u002F Error cases\n",{"type":42,"tag":136,"props":828,"children":829},{"class":138,"line":148},[830],{"type":42,"tag":136,"props":831,"children":832},{},[833],{"type":48,"value":834},"return Expect.That\u003CApiResult\u003CUser>>(r => r.IsNotFound).SameState();\n",{"type":42,"tag":136,"props":836,"children":837},{"class":138,"line":158},[838],{"type":42,"tag":136,"props":839,"children":840},{"emptyLinePlaceholder":152},[841],{"type":48,"value":155},{"type":42,"tag":136,"props":843,"children":844},{"class":138,"line":167},[845],{"type":42,"tag":136,"props":846,"children":847},{},[848],{"type":48,"value":849},"\u002F\u002F Read-only operations\n",{"type":42,"tag":136,"props":851,"children":852},{"class":138,"line":24},[853],{"type":42,"tag":136,"props":854,"children":855},{},[856],{"type":48,"value":857},"return Expect.That\u003CApiResult\u003CUser>>(r => r.IsSuccess).SameState();\n",{"type":42,"tag":112,"props":859,"children":861},{"id":860},"state-change-thenstate",[862,864],{"type":48,"value":863},"State Change: ",{"type":42,"tag":132,"props":865,"children":867},{"className":866},[],[868],{"type":48,"value":869},".ThenState()",{"type":42,"tag":124,"props":871,"children":873},{"className":126,"code":872,"language":128,"meta":129,"style":129},"return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n       .ThenState\u003CBankState>(nextState => nextState.Accounts[accountId] = newBalance);\n",[874],{"type":42,"tag":132,"props":875,"children":876},{"__ignoreMap":129},[877,885],{"type":42,"tag":136,"props":878,"children":879},{"class":138,"line":139},[880],{"type":42,"tag":136,"props":881,"children":882},{},[883],{"type":48,"value":884},"return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n",{"type":42,"tag":136,"props":886,"children":887},{"class":138,"line":148},[888],{"type":42,"tag":136,"props":889,"children":890},{},[891],{"type":48,"value":892},"       .ThenState\u003CBankState>(nextState => nextState.Accounts[accountId] = newBalance);\n",{"type":42,"tag":112,"props":894,"children":896},{"id":895},"response-dependent-state",[897],{"type":48,"value":898},"Response-Dependent State",{"type":42,"tag":51,"props":900,"children":901},{},[902],{"type":48,"value":903},"When state depends on server-generated values:",{"type":42,"tag":124,"props":905,"children":907},{"className":126,"code":906,"language":128,"meta":129,"style":129},"return Expect.That\u003CApiResult\u003COrder>>(r => r.IsSuccess && !string.IsNullOrEmpty(r.Data.OrderId))\n       .ThenState\u003CAppState>(\n           (ApiResult\u003COrder> response, AppState nextState) =>\n               nextState.Orders[response.Data.OrderId] = new OrderState { \u002F* ... *\u002F },\n           mock: () => new ApiResult\u003COrder> \n           { \n               Data = new Order { OrderId = Guid.NewGuid().ToString() },\n               StatusCode = 201 \n           });\n",[908],{"type":42,"tag":132,"props":909,"children":910},{"__ignoreMap":129},[911,919,927,935,943,951,959,967,975],{"type":42,"tag":136,"props":912,"children":913},{"class":138,"line":139},[914],{"type":42,"tag":136,"props":915,"children":916},{},[917],{"type":48,"value":918},"return Expect.That\u003CApiResult\u003COrder>>(r => r.IsSuccess && !string.IsNullOrEmpty(r.Data.OrderId))\n",{"type":42,"tag":136,"props":920,"children":921},{"class":138,"line":148},[922],{"type":42,"tag":136,"props":923,"children":924},{},[925],{"type":48,"value":926},"       .ThenState\u003CAppState>(\n",{"type":42,"tag":136,"props":928,"children":929},{"class":138,"line":158},[930],{"type":42,"tag":136,"props":931,"children":932},{},[933],{"type":48,"value":934},"           (ApiResult\u003COrder> response, AppState nextState) =>\n",{"type":42,"tag":136,"props":936,"children":937},{"class":138,"line":167},[938],{"type":42,"tag":136,"props":939,"children":940},{},[941],{"type":48,"value":942},"               nextState.Orders[response.Data.OrderId] = new OrderState { \u002F* ... *\u002F },\n",{"type":42,"tag":136,"props":944,"children":945},{"class":138,"line":24},[946],{"type":42,"tag":136,"props":947,"children":948},{},[949],{"type":48,"value":950},"           mock: () => new ApiResult\u003COrder> \n",{"type":42,"tag":136,"props":952,"children":953},{"class":138,"line":184},[954],{"type":42,"tag":136,"props":955,"children":956},{},[957],{"type":48,"value":958},"           { \n",{"type":42,"tag":136,"props":960,"children":961},{"class":138,"line":193},[962],{"type":42,"tag":136,"props":963,"children":964},{},[965],{"type":48,"value":966},"               Data = new Order { OrderId = Guid.NewGuid().ToString() },\n",{"type":42,"tag":136,"props":968,"children":969},{"class":138,"line":202},[970],{"type":42,"tag":136,"props":971,"children":972},{},[973],{"type":48,"value":974},"               StatusCode = 201 \n",{"type":42,"tag":136,"props":976,"children":977},{"class":138,"line":210},[978],{"type":42,"tag":136,"props":979,"children":980},{},[981],{"type":48,"value":982},"           });\n",{"type":42,"tag":105,"props":984,"children":986},{"id":985},"multiple-valid-outcomes-expectoneof",[987],{"type":48,"value":988},"Multiple Valid Outcomes: Expect.OneOf",{"type":42,"tag":51,"props":990,"children":991},{},[992],{"type":48,"value":993},"When more than one outcome is valid (timeouts, non-determinism):",{"type":42,"tag":124,"props":995,"children":997},{"className":126,"code":996,"language":128,"meta":129,"style":129},"spec.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.OneOf(\n        \u002F\u002F Success\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == 0)\n              .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0),\n              \n        \u002F\u002F Timeout - request lost\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsTimeout)\n              .SameState(),\n              \n        \u002F\u002F Timeout - response lost (account was created)\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsTimeout)\n              .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0)\n    );\n});\n",[998],{"type":42,"tag":132,"props":999,"children":1000},{"__ignoreMap":129},[1001,1008,1015,1022,1029,1036,1044,1052,1060,1068,1076,1084,1092,1100,1107,1115,1122,1130,1138],{"type":42,"tag":136,"props":1002,"children":1003},{"class":138,"line":139},[1004],{"type":42,"tag":136,"props":1005,"children":1006},{},[1007],{"type":48,"value":164},{"type":42,"tag":136,"props":1009,"children":1010},{"class":138,"line":148},[1011],{"type":42,"tag":136,"props":1012,"children":1013},{},[1014],{"type":48,"value":173},{"type":42,"tag":136,"props":1016,"children":1017},{"class":138,"line":158},[1018],{"type":42,"tag":136,"props":1019,"children":1020},{},[1021],{"type":48,"value":190},{"type":42,"tag":136,"props":1023,"children":1024},{"class":138,"line":167},[1025],{"type":42,"tag":136,"props":1026,"children":1027},{},[1028],{"type":48,"value":199},{"type":42,"tag":136,"props":1030,"children":1031},{"class":138,"line":24},[1032],{"type":42,"tag":136,"props":1033,"children":1034},{"emptyLinePlaceholder":152},[1035],{"type":48,"value":155},{"type":42,"tag":136,"props":1037,"children":1038},{"class":138,"line":184},[1039],{"type":42,"tag":136,"props":1040,"children":1041},{},[1042],{"type":48,"value":1043},"    return Expect.OneOf(\n",{"type":42,"tag":136,"props":1045,"children":1046},{"class":138,"line":193},[1047],{"type":42,"tag":136,"props":1048,"children":1049},{},[1050],{"type":48,"value":1051},"        \u002F\u002F Success\n",{"type":42,"tag":136,"props":1053,"children":1054},{"class":138,"line":202},[1055],{"type":42,"tag":136,"props":1056,"children":1057},{},[1058],{"type":48,"value":1059},"        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == 0)\n",{"type":42,"tag":136,"props":1061,"children":1062},{"class":138,"line":210},[1063],{"type":42,"tag":136,"props":1064,"children":1065},{},[1066],{"type":48,"value":1067},"              .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0),\n",{"type":42,"tag":136,"props":1069,"children":1070},{"class":138,"line":219},[1071],{"type":42,"tag":136,"props":1072,"children":1073},{},[1074],{"type":48,"value":1075},"              \n",{"type":42,"tag":136,"props":1077,"children":1078},{"class":138,"line":228},[1079],{"type":42,"tag":136,"props":1080,"children":1081},{},[1082],{"type":48,"value":1083},"        \u002F\u002F Timeout - request lost\n",{"type":42,"tag":136,"props":1085,"children":1086},{"class":138,"line":398},[1087],{"type":42,"tag":136,"props":1088,"children":1089},{},[1090],{"type":48,"value":1091},"        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsTimeout)\n",{"type":42,"tag":136,"props":1093,"children":1094},{"class":138,"line":407},[1095],{"type":42,"tag":136,"props":1096,"children":1097},{},[1098],{"type":48,"value":1099},"              .SameState(),\n",{"type":42,"tag":136,"props":1101,"children":1102},{"class":138,"line":416},[1103],{"type":42,"tag":136,"props":1104,"children":1105},{},[1106],{"type":48,"value":1075},{"type":42,"tag":136,"props":1108,"children":1109},{"class":138,"line":425},[1110],{"type":42,"tag":136,"props":1111,"children":1112},{},[1113],{"type":48,"value":1114},"        \u002F\u002F Timeout - response lost (account was created)\n",{"type":42,"tag":136,"props":1116,"children":1117},{"class":138,"line":433},[1118],{"type":42,"tag":136,"props":1119,"children":1120},{},[1121],{"type":48,"value":1091},{"type":42,"tag":136,"props":1123,"children":1124},{"class":138,"line":442},[1125],{"type":42,"tag":136,"props":1126,"children":1127},{},[1128],{"type":48,"value":1129},"              .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0)\n",{"type":42,"tag":136,"props":1131,"children":1132},{"class":138,"line":451},[1133],{"type":42,"tag":136,"props":1134,"children":1135},{},[1136],{"type":48,"value":1137},"    );\n",{"type":42,"tag":136,"props":1139,"children":1140},{"class":138,"line":460},[1141],{"type":42,"tag":136,"props":1142,"children":1143},{},[1144],{"type":48,"value":234},{"type":42,"tag":105,"props":1146,"children":1148},{"id":1147},"exception-expectations",[1149],{"type":48,"value":1150},"Exception Expectations",{"type":42,"tag":51,"props":1152,"children":1153},{},[1154],{"type":48,"value":1155},"When operations should throw:",{"type":42,"tag":124,"props":1157,"children":1159},{"className":126,"code":1158,"language":128,"meta":129,"style":129},"spec.Operation\u003Cstring, Unit>(\"DeleteUser\", (userId, state) =>\n{\n    if (!state.Users.ContainsKey(userId))\n        return Expect.Throws\u003CNotFoundException>(\"User not found\").SameState();\n\n    if (state.Users[userId].HasPendingOrders)\n        return Expect.Throws\u003CBusinessRuleException>(\"Cannot delete user with pending orders\").SameState();\n\n    return Expect.That\u003CUnit>(r => true)\n           .ThenState\u003CAppState>(s => s.Users.Remove(userId));\n});\n",[1160],{"type":42,"tag":132,"props":1161,"children":1162},{"__ignoreMap":129},[1163,1171,1178,1186,1194,1201,1209,1217,1224,1232,1240],{"type":42,"tag":136,"props":1164,"children":1165},{"class":138,"line":139},[1166],{"type":42,"tag":136,"props":1167,"children":1168},{},[1169],{"type":48,"value":1170},"spec.Operation\u003Cstring, Unit>(\"DeleteUser\", (userId, state) =>\n",{"type":42,"tag":136,"props":1172,"children":1173},{"class":138,"line":148},[1174],{"type":42,"tag":136,"props":1175,"children":1176},{},[1177],{"type":48,"value":173},{"type":42,"tag":136,"props":1179,"children":1180},{"class":138,"line":158},[1181],{"type":42,"tag":136,"props":1182,"children":1183},{},[1184],{"type":48,"value":1185},"    if (!state.Users.ContainsKey(userId))\n",{"type":42,"tag":136,"props":1187,"children":1188},{"class":138,"line":167},[1189],{"type":42,"tag":136,"props":1190,"children":1191},{},[1192],{"type":48,"value":1193},"        return Expect.Throws\u003CNotFoundException>(\"User not found\").SameState();\n",{"type":42,"tag":136,"props":1195,"children":1196},{"class":138,"line":24},[1197],{"type":42,"tag":136,"props":1198,"children":1199},{"emptyLinePlaceholder":152},[1200],{"type":48,"value":155},{"type":42,"tag":136,"props":1202,"children":1203},{"class":138,"line":184},[1204],{"type":42,"tag":136,"props":1205,"children":1206},{},[1207],{"type":48,"value":1208},"    if (state.Users[userId].HasPendingOrders)\n",{"type":42,"tag":136,"props":1210,"children":1211},{"class":138,"line":193},[1212],{"type":42,"tag":136,"props":1213,"children":1214},{},[1215],{"type":48,"value":1216},"        return Expect.Throws\u003CBusinessRuleException>(\"Cannot delete user with pending orders\").SameState();\n",{"type":42,"tag":136,"props":1218,"children":1219},{"class":138,"line":202},[1220],{"type":42,"tag":136,"props":1221,"children":1222},{"emptyLinePlaceholder":152},[1223],{"type":48,"value":155},{"type":42,"tag":136,"props":1225,"children":1226},{"class":138,"line":210},[1227],{"type":42,"tag":136,"props":1228,"children":1229},{},[1230],{"type":48,"value":1231},"    return Expect.That\u003CUnit>(r => true)\n",{"type":42,"tag":136,"props":1233,"children":1234},{"class":138,"line":219},[1235],{"type":42,"tag":136,"props":1236,"children":1237},{},[1238],{"type":48,"value":1239},"           .ThenState\u003CAppState>(s => s.Users.Remove(userId));\n",{"type":42,"tag":136,"props":1241,"children":1242},{"class":138,"line":228},[1243],{"type":42,"tag":136,"props":1244,"children":1245},{},[1246],{"type":48,"value":234},{"type":42,"tag":51,"props":1248,"children":1249},{},[1250,1252,1258],{"type":48,"value":1251},"Use ",{"type":42,"tag":132,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":48,"value":1257},"Unit",{"type":48,"value":1259}," as the response type for void operations.",{"type":42,"tag":105,"props":1261,"children":1263},{"id":1262},"writing-strong-predicates",[1264],{"type":48,"value":1265},"Writing Strong Predicates",{"type":42,"tag":51,"props":1267,"children":1268},{},[1269,1274],{"type":42,"tag":57,"props":1270,"children":1271},{},[1272],{"type":48,"value":1273},"Weak",{"type":48,"value":1275}," (catches fewer bugs):",{"type":42,"tag":124,"props":1277,"children":1279},{"className":126,"code":1278,"language":128,"meta":129,"style":129},"Expect.That\u003CApiResult\u003CUser>>(r => r.IsSuccess)  \u002F\u002F Only checks status\n",[1280],{"type":42,"tag":132,"props":1281,"children":1282},{"__ignoreMap":129},[1283],{"type":42,"tag":136,"props":1284,"children":1285},{"class":138,"line":139},[1286],{"type":42,"tag":136,"props":1287,"children":1288},{},[1289],{"type":48,"value":1278},{"type":42,"tag":51,"props":1291,"children":1292},{},[1293,1298],{"type":42,"tag":57,"props":1294,"children":1295},{},[1296],{"type":48,"value":1297},"Strong",{"type":48,"value":1299}," (catches more bugs):",{"type":42,"tag":124,"props":1301,"children":1303},{"className":126,"code":1302,"language":128,"meta":129,"style":129},"Expect.That\u003CApiResult\u003CUser>>(\n    r => r.IsSuccess && \n         r.Data.Id == expectedId && \n         r.Data.Name == expectedName &&\n         r.Data.Email == expectedEmail)\n",[1304],{"type":42,"tag":132,"props":1305,"children":1306},{"__ignoreMap":129},[1307,1315,1323,1331,1339],{"type":42,"tag":136,"props":1308,"children":1309},{"class":138,"line":139},[1310],{"type":42,"tag":136,"props":1311,"children":1312},{},[1313],{"type":48,"value":1314},"Expect.That\u003CApiResult\u003CUser>>(\n",{"type":42,"tag":136,"props":1316,"children":1317},{"class":138,"line":148},[1318],{"type":42,"tag":136,"props":1319,"children":1320},{},[1321],{"type":48,"value":1322},"    r => r.IsSuccess && \n",{"type":42,"tag":136,"props":1324,"children":1325},{"class":138,"line":158},[1326],{"type":42,"tag":136,"props":1327,"children":1328},{},[1329],{"type":48,"value":1330},"         r.Data.Id == expectedId && \n",{"type":42,"tag":136,"props":1332,"children":1333},{"class":138,"line":167},[1334],{"type":42,"tag":136,"props":1335,"children":1336},{},[1337],{"type":48,"value":1338},"         r.Data.Name == expectedName &&\n",{"type":42,"tag":136,"props":1340,"children":1341},{"class":138,"line":24},[1342],{"type":42,"tag":136,"props":1343,"children":1344},{},[1345],{"type":48,"value":1346},"         r.Data.Email == expectedEmail)\n",{"type":42,"tag":51,"props":1348,"children":1349},{},[1350],{"type":48,"value":1351},"The stronger your predicates, the more bugs you'll catch.",{"type":42,"tag":105,"props":1353,"children":1355},{"id":1354},"common-patterns",[1356],{"type":48,"value":1357},"Common Patterns",{"type":42,"tag":112,"props":1359,"children":1361},{"id":1360},"the-guard-clause-pattern",[1362],{"type":48,"value":1363},"The Guard-Clause Pattern",{"type":42,"tag":124,"props":1365,"children":1367},{"className":126,"code":1366,"language":128,"meta":129,"style":129},"spec.Operation\u003CTransferRequest, ApiResult\u003Cdecimal>>(\"Transfer\", (req, state) =>\n{\n    \u002F\u002F Guards first\n    if (!state.Accounts.ContainsKey(req.FromAccount))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound, \"Source not found\").SameState();\n    \n    if (!state.Accounts.ContainsKey(req.ToAccount))\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound, \"Target not found\").SameState();\n    \n    var balance = state.Accounts[req.FromAccount];\n    if (balance \u003C req.Amount)\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest, \"Insufficient funds\").SameState();\n\n    \u002F\u002F Happy path last\n    var newFromBalance = balance - req.Amount;\n    var newToBalance = state.Accounts[req.ToAccount] + req.Amount;\n    \n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newFromBalance)\n           .ThenState\u003CBankState>(s => {\n               s.Accounts[req.FromAccount] = newFromBalance;\n               s.Accounts[req.ToAccount] = newToBalance;\n           });\n});\n",[1368],{"type":42,"tag":132,"props":1369,"children":1370},{"__ignoreMap":129},[1371,1379,1386,1394,1402,1410,1418,1426,1434,1441,1449,1457,1465,1472,1479,1487,1495,1502,1510,1518,1526,1534,1541],{"type":42,"tag":136,"props":1372,"children":1373},{"class":138,"line":139},[1374],{"type":42,"tag":136,"props":1375,"children":1376},{},[1377],{"type":48,"value":1378},"spec.Operation\u003CTransferRequest, ApiResult\u003Cdecimal>>(\"Transfer\", (req, state) =>\n",{"type":42,"tag":136,"props":1380,"children":1381},{"class":138,"line":148},[1382],{"type":42,"tag":136,"props":1383,"children":1384},{},[1385],{"type":48,"value":173},{"type":42,"tag":136,"props":1387,"children":1388},{"class":138,"line":158},[1389],{"type":42,"tag":136,"props":1390,"children":1391},{},[1392],{"type":48,"value":1393},"    \u002F\u002F Guards first\n",{"type":42,"tag":136,"props":1395,"children":1396},{"class":138,"line":167},[1397],{"type":42,"tag":136,"props":1398,"children":1399},{},[1400],{"type":48,"value":1401},"    if (!state.Accounts.ContainsKey(req.FromAccount))\n",{"type":42,"tag":136,"props":1403,"children":1404},{"class":138,"line":24},[1405],{"type":42,"tag":136,"props":1406,"children":1407},{},[1408],{"type":48,"value":1409},"        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound, \"Source not found\").SameState();\n",{"type":42,"tag":136,"props":1411,"children":1412},{"class":138,"line":184},[1413],{"type":42,"tag":136,"props":1414,"children":1415},{},[1416],{"type":48,"value":1417},"    \n",{"type":42,"tag":136,"props":1419,"children":1420},{"class":138,"line":193},[1421],{"type":42,"tag":136,"props":1422,"children":1423},{},[1424],{"type":48,"value":1425},"    if (!state.Accounts.ContainsKey(req.ToAccount))\n",{"type":42,"tag":136,"props":1427,"children":1428},{"class":138,"line":202},[1429],{"type":42,"tag":136,"props":1430,"children":1431},{},[1432],{"type":48,"value":1433},"        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsNotFound, \"Target not found\").SameState();\n",{"type":42,"tag":136,"props":1435,"children":1436},{"class":138,"line":210},[1437],{"type":42,"tag":136,"props":1438,"children":1439},{},[1440],{"type":48,"value":1417},{"type":42,"tag":136,"props":1442,"children":1443},{"class":138,"line":219},[1444],{"type":42,"tag":136,"props":1445,"children":1446},{},[1447],{"type":48,"value":1448},"    var balance = state.Accounts[req.FromAccount];\n",{"type":42,"tag":136,"props":1450,"children":1451},{"class":138,"line":228},[1452],{"type":42,"tag":136,"props":1453,"children":1454},{},[1455],{"type":48,"value":1456},"    if (balance \u003C req.Amount)\n",{"type":42,"tag":136,"props":1458,"children":1459},{"class":138,"line":398},[1460],{"type":42,"tag":136,"props":1461,"children":1462},{},[1463],{"type":48,"value":1464},"        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest, \"Insufficient funds\").SameState();\n",{"type":42,"tag":136,"props":1466,"children":1467},{"class":138,"line":407},[1468],{"type":42,"tag":136,"props":1469,"children":1470},{"emptyLinePlaceholder":152},[1471],{"type":48,"value":155},{"type":42,"tag":136,"props":1473,"children":1474},{"class":138,"line":416},[1475],{"type":42,"tag":136,"props":1476,"children":1477},{},[1478],{"type":48,"value":580},{"type":42,"tag":136,"props":1480,"children":1481},{"class":138,"line":425},[1482],{"type":42,"tag":136,"props":1483,"children":1484},{},[1485],{"type":48,"value":1486},"    var newFromBalance = balance - req.Amount;\n",{"type":42,"tag":136,"props":1488,"children":1489},{"class":138,"line":433},[1490],{"type":42,"tag":136,"props":1491,"children":1492},{},[1493],{"type":48,"value":1494},"    var newToBalance = state.Accounts[req.ToAccount] + req.Amount;\n",{"type":42,"tag":136,"props":1496,"children":1497},{"class":138,"line":442},[1498],{"type":42,"tag":136,"props":1499,"children":1500},{},[1501],{"type":48,"value":1417},{"type":42,"tag":136,"props":1503,"children":1504},{"class":138,"line":451},[1505],{"type":42,"tag":136,"props":1506,"children":1507},{},[1508],{"type":48,"value":1509},"    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newFromBalance)\n",{"type":42,"tag":136,"props":1511,"children":1512},{"class":138,"line":460},[1513],{"type":42,"tag":136,"props":1514,"children":1515},{},[1516],{"type":48,"value":1517},"           .ThenState\u003CBankState>(s => {\n",{"type":42,"tag":136,"props":1519,"children":1520},{"class":138,"line":468},[1521],{"type":42,"tag":136,"props":1522,"children":1523},{},[1524],{"type":48,"value":1525},"               s.Accounts[req.FromAccount] = newFromBalance;\n",{"type":42,"tag":136,"props":1527,"children":1528},{"class":138,"line":477},[1529],{"type":42,"tag":136,"props":1530,"children":1531},{},[1532],{"type":48,"value":1533},"               s.Accounts[req.ToAccount] = newToBalance;\n",{"type":42,"tag":136,"props":1535,"children":1536},{"class":138,"line":486},[1537],{"type":42,"tag":136,"props":1538,"children":1539},{},[1540],{"type":48,"value":982},{"type":42,"tag":136,"props":1542,"children":1543},{"class":138,"line":494},[1544],{"type":42,"tag":136,"props":1545,"children":1546},{},[1547],{"type":48,"value":234},{"type":42,"tag":105,"props":1549,"children":1551},{"id":1550},"next-steps",[1552],{"type":48,"value":1553},"Next Steps",{"type":42,"tag":65,"props":1555,"children":1556},{},[1557,1567],{"type":42,"tag":69,"props":1558,"children":1559},{},[1560,1565],{"type":42,"tag":57,"props":1561,"children":1562},{},[1563],{"type":48,"value":1564},"Test Generation",{"type":48,"value":1566},": See how operations combine into test sequences",{"type":42,"tag":69,"props":1568,"children":1569},{},[1570,1575],{"type":42,"tag":57,"props":1571,"children":1572},{},[1573],{"type":48,"value":1574},"Async Operations",{"type":48,"value":1576},": Model background work with step functions",{"type":42,"tag":1578,"props":1579,"children":1580},"style",{},[1581],{"type":48,"value":1582},"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":1584,"total":148},[1585,1591],{"slug":4,"name":4,"fn":5,"description":6,"org":1586,"tags":1587,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1588,1589,1590],{"name":13,"slug":14,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":1592,"name":1592,"fn":1593,"description":1594,"org":1595,"tags":1596,"stars":20,"repoUrl":21,"updatedAt":1606},"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},[1597,1600,1603],{"name":1598,"slug":1599,"type":15},"Documentation","documentation",{"name":1601,"slug":1602,"type":15},"Reference","reference",{"name":1604,"slug":1605,"type":15},"Testing","testing","2026-07-07T06:53:44.67572",{"items":1608,"total":1801},[1609,1629,1650,1671,1686,1703,1714,1727,1742,1757,1776,1789],{"slug":1610,"name":1610,"fn":1611,"description":1612,"org":1613,"tags":1614,"stars":1626,"repoUrl":1627,"updatedAt":1628},"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},[1615,1616,1619,1620,1623],{"name":18,"slug":19,"type":15},{"name":1617,"slug":1618,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":1621,"slug":1622,"type":15},"Project Management","project-management",{"name":1624,"slug":1625,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":1630,"name":1630,"fn":1631,"description":1632,"org":1633,"tags":1634,"stars":1647,"repoUrl":1648,"updatedAt":1649},"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},[1635,1638,1641,1644],{"name":1636,"slug":1637,"type":15},".NET","net",{"name":1639,"slug":1640,"type":15},"Agents","agents",{"name":1642,"slug":1643,"type":15},"Azure","azure",{"name":1645,"slug":1646,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":1651,"name":1651,"fn":1652,"description":1653,"org":1654,"tags":1655,"stars":1647,"repoUrl":1648,"updatedAt":1670},"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},[1656,1659,1660,1663,1666,1667],{"name":1657,"slug":1658,"type":15},"Analytics","analytics",{"name":1642,"slug":1643,"type":15},{"name":1661,"slug":1662,"type":15},"Data Analysis","data-analysis",{"name":1664,"slug":1665,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":1668,"slug":1669,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":1672,"name":1672,"fn":1673,"description":1674,"org":1675,"tags":1676,"stars":1647,"repoUrl":1648,"updatedAt":1685},"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},[1677,1680,1681,1682],{"name":1678,"slug":1679,"type":15},"AI Infrastructure","ai-infrastructure",{"name":1642,"slug":1643,"type":15},{"name":1664,"slug":1665,"type":15},{"name":1683,"slug":1684,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":1687,"name":1687,"fn":1688,"description":1689,"org":1690,"tags":1691,"stars":1647,"repoUrl":1648,"updatedAt":1702},"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},[1692,1693,1696,1697,1698,1701],{"name":1642,"slug":1643,"type":15},{"name":1694,"slug":1695,"type":15},"Compliance","compliance",{"name":1645,"slug":1646,"type":15},{"name":9,"slug":8,"type":15},{"name":1699,"slug":1700,"type":15},"Python","python",{"name":1683,"slug":1684,"type":15},"2026-07-18T05:14:23.017504",{"slug":1704,"name":1704,"fn":1705,"description":1706,"org":1707,"tags":1708,"stars":1647,"repoUrl":1648,"updatedAt":1713},"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},[1709,1710,1711,1712],{"name":1657,"slug":1658,"type":15},{"name":1642,"slug":1643,"type":15},{"name":1645,"slug":1646,"type":15},{"name":1699,"slug":1700,"type":15},"2026-07-31T05:54:29.068751",{"slug":1715,"name":1715,"fn":1716,"description":1717,"org":1718,"tags":1719,"stars":1647,"repoUrl":1648,"updatedAt":1726},"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},[1720,1723,1724,1725],{"name":1721,"slug":1722,"type":15},"API Development","api-development",{"name":1642,"slug":1643,"type":15},{"name":9,"slug":8,"type":15},{"name":1699,"slug":1700,"type":15},"2026-07-18T05:14:16.988376",{"slug":1728,"name":1728,"fn":1729,"description":1730,"org":1731,"tags":1732,"stars":1647,"repoUrl":1648,"updatedAt":1741},"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},[1733,1734,1737,1740],{"name":1642,"slug":1643,"type":15},{"name":1735,"slug":1736,"type":15},"Computer Vision","computer-vision",{"name":1738,"slug":1739,"type":15},"Images","images",{"name":1699,"slug":1700,"type":15},"2026-07-18T05:14:18.007737",{"slug":1743,"name":1743,"fn":1744,"description":1745,"org":1746,"tags":1747,"stars":1647,"repoUrl":1648,"updatedAt":1756},"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},[1748,1749,1752,1755],{"name":1642,"slug":1643,"type":15},{"name":1750,"slug":1751,"type":15},"Configuration","configuration",{"name":1753,"slug":1754,"type":15},"Feature Flags","feature-flags",{"name":1664,"slug":1665,"type":15},"2026-07-03T16:32:01.278468",{"slug":1758,"name":1758,"fn":1759,"description":1760,"org":1761,"tags":1762,"stars":1647,"repoUrl":1648,"updatedAt":1775},"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},[1763,1766,1769,1772],{"name":1764,"slug":1765,"type":15},"Cosmos DB","cosmos-db",{"name":1767,"slug":1768,"type":15},"Database","database",{"name":1770,"slug":1771,"type":15},"NoSQL","nosql",{"name":1773,"slug":1774,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":1777,"name":1777,"fn":1759,"description":1778,"org":1779,"tags":1780,"stars":1647,"repoUrl":1648,"updatedAt":1788},"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},[1781,1782,1783,1784,1785],{"name":1764,"slug":1765,"type":15},{"name":1767,"slug":1768,"type":15},{"name":9,"slug":8,"type":15},{"name":1770,"slug":1771,"type":15},{"name":1786,"slug":1787,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":1790,"name":1790,"fn":1791,"description":1792,"org":1793,"tags":1794,"stars":1647,"repoUrl":1648,"updatedAt":1800},"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},[1795,1796,1797,1798,1799],{"name":1642,"slug":1643,"type":15},{"name":1764,"slug":1765,"type":15},{"name":1767,"slug":1768,"type":15},{"name":1664,"slug":1665,"type":15},{"name":1770,"slug":1771,"type":15},"2026-05-13T06:14:17.582229",267]