ci(sdlc): add agent dispatch harness, disabled by default - #4163
Open
dearsimanovich-epam wants to merge 3 commits into
Open
dearsimanovich-epam wants to merge 3 commits into
dearsimanovich-epam wants to merge 3 commits into
Conversation
dearsimanovich-epam
requested review from
NastassiaKryshtal,
PolinaGurinovich97,
alexey-ban and
ya092
as code owners
August 12, 2026 07:43
Infrastructure for running local skills as PR gates, ported from ai-dial-chat. The design is a manifest plus a skill reference: `agents/<name>/agent.yml` names a local skill and a tool allowlist, match-agents.py discovers the manifests matching the caller's event, and one matrix runs them with per-agent `needs:` waits rather than round barriers. No per-agent prompt. **Nothing runs on merge.** The only real manifest ships as `agents/_code-review/`, and the underscore prefix is how the dispatcher skips it — verified locally, the dispatcher matches zero agents. That keeps this PR independent of the skills it would invoke, and makes activation a deliberate one-line rename with the prerequisites listed in the file. Adaptations from the source repo: trigger branches retargeted to `development`, SARIF `informationUri` pointed at this repo, and `dispatch-schedule.yml` deliberately omitted — it would run a daily cron matching zero agents, since the Snyk/Jira agent family it existed for is not ported. Verified locally: every workflow and action parses, all internal `uses: ./` refs resolve, all seven Python scripts compile, match-agents.py schema-validates the manifest and honours the STAGE_CODE_REVIEW_ENABLED kill switch. Ops setup is required before anything can dispatch: the DIAL_API_KEY secret, DIAL_CORE_URL / DIAL_ROUTE_PATH vars, a security-review environment, and presence on the default branch — GitHub registers schedule and workflow_dispatch triggers only from there. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
dearsimanovich-epam
force-pushed
the
feat/port-agent-tooling
branch
from
August 12, 2026 08:03
1af03ca to
eeb3803
Compare
PolinaGurinovich97
approved these changes
Aug 12, 2026
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description:
Infrastructure for running local skills as PR gates, ported from
ai-dial-chat. Nothing runs whenthis merges — the one real agent manifest ships disabled, so this PR is independent of the skills it
would eventually invoke.
Issues:
Design
An agent is a manifest plus a skill reference — there is no per-agent prompt.
agents/<name>/agent.ymlnames a local skill and a tool allowlist;
match-agents.pydiscovers the manifests matching the caller'sevent and validates each against a JSON schema; one matrix runs them all with per-agent
needs:waits,so a dependent starts when its upstream finishes rather than when a whole round does.
This means the reviewer logic lives in the same skill you invoke locally — CI and local review can't
drift apart.
dispatch-pr.ymldevelopment)dispatch-core.ymlrun-agent.ymlactions/pr-trust-gateactions/run-claude-stageclaude/scripts/*.pyclaude/schemas/*.jsonDisabled on arrival
The only real manifest ships as
agents/_code-review/. The underscore prefix is the harness's ownmechanism for a manifest the dispatcher skips —
match-agents.pyglobsagents/*/agent.ymland ignoresunderscore-prefixed directories. Verified locally: with this tree, the dispatcher matches zero agents.
Activation is a deliberate one-line rename, with prerequisites documented in the file itself:
…once the
code-review-and-qualityskill exists (#4166), the DIAL secret/vars are set, and this is onthe default branch.
Adaptations from the source repo
development-1.0→development.informationUripointed at this repository.dispatch-schedule.ymldeliberately not ported — it would run a daily cron matching zero agents,since the Snyk/Jira agent family it exists for is not ported. Worth adding when a scheduled agent does.
filter with its own secret, one is a fixture whose planted findings reference
apps/chat-apipaths,and one embeds a hardcoded NestJS/React/Express stack filter.
Verification
All local, since nothing can dispatch until this is on the default branch:
uses: ./…refs resolvematch-agents.pyschema-validates the manifest, skips_template, honours theSTAGE_CODE_REVIEW_ENABLEDkill switch, and matches zero agents in the shipped (disabled) stateThe harness also already proved itself on this PR's earlier revision: the trust gate ran and
correctly rejected it —
Ops setup required before anything dispatches
DIAL_API_KEY; varsDIAL_CORE_URL,DIAL_ROUTE_PATH, optionallyDIAL_MODEL.security-reviewGitHub environment (forclaude-security-review.yml, which is label-gated).schedule/workflow_dispatchonly from there.Known consequence worth a decision
pr-trust-gaterejects any PR that touches.claude/**,.github/workflows/**,agents/**, or addsa symlink. Since adding a rule in this repo requires adding a mirror symlink, every future agent-config
PR will get no agent review. That's the correct posture for a prompt-injection vector, but it's worth
choosing deliberately:
dispatch-core.ymlcarries commented-outtrust_labelsupport to opt back inwith a maintainer-applied label.
Breaking Changes: none — no workflow does anything until an agent is enabled and secrets exist.
Checklist:
(Issue #<TICKET_ID>)— no tracking issue for this work