That’s determined automatically by the agent and the harness. Certain skills trigger on their own depending on the context and what the agent is doing.
For example, I have a '$rest-api-design' skill that acts as a guardrail whenever work involves the REST API. That same skill gets used at multiple stages of the process: when writing the ticket, when designing the feature, during implementation, and again as part of the final review.
A typical workflow might start with a meeting with a stakeholder. The meeting transcript becomes part of the context, and I have a skill that can pull that meeting directly into the harness. I may also provide some additional context about the feature that was not captured in the meeting and ask the agent to write the feature request.
From there, the agent may trigger other skills automatically. One of those gives it access to the project's .NET library. This is a full compiled .NET library, not just a collection of scripts. Since PowerShell itself runs on .NET, the harness can load the library DLLs directly into the shell and invoke their types and methods interactively. In practice, that lets the agent use the library almost like a CLI without me having to build a separate command-line interface for every operation.
That is useful because the agent can call into the same underlying code and abstractions that the application uses. It can use that capability to verify claims made in the meeting transcript or in my prompt, inspect existing behavior, query underlying systems, validate assumptions, retrieve data, or even put together a small proof of concept before it writes the ticket.
Once it has enough confidence in what is being requested and how the system currently behaves, it produces a Jira ticket for me to review. If I am satisfied with it, it can submit the ticket to Jira.
At a later point, I can pull that same Jira ticket back into the harness and ask the agent to implement it. All of the context captured in the ticket comes with it. At that point, the '$rest-api-design' skill triggers again and acts as a guardrail during implementation.
While it is writing the code, it also knows to call another skill I wrote called '$simplify'. That skill encodes a lot of my preferences around code structure, simplicity, readability, and style, so it further constrains how the implementation is produced.
Once the agent believes the work is complete, I can deploy it to test and go through the normal testing process. If everything looks good there, I run the implementation through a review process. That review invokes many of those same skills again to verify that the code follows the architectural, API design, and implementation constraints I have defined. By the end of that process, I usually have something I am pretty comfortable with.
Getting to this point took a lot of time and iteration. I have spent a significant amount of effort refining the skills, the 'AGENTS.md' instructions, the tooling available to the agent, and the context it can access. It also helps considerably that I have deep domain knowledge of the codebase because I built it from the ground up.
The system is not perfect, and I do not expect it to be. When I notice that the agent did something strange or violated one of the constraints, I usually go back and ask it something like, "Why did you do X, and why didn’t skill Y prevent it?"
It can usually give me a useful explanation of how it arrived at that decision and why the existing guardrail did not catch it. If I agree with that reasoning, I update the skill, the instructions, or the guardrail to cover that edge case.
So the process is iterative. When something gets through that I do not like I try to understand why the system allowed it to happen and then improve the harness so that the same class of problem is less likely to happen again. Over time, those failures effectively become new constraints and additional institutional knowledge encoded into the system.
That’s determined automatically by the agent and the harness. Certain skills trigger on their own depending on the context and what the agent is doing.
For example, I have a '$rest-api-design' skill that acts as a guardrail whenever work involves the REST API. That same skill gets used at multiple stages of the process: when writing the ticket, when designing the feature, during implementation, and again as part of the final review.
A typical workflow might start with a meeting with a stakeholder. The meeting transcript becomes part of the context, and I have a skill that can pull that meeting directly into the harness. I may also provide some additional context about the feature that was not captured in the meeting and ask the agent to write the feature request.
From there, the agent may trigger other skills automatically. One of those gives it access to the project's .NET library. This is a full compiled .NET library, not just a collection of scripts. Since PowerShell itself runs on .NET, the harness can load the library DLLs directly into the shell and invoke their types and methods interactively. In practice, that lets the agent use the library almost like a CLI without me having to build a separate command-line interface for every operation.
That is useful because the agent can call into the same underlying code and abstractions that the application uses. It can use that capability to verify claims made in the meeting transcript or in my prompt, inspect existing behavior, query underlying systems, validate assumptions, retrieve data, or even put together a small proof of concept before it writes the ticket.
Once it has enough confidence in what is being requested and how the system currently behaves, it produces a Jira ticket for me to review. If I am satisfied with it, it can submit the ticket to Jira.
At a later point, I can pull that same Jira ticket back into the harness and ask the agent to implement it. All of the context captured in the ticket comes with it. At that point, the '$rest-api-design' skill triggers again and acts as a guardrail during implementation.
While it is writing the code, it also knows to call another skill I wrote called '$simplify'. That skill encodes a lot of my preferences around code structure, simplicity, readability, and style, so it further constrains how the implementation is produced.
Once the agent believes the work is complete, I can deploy it to test and go through the normal testing process. If everything looks good there, I run the implementation through a review process. That review invokes many of those same skills again to verify that the code follows the architectural, API design, and implementation constraints I have defined. By the end of that process, I usually have something I am pretty comfortable with.
Getting to this point took a lot of time and iteration. I have spent a significant amount of effort refining the skills, the 'AGENTS.md' instructions, the tooling available to the agent, and the context it can access. It also helps considerably that I have deep domain knowledge of the codebase because I built it from the ground up.
The system is not perfect, and I do not expect it to be. When I notice that the agent did something strange or violated one of the constraints, I usually go back and ask it something like, "Why did you do X, and why didn’t skill Y prevent it?"
It can usually give me a useful explanation of how it arrived at that decision and why the existing guardrail did not catch it. If I agree with that reasoning, I update the skill, the instructions, or the guardrail to cover that edge case.
So the process is iterative. When something gets through that I do not like I try to understand why the system allowed it to happen and then improve the harness so that the same class of problem is less likely to happen again. Over time, those failures effectively become new constraints and additional institutional knowledge encoded into the system.
P.S. I apologize for the wall of text.