[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69B7SAM3K1X49PTW781MQ1T":3,"skill-same:01M69B7SAM3K1X49PTW781MQ1T":56},{"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":27,"linkOnly":28,"markdownContent":29,"markdownBody":30,"frontMatter":31,"refName":32,"commitSha":33,"skillDirectory":34,"forksCount":35,"repositoryHtmlUrl":36,"repositoryHomepageUrl":37,"ownerHtmlUrl":38,"ownerBlogUrl":39,"ownerDescription":40,"updatedAt":41,"install":42,"resources":55},"01M69B7SAM3K1X49PTW781MQ1T","accordant-async-operations",null,"How to model background work, step functions, and polling - use this skill when testing async workflows, job queues, or operations that complete in the background","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\u002Fasync-operations\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26],"accordant async operations","testing","workflows","2026-11-10 10:12:30",false,"---\nname: accordant-async-operations\ndescription: How to model background work, step functions, and polling - use this skill when testing async workflows, job queues, or operations that complete in the background\n---\n\n# Async Operations in Accordant\n\nSome operations don't complete when the API call returns. You call an endpoint, it returns \"Pending,\" and background work finishes later. Accordant models this with **step functions** and handles testing with **polling**.\n\n## The Pattern\n\n1. API returns immediately (status: Pending)\n2. Background work happens asynchronously\n3. Later API calls observe the completed state\n\n```\nPUT \u002Fapi\u002Fjobs\u002Fjob123 → { status: \"Pending\" }\n\u002F\u002F ... background processing ...\nGET \u002Fapi\u002Fjobs\u002Fjob123 → { status: \"Completed\" }\n```\n\n## Modeling Background Work\n\nUse `.Triggers()` with `AsyncOperation.Create`:\n\n```csharp\n[State]\npublic partial class JobQueueState\n{\n    public Dictionary\u003Cstring, JobStatus> Jobs { get; set; } = new();\n}\n\npublic enum JobStatus { Pending, Completed, Failed }\n\nspec.Operation\u003Cstring, ApiResult\u003CJob>>(\"CreateJob\", (jobId, state) =>\n{\n    if (state.Jobs.ContainsKey(jobId))\n        return Expect.That\u003CApiResult\u003CJob>>(r => r.IsConflict).SameState();\n\n    return Expect.That\u003CApiResult\u003CJob>>(r => r.IsSuccess && r.Data.Status == JobStatus.Pending)\n           .ThenState\u003CJobQueueState>(next => next.Jobs[jobId] = JobStatus.Pending)\n           .Triggers(AsyncOperation.Create\u003CJobQueueState>(\n               isTerminal: s => s.Jobs[jobId] != JobStatus.Pending,\n               transitions: new Action\u003CJobQueueState>[] {\n                   next => next.Jobs[jobId] = JobStatus.Completed,\n                   next => next.Jobs[jobId] = JobStatus.Failed\n               }\n           ));\n});\n```\n\n### Key Parameters\n\n- **`isTerminal`**: Predicate returning true when background work is done\n- **`transitions`**: Array of possible outcomes (non-determinism — job could complete or fail)\n\n## How State Tracking Works\n\nAfter `CreateJob` returns, the system could be in **either** state:\n- `Jobs[\"job123\"] = Pending` (still processing)\n- `Jobs[\"job123\"] = Completed` (already done)\n- `Jobs[\"job123\"] = Failed` (already failed)\n\nAccordant tracks **all possibilities** until you observe a response that narrows it down.\n\n### Observation Narrows Down State\n\n```csharp\nspec.Operation\u003Cstring, ApiResult\u003CJob>>(\"GetJob\", (jobId, state) =>\n{\n    if (!state.Jobs.TryGetValue(jobId, out var status))\n        return Expect.That\u003CApiResult\u003CJob>>(r => r.IsNotFound).SameState();\n\n    return Expect.That\u003CApiResult\u003CJob>>(r => r.IsSuccess && r.Data.Status == status)\n           .SameState();\n});\n```\n\nWhen GetJob returns `{ status: \"Completed\" }`:\n- States where status = Pending → Eliminated (doesn't match)\n- States where status = Completed → Kept (matches!)\n- States where status = Failed → Eliminated (doesn't match)\n\n## Setting Up Polling\n\nFor test execution, configure polling to wait for background work:\n\n### Using PollingSetup\n\n```csharp\npublic class CreateJobOperation : Operation\u003Cstring, ApiResult\u003CJob>, JobQueueState>\n{\n    public override PollingSetup Polling => new PollingSetup\n    {\n        Operation = \"GetJob\",      \u002F\u002F Which operation to poll\n        WaitTimeInMs = 100,        \u002F\u002F Delay between polls\n        MaxRetryCount = 100        \u002F\u002F Maximum attempts (liveness check)\n    };\n    \n    public override ExpectedOutcomes Apply(string jobId, JobQueueState state)\n    {\n        \u002F\u002F ... Apply logic with .Triggers() ...\n    }\n}\n```\n\n### How Polling Works\n\n1. Execute `CreateJob` → Returns Pending\n2. Wait `WaitTimeInMs`\n3. Execute `GetJob` → Check if terminal\n4. If not terminal, repeat from step 2\n5. If terminal, continue to next operation\n6. If `MaxRetryCount` exceeded → Liveness failure\n\n## Liveness Testing\n\n`MaxRetryCount` acts as a liveness check. If background work never completes:\n\n```\nLiveness violation: job still Pending after 100 retries\n```\n\nThis catches \"stuck\" systems — a job that stays Pending forever is wrong, even if no individual response violates the spec.\n\n## Manual Polling\n\nIf writing tests manually instead of using `spec.RunTests()`:\n\n```csharp\nvar stateProfile = new StateProfile(new JobQueueState());\n\n\u002F\u002F Execute CreateJob\nvar createResponse = await client.CreateJob(\"job123\");\n(bool isValid, string message, stateProfile) = \n    spec.Allows(spec.GetOperation(\"CreateJob\"), \"job123\", createResponse, stateProfile);\nAssert.IsTrue(isValid, message);\n\n\u002F\u002F Poll until complete\nfor (int i = 0; i \u003C 100; i++)\n{\n    await Task.Delay(100);\n    var getResponse = await client.GetJob(\"job123\");\n    (isValid, message, stateProfile) = \n        spec.Allows(spec.GetOperation(\"GetJob\"), \"job123\", getResponse, stateProfile);\n    Assert.IsTrue(isValid, message);\n    \n    \u002F\u002F Check if all possible states are terminal\n    bool allTerminal = stateProfile.StatesAndStepFunctions\n        .All(ssf => ((JobQueueState)ssf.State).Jobs[\"job123\"] != JobStatus.Pending);\n    \n    if (allTerminal) break;\n}\n```\n\n## Single Transition (Simpler Case)\n\nWhen only one outcome is possible:\n\n```csharp\n.Triggers(AsyncOperation.Create\u003CJobQueueState>(\n    isTerminal: s => s.Jobs[jobId] == JobStatus.Completed,\n    transition: next => next.Jobs[jobId] = JobStatus.Completed  \u002F\u002F Single transition\n))\n```\n\n## Multiple Possible Outcomes\n\nWhen background work can end in different states:\n\n```csharp\n.Triggers(AsyncOperation.Create\u003CJobQueueState>(\n    isTerminal: s => s.Jobs[jobId] != JobStatus.Pending,\n    transitions: new Action\u003CJobQueueState>[] {\n        next => next.Jobs[jobId] = JobStatus.Completed,   \u002F\u002F Success\n        next => next.Jobs[jobId] = JobStatus.Failed,      \u002F\u002F Failure\n        next => next.Jobs[jobId] = JobStatus.Cancelled    \u002F\u002F Cancelled\n    }\n))\n```\n\nAll three outcomes are valid until observation tells us which actually occurred.\n\n## Complete Example: Job Queue\n\n```csharp\n[State]\npublic partial class JobQueueState\n{\n    public Dictionary\u003Cstring, JobInfo> Jobs { get; set; } = new();\n}\n\n[State]\npublic partial class JobInfo\n{\n    public JobStatus Status { get; set; }\n    public string? Result { get; set; }\n}\n\npublic enum JobStatus { Pending, Running, Completed, Failed }\n\nvar spec = new Spec\u003CJobQueueState>();\n\n\u002F\u002F Create Job - triggers background processing\nspec.Operation\u003CCreateJobRequest, ApiResult\u003CJob>>(\"CreateJob\", (request, state) =>\n{\n    if (state.Jobs.ContainsKey(request.JobId))\n        return Expect.That\u003CApiResult\u003CJob>>(r => r.IsConflict).SameState();\n\n    return Expect.That\u003CApiResult\u003CJob>>(r => r.IsSuccess && r.Data.Status == JobStatus.Pending)\n           .ThenState\u003CJobQueueState>(next => next.Jobs[request.JobId] = new JobInfo \n           { \n               Status = JobStatus.Pending \n           })\n           .Triggers(AsyncOperation.Create\u003CJobQueueState>(\n               isTerminal: s => s.Jobs[request.JobId].Status != JobStatus.Pending,\n               transitions: new Action\u003CJobQueueState>[] {\n                   next => next.Jobs[request.JobId] = new JobInfo \n                   { \n                       Status = JobStatus.Completed, \n                       Result = \"Success\" \n                   },\n                   next => next.Jobs[request.JobId] = new JobInfo \n                   { \n                       Status = JobStatus.Failed, \n                       Result = \"Error occurred\" \n                   }\n               }\n           ));\n});\n\n\u002F\u002F Get Job - observes current state\nspec.Operation\u003Cstring, ApiResult\u003CJob>>(\"GetJob\", (jobId, state) =>\n{\n    if (!state.Jobs.TryGetValue(jobId, out var job))\n        return Expect.That\u003CApiResult\u003CJob>>(r => r.IsNotFound).SameState();\n\n    return Expect.That\u003CApiResult\u003CJob>>(\n               r => r.IsSuccess && \n                    r.Data.Status == job.Status && \n                    r.Data.Result == job.Result)\n           .SameState();\n});\n```\n\n## Common Patterns\n\n### Polling Until Specific State\n\n```csharp\n\u002F\u002F Wait for Completed specifically\nfor (int i = 0; i \u003C maxRetries; i++)\n{\n    var response = await client.GetJob(jobId);\n    if (response.Data.Status == JobStatus.Completed)\n        break;\n    if (response.Data.Status == JobStatus.Failed)\n        throw new Exception($\"Job failed: {response.Data.Error}\");\n    await Task.Delay(pollInterval);\n}\n```\n\n### Timeout with Validation\n\n```csharp\nvar timeout = TimeSpan.FromSeconds(30);\nvar start = DateTime.UtcNow;\n\nwhile (DateTime.UtcNow - start \u003C timeout)\n{\n    var response = await client.GetJob(jobId);\n    spec.Allows(getJobOp, jobId, response, stateProfile);\n    \n    if (IsTerminal(response))\n        return response;\n    \n    await Task.Delay(100);\n}\nthrow new TimeoutException(\"Job did not complete\");\n```\n\n## Best Practices\n\n1. **Keep isTerminal simple**: Should be a quick check on state\n2. **Cover all outcomes**: Include both success and failure transitions\n3. **Set reasonable poll intervals**: Not too fast (hammers API), not too slow (slow tests)\n4. **Always set MaxRetryCount**: Prevents infinite loops on stuck jobs\n5. **Test liveness**: Ensure background work actually completes\n\n## Next Steps\n\n- **Patterns**: Response-dependent state, request derivations\n- **Troubleshooting**: Debug async test failures\n","# Async Operations in Accordant\n\nSome operations don't complete when the API call returns. You call an endpoint, it returns \"Pending,\" and background work finishes later. Accordant models this with **step functions** and handles testing with **polling**.\n\n## The Pattern\n\n1. API returns immediately (status: Pending)\n2. Background work happens asynchronously\n3. Later API calls observe the completed state\n\n```\nPUT \u002Fapi\u002Fjobs\u002Fjob123 → { status: \"Pending\" }\n\u002F\u002F ... background processing ...\nGET \u002Fapi\u002Fjobs\u002Fjob123 → { status: \"Completed\" }\n```\n\n## Modeling Background Work\n\nUse `.Triggers()` with `AsyncOperation.Create`:\n\n```csharp\n[State]\npublic partial class JobQueueState\n{\n    public Dictionary\u003Cstring, JobStatus> Jobs { get; set; } = new();\n}\n\npublic enum JobStatus { Pending, Completed, Failed }\n\nspec.Operation\u003Cstring, ApiResult\u003CJob>>(\"CreateJob\", (jobId, state) =>\n{\n    if (state.Jobs.ContainsKey(jobId))\n        return Expect.That\u003CApiResult\u003CJob>>(r => r.IsConflict).SameState();\n\n    return Expect.That\u003CApiResult\u003CJob>>(r => r.IsSuccess && r.Data.Status == JobStatus.Pending)\n           .ThenState\u003CJobQueueState>(next => next.Jobs[jobId] = JobStatus.Pending)\n           .Triggers(AsyncOperation.Create\u003CJobQueueState>(\n               isTerminal: s => s.Jobs[jobId] != JobStatus.Pending,\n               transitions: new Action\u003CJobQueueState>[] {\n                   next => next.Jobs[jobId] = JobStatus.Completed,\n                   next => next.Jobs[jobId] = JobStatus.Failed\n               }\n           ));\n});\n```\n\n### Key Parameters\n\n- **`isTerminal`**: Predicate returning true when background work is done\n- **`transitions`**: Array of possible outcomes (non-determinism — job could complete or fail)\n\n## How State Tracking Works\n\nAfter `CreateJob` returns, the system could be in **either** state:\n- `Jobs[\"job123\"] = Pending` (still processing)\n- `Jobs[\"job123\"] = Completed` (already done)\n- `Jobs[\"job123\"] = Failed` (already failed)\n\nAccordant tracks **all possibilities** until you observe a response that narrows it down.\n\n### Observation Narrows Down State\n\n```csharp\nspec.Operation\u003Cstring, ApiResult\u003CJob>>(\"GetJob\", (jobId, state) =>\n{\n    if (!state.Jobs.TryGetValue(jobId, out var status))\n        return Expect.That\u003CApiResult\u003CJob>>(r => r.IsNotFound).SameState();\n\n    return Expect.That\u003CApiResult\u003CJob>>(r => r.IsSuccess && r.Data.Status == status)\n           .SameState();\n});\n```\n\nWhen GetJob returns `{ status: \"Completed\" }`:\n- States where status = Pending → Eliminated (doesn't match)\n- States where status = Completed → Kept (matches!)\n- States where status = Failed → Eliminated (doesn't match)\n\n## Setting Up Polling\n\nFor test execution, configure polling to wait for background work:\n\n### Using PollingSetup\n\n```csharp\npublic class CreateJobOperation : Operation\u003Cstring, ApiResult\u003CJob>, JobQueueState>\n{\n    public override PollingSetup Polling => new PollingSetup\n    {\n        Operation = \"GetJob\",      \u002F\u002F Which operation to poll\n        WaitTimeInMs = 100,        \u002F\u002F Delay between polls\n        MaxRetryCount = 100        \u002F\u002F Maximum attempts (liveness check)\n    };\n    \n    public override ExpectedOutcomes Apply(string jobId, JobQueueState state)\n    {\n        \u002F\u002F ... Apply logic with .Triggers() ...\n    }\n}\n```\n\n### How Polling Works\n\n1. Execute `CreateJob` → Returns Pending\n2. Wait `WaitTimeInMs`\n3. Execute `GetJob` → Check if terminal\n4. If not terminal, repeat from step 2\n5. If terminal, continue to next operation\n6. If `MaxRetryCount` exceeded → Liveness failure\n\n## Liveness Testing\n\n`MaxRetryCount` acts as a liveness check. If background work never completes:\n\n```\nLiveness violation: job still Pending after 100 retries\n```\n\nThis catches \"stuck\" systems — a job that stays Pending forever is wrong, even if no individual response violates the spec.\n\n## Manual Polling\n\nIf writing tests manually instead of using `spec.RunTests()`:\n\n```csharp\nvar stateProfile = new StateProfile(new JobQueueState());\n\n\u002F\u002F Execute CreateJob\nvar createResponse = await client.CreateJob(\"job123\");\n(bool isValid, string message, stateProfile) = \n    spec.Allows(spec.GetOperation(\"CreateJob\"), \"job123\", createResponse, stateProfile);\nAssert.IsTrue(isValid, message);\n\n\u002F\u002F Poll until complete\nfor (int i = 0; i \u003C 100; i++)\n{\n    await Task.Delay(100);\n    var getResponse = await client.GetJob(\"job123\");\n    (isValid, message, stateProfile) = \n        spec.Allows(spec.GetOperation(\"GetJob\"), \"job123\", getResponse, stateProfile);\n    Assert.IsTrue(isValid, message);\n    \n    \u002F\u002F Check if all possible states are terminal\n    bool allTerminal = stateProfile.StatesAndStepFunctions\n        .All(ssf => ((JobQueueState)ssf.State).Jobs[\"job123\"] != JobStatus.Pending);\n    \n    if (allTerminal) break;\n}\n```\n\n## Single Transition (Simpler Case)\n\nWhen only one outcome is possible:\n\n```csharp\n.Triggers(AsyncOperation.Create\u003CJobQueueState>(\n    isTerminal: s => s.Jobs[jobId] == JobStatus.Completed,\n    transition: next => next.Jobs[jobId] = JobStatus.Completed  \u002F\u002F Single transition\n))\n```\n\n## Multiple Possible Outcomes\n\nWhen background work can end in different states:\n\n```csharp\n.Triggers(AsyncOperation.Create\u003CJobQueueState>(\n    isTerminal: s => s.Jobs[jobId] != JobStatus.Pending,\n    transitions: new Action\u003CJobQueueState>[] {\n        next => next.Jobs[jobId] = JobStatus.Completed,   \u002F\u002F Success\n        next => next.Jobs[jobId] = JobStatus.Failed,      \u002F\u002F Failure\n        next => next.Jobs[jobId] = JobStatus.Cancelled    \u002F\u002F Cancelled\n    }\n))\n```\n\nAll three outcomes are valid until observation tells us which actually occurred.\n\n## Complete Example: Job Queue\n\n```csharp\n[State]\npublic partial class JobQueueState\n{\n    public Dictionary\u003Cstring, JobInfo> Jobs { get; set; } = new();\n}\n\n[State]\npublic partial class JobInfo\n{\n    public JobStatus Status { get; set; }\n    public string? Result { get; set; }\n}\n\npublic enum JobStatus { Pending, Running, Completed, Failed }\n\nvar spec = new Spec\u003CJobQueueState>();\n\n\u002F\u002F Create Job - triggers background processing\nspec.Operation\u003CCreateJobRequest, ApiResult\u003CJob>>(\"CreateJob\", (request, state) =>\n{\n    if (state.Jobs.ContainsKey(request.JobId))\n        return Expect.That\u003CApiResult\u003CJob>>(r => r.IsConflict).SameState();\n\n    return Expect.That\u003CApiResult\u003CJob>>(r => r.IsSuccess && r.Data.Status == JobStatus.Pending)\n           .ThenState\u003CJobQueueState>(next => next.Jobs[request.JobId] = new JobInfo \n           { \n               Status = JobStatus.Pending \n           })\n           .Triggers(AsyncOperation.Create\u003CJobQueueState>(\n               isTerminal: s => s.Jobs[request.JobId].Status != JobStatus.Pending,\n               transitions: new Action\u003CJobQueueState>[] {\n                   next => next.Jobs[request.JobId] = new JobInfo \n                   { \n                       Status = JobStatus.Completed, \n                       Result = \"Success\" \n                   },\n                   next => next.Jobs[request.JobId] = new JobInfo \n                   { \n                       Status = JobStatus.Failed, \n                       Result = \"Error occurred\" \n                   }\n               }\n           ));\n});\n\n\u002F\u002F Get Job - observes current state\nspec.Operation\u003Cstring, ApiResult\u003CJob>>(\"GetJob\", (jobId, state) =>\n{\n    if (!state.Jobs.TryGetValue(jobId, out var job))\n        return Expect.That\u003CApiResult\u003CJob>>(r => r.IsNotFound).SameState();\n\n    return Expect.That\u003CApiResult\u003CJob>>(\n               r => r.IsSuccess && \n                    r.Data.Status == job.Status && \n                    r.Data.Result == job.Result)\n           .SameState();\n});\n```\n\n## Common Patterns\n\n### Polling Until Specific State\n\n```csharp\n\u002F\u002F Wait for Completed specifically\nfor (int i = 0; i \u003C maxRetries; i++)\n{\n    var response = await client.GetJob(jobId);\n    if (response.Data.Status == JobStatus.Completed)\n        break;\n    if (response.Data.Status == JobStatus.Failed)\n        throw new Exception($\"Job failed: {response.Data.Error}\");\n    await Task.Delay(pollInterval);\n}\n```\n\n### Timeout with Validation\n\n```csharp\nvar timeout = TimeSpan.FromSeconds(30);\nvar start = DateTime.UtcNow;\n\nwhile (DateTime.UtcNow - start \u003C timeout)\n{\n    var response = await client.GetJob(jobId);\n    spec.Allows(getJobOp, jobId, response, stateProfile);\n    \n    if (IsTerminal(response))\n        return response;\n    \n    await Task.Delay(100);\n}\nthrow new TimeoutException(\"Job did not complete\");\n```\n\n## Best Practices\n\n1. **Keep isTerminal simple**: Should be a quick check on state\n2. **Cover all outcomes**: Include both success and failure transitions\n3. **Set reasonable poll intervals**: Not too fast (hammers API), not too slow (slow tests)\n4. **Always set MaxRetryCount**: Prevents infinite loops on stuck jobs\n5. **Test liveness**: Ensure background work actually completes\n\n## Next Steps\n\n- **Patterns**: Response-dependent state, request derivations\n- **Troubleshooting**: Debug async test failures\n",{"name":5,"description":7},"main","30a1dced713d0af39440662464a975471e5fd779","agent\u002Fskills\u002Fasync-operations",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":43,"prompt":53,"zipAvailable":54},[44,47,50],{"tool":45,"command":46},"npx","npx skills add microsoft\u002Faccordant --skill accordant-async-operations",{"tool":48,"command":49},"bunx","bunx skills add microsoft\u002Faccordant --skill accordant-async-operations",{"tool":51,"command":52},"pnpm","pnpm dlx skills add microsoft\u002Faccordant --skill accordant-async-operations","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fasync-operations\u002FSKILL.md",true,[],[57,67,78,90,100,110],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":64,"publishedAt":27},"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",[63],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[65,66],"accordant troubleshooting","debugging",{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":74,"publishedAt":27},"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",[73],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[75,76,77],"test","test generation","accordant test generation",{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":87,"publishedAt":27},"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",[84],{"categoryNo":85,"categoryName":86,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",[88,89],"accordant state","design",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":97,"publishedAt":27},"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",[96],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[98,99],"accordant quickref","quick reference",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":107,"publishedAt":27},"01M69B85BBG2EBQJE2YFPYP88N","accordant-patterns","Common patterns in Accordant - response-dependent state, request derivations, error handling, and HTTP integration","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faccordant\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fpatterns\u002FSKILL.md",[106],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[108,109],"accordant patterns","http",{"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":117,"publishedAt":27},"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",[116],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[118,25,119],"accordant overview","core"]