[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69B85BBG2EBQJE2YFPYP88N":3,"skill-same:01M69B85BBG2EBQJE2YFPYP88N":55},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":26,"linkOnly":27,"markdownContent":28,"markdownBody":29,"frontMatter":30,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":36,"ownerHtmlUrl":37,"ownerBlogUrl":38,"ownerDescription":39,"updatedAt":40,"install":41,"resources":54},"01M69B85BBG2EBQJE2YFPYP88N","accordant-patterns",null,"Common patterns in Accordant - response-dependent state, request derivations, error handling, and HTTP integration","microsoft\u002Faccordant","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69B7QH8ZN957JJZVX9SAHW6",70,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fpatterns\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25],"accordant patterns","http","2026-11-10 10:12:30",false,"---\nname: accordant-patterns\ndescription: Common patterns in Accordant - response-dependent state, request derivations, error handling, and HTTP integration\n---\n\n# Common Patterns in Accordant\n\nThis skill covers frequently-used patterns when building Accordant specs.\n\n## Response-Dependent State\n\nWhen state depends on server-generated values (IDs, timestamps, ETags):\n\n```csharp\nspec.Operation\u003CCreateOrderRequest, ApiResult\u003COrder>>(\"CreateOrder\", (request, state) =>\n{\n    return Expect.That\u003CApiResult\u003COrder>>(\n               r => r.IsSuccess && !string.IsNullOrEmpty(r.Data.OrderId))\n           .ThenState\u003CAppState>(\n               \u002F\u002F Lambda receives response AND a pre-cloned nextState\n               (ApiResult\u003COrder> response, AppState nextState) =>\n                   nextState.Orders[response.Data.OrderId] = new OrderState\n                   {\n                       Product = request.Product,\n                       Status = OrderStatus.Created\n                   },\n               \u002F\u002F Mock for test generation (no real system running)\n               mock: () => new ApiResult\u003COrder>\n               {\n                   Data = new Order \n                   { \n                       OrderId = Guid.NewGuid().ToString(),\n                       Product = request.Product \n                   },\n                   StatusCode = 201\n               });\n});\n```\n\n### Why the Mock?\n\nDuring **test generation**, there's no real server. The mock provides a plausible response so Accordant can explore the state space. At **test execution**, the mock is ignored — real responses are used.\n\n### Validating Captured Values\n\n```csharp\nspec.Operation\u003Cstring, ApiResult\u003COrder>>(\"GetOrder\", (orderId, state) =>\n{\n    if (!state.Orders.TryGetValue(orderId, out var order))\n        return Expect.That\u003CApiResult\u003COrder>>(r => r.IsNotFound).SameState();\n\n    \u002F\u002F Validate against captured state\n    return Expect.That\u003CApiResult\u003COrder>>(\n               r => r.IsSuccess && \n                    r.Data.OrderId == orderId &&\n                    r.Data.Product == order.Product &&\n                    r.Data.Status == order.Status)\n           .SameState();\n});\n```\n\n## Request Derivations\n\nWhen one operation's request needs data from another operation's response:\n\n```csharp\n\u002F\u002F CreateTodo returns a server-generated TodoId\n\u002F\u002F GetTodo needs that TodoId\n\nspec.ConfigureDerivations(\"GetTodo\",\n    Derive.From\u003CCreateTodoRequest, CreateTodoResponse, string>(\"CreateTodo\")\n        .When((createReq, createResp) => createResp.IsSuccess)\n        .As((createReq, createResp) => createResp.TodoId));\n```\n\n### When You DON'T Need Derivations\n\nIf the client controls all IDs (not server-generated), no derivation needed:\n\n```csharp\n\u002F\u002F Client picks the key\nawait api.CreateItem(\"my-key\", \"my-value\");\nawait api.GetItem(\"my-key\");  \u002F\u002F No derivation needed - we know the key\n```\n\nDerivations are only needed when you must extract values from responses.\n\n## HTTP API Integration\n\n### ApiResult\u003CT> Pattern\n\nA common pattern for HTTP responses:\n\n```csharp\npublic class ApiResult\u003CT>\n{\n    public T? Data { get; set; }\n    public int StatusCode { get; set; }\n    \n    public bool IsSuccess => StatusCode >= 200 && StatusCode \u003C 300;\n    public bool IsNotFound => StatusCode == 404;\n    public bool IsConflict => StatusCode == 409;\n    public bool IsBadRequest => StatusCode == 400;\n}\n```\n\n### Binding HTTP Calls\n\n```csharp\nspec.ExecuteWith\u003CHttpClient>()\n    .BindAsync\u003Cstring, ApiResult\u003CUser>>(\"GetUser\", async (client, userId) =>\n    {\n        var response = await client.GetAsync($\"\u002Fapi\u002Fusers\u002F{userId}\");\n        return new ApiResult\u003CUser>\n        {\n            StatusCode = (int)response.StatusCode,\n            Data = response.IsSuccessStatusCode \n                ? await response.Content.ReadFromJsonAsync\u003CUser>()\n                : null\n        };\n    });\n```\n\n### Using a Typed Client\n\n```csharp\npublic class BankApiClient\n{\n    private readonly HttpClient _client;\n    \n    public async Task\u003CApiResult\u003Cdecimal>> CreateAccount(string accountId)\n    {\n        var response = await _client.PutAsync($\"\u002Faccounts\u002F{accountId}\", null);\n        return await ParseResponse\u003Cdecimal>(response);\n    }\n    \n    public async Task\u003CApiResult\u003Cdecimal>> Withdraw(string accountId, decimal amount)\n    {\n        var content = JsonContent.Create(new { amount });\n        var response = await _client.PostAsync($\"\u002Faccounts\u002F{accountId}\u002Fwithdraw\", content);\n        return await ParseResponse\u003Cdecimal>(response);\n    }\n}\n\n\u002F\u002F Bind\nspec.ExecuteWith\u003CBankApiClient>()\n    .Bind\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\", (c, id) => c.CreateAccount(id).Result)\n    .Bind\u003C(string, decimal), ApiResult\u003Cdecimal>>(\"Withdraw\", (c, r) => c.Withdraw(r.Item1, r.Item2).Result);\n```\n\n## Error Handling Patterns\n\n### Status Code Errors\n\n```csharp\nspec.Operation\u003Cstring, ApiResult\u003CUser>>(\"GetUser\", (userId, state) =>\n{\n    if (!state.Users.ContainsKey(userId))\n        return Expect.That\u003CApiResult\u003CUser>>(r => r.IsNotFound, \"User not found\").SameState();\n\n    var user = state.Users[userId];\n    return Expect.That\u003CApiResult\u003CUser>>(r => r.IsSuccess && r.Data.Name == user.Name).SameState();\n});\n```\n\n### Exception Throwing\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    return Expect.That\u003CUnit>(r => true)\n           .ThenState\u003CAppState>(s => s.Users.Remove(userId));\n});\n```\n\n### Multiple Error Conditions\n\n```csharp\nspec.Operation\u003CTransferRequest, ApiResult\u003Cdecimal>>(\"Transfer\", (req, state) =>\n{\n    \u002F\u002F Check each error condition\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    if (state.Accounts[req.FromAccount] \u003C req.Amount)\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest, \"Insufficient funds\").SameState();\n\n    \u002F\u002F Success path\n    var newBalance = state.Accounts[req.FromAccount] - req.Amount;\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n           .ThenState\u003CAppState>(s => {\n               s.Accounts[req.FromAccount] = newBalance;\n               s.Accounts[req.ToAccount] += req.Amount;\n           });\n});\n```\n\n## Indefinite Failures (Network Uncertainty)\n\nWhen you can't tell if an operation succeeded (timeout, network error):\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 never reached server\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsTimeout)\n              .SameState(),\n              \n        \u002F\u002F Timeout - server processed it, response lost\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsTimeout)\n              .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0)\n    );\n});\n```\n\nBoth timeout outcomes are valid — you don't know which actually happened until you check.\n\n## Validation Helpers\n\n### Using FluentAssertions\n\n```csharp\nExpect.That\u003CUser>(response =>\n{\n    try\n    {\n        response.Should().BeEquivalentTo(expectedUser, options => options\n            .Excluding(x => x.CreatedAt)\n            .Excluding(x => x.UpdatedAt));\n        return ValidationResult.Valid();\n    }\n    catch (Exception ex)\n    {\n        return ValidationResult.Invalid(ex.Message);\n    }\n})\n```\n\n### Custom Validation Logic\n\n```csharp\nExpect.That\u003COrderResponse>(response =>\n{\n    var errors = new List\u003Cstring>();\n    \n    if (response.OrderId == null)\n        errors.Add(\"OrderId was null\");\n    if (response.Items.Count != expectedCount)\n        errors.Add($\"Expected {expectedCount} items, got {response.Items.Count}\");\n    if (response.Total != expectedTotal)\n        errors.Add($\"Expected total {expectedTotal}, got {response.Total}\");\n    \n    return errors.Count == 0 \n        ? ValidationResult.Valid()\n        : ValidationResult.Invalid(string.Join(\"; \", errors));\n})\n```\n\n## Tuple Requests\n\nFor operations with multiple parameters:\n\n```csharp\n\u002F\u002F Define with tuple\nspec.Operation\u003C(string AccountId, decimal Amount), ApiResult\u003Cdecimal>>(\"Withdraw\", (request, state) =>\n{\n    var (accountId, amount) = request;  \u002F\u002F Destructure\n    \u002F\u002F ... logic using accountId and amount\n});\n\n\u002F\u002F Create inputs\nvar inputs = new InputSet\n{\n    spec.GetOperation\u003C(string, decimal), ApiResult\u003Cdecimal>>(\"Withdraw\")\n        .With((\"alice\", 50m), \"Withdraw 50 from alice\"),\n};\n\n\u002F\u002F Bind execution\nspec.ExecuteWith\u003CBankApiClient>()\n    .Bind\u003C(string, decimal), ApiResult\u003Cdecimal>>(\"Withdraw\",\n        (client, req) => client.Withdraw(req.Item1, req.Item2).Result);\n```\n\n## State Reset Patterns\n\n### Delete Known Entities\n\n```csharp\nvar knownIds = new[] { \"alice\", \"bob\", \"9am\", \"10am\" };\n\nvar results = await spec.RunTests(context, initialState, testCases, new TestExecutionOptions\n{\n    BeforeEachAsync = async _ =>\n    {\n        foreach (var id in knownIds)\n        {\n            try { await client.Delete(id); }\n            catch { \u002F* Ignore 404 *\u002F }\n        }\n    }\n});\n```\n\n### Recreate Test Container\n\n```csharp\nvar results = await spec.RunTests(context, initialState, testCases, new TestExecutionOptions\n{\n    BeforeEachAsync = async _ =>\n    {\n        await _testContainer.ResetAsync();\n    }\n});\n```\n\n### Unique Names Per Test Run\n\n```csharp\nvar testRunId = Guid.NewGuid().ToString(\"N\")[..8];\n\nvar inputs = new InputSet\n{\n    createOp.With($\"user-{testRunId}-1\", \"Create user 1\"),\n    createOp.With($\"user-{testRunId}-2\", \"Create user 2\"),\n};\n```\n\n## Next Steps\n\n- **Troubleshooting**: Common mistakes and debugging\n- **Test Generation**: Configure exploration and algorithms\n","# Common Patterns in Accordant\n\nThis skill covers frequently-used patterns when building Accordant specs.\n\n## Response-Dependent State\n\nWhen state depends on server-generated values (IDs, timestamps, ETags):\n\n```csharp\nspec.Operation\u003CCreateOrderRequest, ApiResult\u003COrder>>(\"CreateOrder\", (request, state) =>\n{\n    return Expect.That\u003CApiResult\u003COrder>>(\n               r => r.IsSuccess && !string.IsNullOrEmpty(r.Data.OrderId))\n           .ThenState\u003CAppState>(\n               \u002F\u002F Lambda receives response AND a pre-cloned nextState\n               (ApiResult\u003COrder> response, AppState nextState) =>\n                   nextState.Orders[response.Data.OrderId] = new OrderState\n                   {\n                       Product = request.Product,\n                       Status = OrderStatus.Created\n                   },\n               \u002F\u002F Mock for test generation (no real system running)\n               mock: () => new ApiResult\u003COrder>\n               {\n                   Data = new Order \n                   { \n                       OrderId = Guid.NewGuid().ToString(),\n                       Product = request.Product \n                   },\n                   StatusCode = 201\n               });\n});\n```\n\n### Why the Mock?\n\nDuring **test generation**, there's no real server. The mock provides a plausible response so Accordant can explore the state space. At **test execution**, the mock is ignored — real responses are used.\n\n### Validating Captured Values\n\n```csharp\nspec.Operation\u003Cstring, ApiResult\u003COrder>>(\"GetOrder\", (orderId, state) =>\n{\n    if (!state.Orders.TryGetValue(orderId, out var order))\n        return Expect.That\u003CApiResult\u003COrder>>(r => r.IsNotFound).SameState();\n\n    \u002F\u002F Validate against captured state\n    return Expect.That\u003CApiResult\u003COrder>>(\n               r => r.IsSuccess && \n                    r.Data.OrderId == orderId &&\n                    r.Data.Product == order.Product &&\n                    r.Data.Status == order.Status)\n           .SameState();\n});\n```\n\n## Request Derivations\n\nWhen one operation's request needs data from another operation's response:\n\n```csharp\n\u002F\u002F CreateTodo returns a server-generated TodoId\n\u002F\u002F GetTodo needs that TodoId\n\nspec.ConfigureDerivations(\"GetTodo\",\n    Derive.From\u003CCreateTodoRequest, CreateTodoResponse, string>(\"CreateTodo\")\n        .When((createReq, createResp) => createResp.IsSuccess)\n        .As((createReq, createResp) => createResp.TodoId));\n```\n\n### When You DON'T Need Derivations\n\nIf the client controls all IDs (not server-generated), no derivation needed:\n\n```csharp\n\u002F\u002F Client picks the key\nawait api.CreateItem(\"my-key\", \"my-value\");\nawait api.GetItem(\"my-key\");  \u002F\u002F No derivation needed - we know the key\n```\n\nDerivations are only needed when you must extract values from responses.\n\n## HTTP API Integration\n\n### ApiResult\u003CT> Pattern\n\nA common pattern for HTTP responses:\n\n```csharp\npublic class ApiResult\u003CT>\n{\n    public T? Data { get; set; }\n    public int StatusCode { get; set; }\n    \n    public bool IsSuccess => StatusCode >= 200 && StatusCode \u003C 300;\n    public bool IsNotFound => StatusCode == 404;\n    public bool IsConflict => StatusCode == 409;\n    public bool IsBadRequest => StatusCode == 400;\n}\n```\n\n### Binding HTTP Calls\n\n```csharp\nspec.ExecuteWith\u003CHttpClient>()\n    .BindAsync\u003Cstring, ApiResult\u003CUser>>(\"GetUser\", async (client, userId) =>\n    {\n        var response = await client.GetAsync($\"\u002Fapi\u002Fusers\u002F{userId}\");\n        return new ApiResult\u003CUser>\n        {\n            StatusCode = (int)response.StatusCode,\n            Data = response.IsSuccessStatusCode \n                ? await response.Content.ReadFromJsonAsync\u003CUser>()\n                : null\n        };\n    });\n```\n\n### Using a Typed Client\n\n```csharp\npublic class BankApiClient\n{\n    private readonly HttpClient _client;\n    \n    public async Task\u003CApiResult\u003Cdecimal>> CreateAccount(string accountId)\n    {\n        var response = await _client.PutAsync($\"\u002Faccounts\u002F{accountId}\", null);\n        return await ParseResponse\u003Cdecimal>(response);\n    }\n    \n    public async Task\u003CApiResult\u003Cdecimal>> Withdraw(string accountId, decimal amount)\n    {\n        var content = JsonContent.Create(new { amount });\n        var response = await _client.PostAsync($\"\u002Faccounts\u002F{accountId}\u002Fwithdraw\", content);\n        return await ParseResponse\u003Cdecimal>(response);\n    }\n}\n\n\u002F\u002F Bind\nspec.ExecuteWith\u003CBankApiClient>()\n    .Bind\u003Cstring, ApiResult\u003Cdecimal>>(\"CreateAccount\", (c, id) => c.CreateAccount(id).Result)\n    .Bind\u003C(string, decimal), ApiResult\u003Cdecimal>>(\"Withdraw\", (c, r) => c.Withdraw(r.Item1, r.Item2).Result);\n```\n\n## Error Handling Patterns\n\n### Status Code Errors\n\n```csharp\nspec.Operation\u003Cstring, ApiResult\u003CUser>>(\"GetUser\", (userId, state) =>\n{\n    if (!state.Users.ContainsKey(userId))\n        return Expect.That\u003CApiResult\u003CUser>>(r => r.IsNotFound, \"User not found\").SameState();\n\n    var user = state.Users[userId];\n    return Expect.That\u003CApiResult\u003CUser>>(r => r.IsSuccess && r.Data.Name == user.Name).SameState();\n});\n```\n\n### Exception Throwing\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    return Expect.That\u003CUnit>(r => true)\n           .ThenState\u003CAppState>(s => s.Users.Remove(userId));\n});\n```\n\n### Multiple Error Conditions\n\n```csharp\nspec.Operation\u003CTransferRequest, ApiResult\u003Cdecimal>>(\"Transfer\", (req, state) =>\n{\n    \u002F\u002F Check each error condition\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    if (state.Accounts[req.FromAccount] \u003C req.Amount)\n        return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsBadRequest, \"Insufficient funds\").SameState();\n\n    \u002F\u002F Success path\n    var newBalance = state.Accounts[req.FromAccount] - req.Amount;\n    return Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsSuccess && r.Data == newBalance)\n           .ThenState\u003CAppState>(s => {\n               s.Accounts[req.FromAccount] = newBalance;\n               s.Accounts[req.ToAccount] += req.Amount;\n           });\n});\n```\n\n## Indefinite Failures (Network Uncertainty)\n\nWhen you can't tell if an operation succeeded (timeout, network error):\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 never reached server\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsTimeout)\n              .SameState(),\n              \n        \u002F\u002F Timeout - server processed it, response lost\n        Expect.That\u003CApiResult\u003Cdecimal>>(r => r.IsTimeout)\n              .ThenState\u003CBankState>(s => s.Accounts[accountId] = 0)\n    );\n});\n```\n\nBoth timeout outcomes are valid — you don't know which actually happened until you check.\n\n## Validation Helpers\n\n### Using FluentAssertions\n\n```csharp\nExpect.That\u003CUser>(response =>\n{\n    try\n    {\n        response.Should().BeEquivalentTo(expectedUser, options => options\n            .Excluding(x => x.CreatedAt)\n            .Excluding(x => x.UpdatedAt));\n        return ValidationResult.Valid();\n    }\n    catch (Exception ex)\n    {\n        return ValidationResult.Invalid(ex.Message);\n    }\n})\n```\n\n### Custom Validation Logic\n\n```csharp\nExpect.That\u003COrderResponse>(response =>\n{\n    var errors = new List\u003Cstring>();\n    \n    if (response.OrderId == null)\n        errors.Add(\"OrderId was null\");\n    if (response.Items.Count != expectedCount)\n        errors.Add($\"Expected {expectedCount} items, got {response.Items.Count}\");\n    if (response.Total != expectedTotal)\n        errors.Add($\"Expected total {expectedTotal}, got {response.Total}\");\n    \n    return errors.Count == 0 \n        ? ValidationResult.Valid()\n        : ValidationResult.Invalid(string.Join(\"; \", errors));\n})\n```\n\n## Tuple Requests\n\nFor operations with multiple parameters:\n\n```csharp\n\u002F\u002F Define with tuple\nspec.Operation\u003C(string AccountId, decimal Amount), ApiResult\u003Cdecimal>>(\"Withdraw\", (request, state) =>\n{\n    var (accountId, amount) = request;  \u002F\u002F Destructure\n    \u002F\u002F ... logic using accountId and amount\n});\n\n\u002F\u002F Create inputs\nvar inputs = new InputSet\n{\n    spec.GetOperation\u003C(string, decimal), ApiResult\u003Cdecimal>>(\"Withdraw\")\n        .With((\"alice\", 50m), \"Withdraw 50 from alice\"),\n};\n\n\u002F\u002F Bind execution\nspec.ExecuteWith\u003CBankApiClient>()\n    .Bind\u003C(string, decimal), ApiResult\u003Cdecimal>>(\"Withdraw\",\n        (client, req) => client.Withdraw(req.Item1, req.Item2).Result);\n```\n\n## State Reset Patterns\n\n### Delete Known Entities\n\n```csharp\nvar knownIds = new[] { \"alice\", \"bob\", \"9am\", \"10am\" };\n\nvar results = await spec.RunTests(context, initialState, testCases, new TestExecutionOptions\n{\n    BeforeEachAsync = async _ =>\n    {\n        foreach (var id in knownIds)\n        {\n            try { await client.Delete(id); }\n            catch { \u002F* Ignore 404 *\u002F }\n        }\n    }\n});\n```\n\n### Recreate Test Container\n\n```csharp\nvar results = await spec.RunTests(context, initialState, testCases, new TestExecutionOptions\n{\n    BeforeEachAsync = async _ =>\n    {\n        await _testContainer.ResetAsync();\n    }\n});\n```\n\n### Unique Names Per Test Run\n\n```csharp\nvar testRunId = Guid.NewGuid().ToString(\"N\")[..8];\n\nvar inputs = new InputSet\n{\n    createOp.With($\"user-{testRunId}-1\", \"Create user 1\"),\n    createOp.With($\"user-{testRunId}-2\", \"Create user 2\"),\n};\n```\n\n## Next Steps\n\n- **Troubleshooting**: Common mistakes and debugging\n- **Test Generation**: Configure exploration and algorithms\n",{"name":5,"description":7},"main","30a1dced713d0af39440662464a975471e5fd779","agent\u002Fskills\u002Fpatterns",9,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant","https:\u002F\u002Fmicrosoft.github.io\u002Faccordant\u002F","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-10 01:14:01",{"source":8,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add microsoft\u002Faccordant --skill accordant-patterns",{"tool":47,"command":48},"bunx","bunx skills add microsoft\u002Faccordant --skill accordant-patterns",{"tool":50,"command":51},"pnpm","pnpm dlx skills add microsoft\u002Faccordant --skill accordant-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fpatterns\u002FSKILL.md",true,[],[56,66,77,89,99,110],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":63,"publishedAt":26},"01M69B8EEMW9QSCV3XPKH2D3T5","accordant-troubleshooting","Common mistakes and debugging tips for Accordant specs - use this skill when tests fail unexpectedly or specs don't behave as expected","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Ftroubleshooting\u002FSKILL.md",[62],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[64,65],"accordant troubleshooting","debugging",{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":73,"publishedAt":26},"01M69B8CHNWRMFG91HS42KMCA8","accordant-test-generation","How Accordant generates and runs tests - use this skill when configuring test generation, understanding state graphs, or running tests","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Ftest-generation\u002FSKILL.md",[72],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[74,75,76],"test","test generation","accordant test generation",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":86,"publishedAt":26},"01M69B8A48NGKWDXWKE5WWJ0H6","accordant-state","How to design state models in Accordant - use this skill when defining what your system tracks between operations","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fstate\u002FSKILL.md",[83],{"categoryNo":84,"categoryName":85,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",[87,88],"accordant state","design",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":96,"publishedAt":26},"01M69B87PRB888TD55KQC8N9QY","accordant-quickref","Quick reference and cheatsheet for Accordant API - use this skill for quick syntax lookup or code snippets","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fquickref\u002FSKILL.md",[95],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[97,98],"accordant quickref","quick reference",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":106,"publishedAt":26},"01M69B830ASD0T86FZQ2SNXWKF","accordant-overview","What Accordant is, when to use model-based testing, and core concepts - use this skill when starting with Accordant or explaining its purpose","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Foverview\u002FSKILL.md",[105],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[107,108,109],"accordant overview","testing","core",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":26},"01M69B80P9WNY5RS0EGKH0HM89","accordant-operations","How to define operations with Apply and Execute methods - use this skill when creating spec operations or understanding the Apply\u002FExecute pattern","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Foperations\u002FSKILL.md",[],[117,118],"accordant operations","spec"]