From sprint-ado
Converts Azure DevOps work item tags, area path segments, work item type, and description keywords into weighted domain routing signals for each InternalTicket. Reads labelMappings from .sprint-agent.json (same key as sprint-jira's label-classifier). Populates the domainSignals array on each ticket before domain-router runs.
How this skill is triggered — by the user, by Claude, or both
Slash command
/sprint-ado:tag-classifierThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Annotates each `InternalTicket` with domain routing signals by scoring tags, area path segments, work item type, and description keywords against the configured `labelMappings`. Runs after `workitem-normalizer`, before `domain-router`.
Annotates each InternalTicket with domain routing signals by scoring tags, area path segments, work item type, and description keywords against the configured labelMappings. Runs after workitem-normalizer, before domain-router.
Uses the same labelMappings configuration key as the sprint-jira label-classifier. ADO teams can reuse the existing mapping block unchanged or override per-domain.
{
"backend": ["api", "server", "service", "csharp", "golang", "java", "nodejs"],
"frontend": ["ui", "react", "angular", "component", "page", "prismatic", "design-system"],
"database": ["db", "schema", "migration", "query", "postgres", "sql", "mongo", "cosmos"],
"devops": ["ci", "cd", "pipeline", "docker", "infra", "kubernetes", "terraform"],
"security": ["security", "auth", "cve", "vulnerability", "sast", "snyk", "sonarqube"]
}
Custom mappings from .sprint-agent.json labelMappings block override these defaults using section-level replacement (a domain key in custom mappings fully replaces that domain's defaults).
For each ticket, score each domain as follows:
| Signal source | Score contribution per match |
|---|---|
Tag (from labels array) matches a domain keyword | +0.4 |
Area path segment (from components array) matches a domain keyword | +0.3 |
| Work item type keyword matches a domain (see table below) | +0.2 |
| Description keyword matches a domain keyword | +0.1 |
All comparisons are case-insensitive. Scores are capped at 1.0 per domain. A ticket may have signals for multiple domains (multi-domain ticket).
| Work item type (case-insensitive contains) | Domain signal |
|---|---|
"infrastructure", "pipeline", "release", "deployment" | devops |
"bug" AND (title or description contains "security", "vulnerability", "cve", "auth", "injection", "xss", "csrf") | security |
"database", "migration", "schema" | database |
"user story" AND (title contains "ui", "component", "page", "screen", "design", "layout", "react", "angular", "prismatic") | frontend |
"user story" AND (title contains "api", "endpoint", "service", "backend", "server", "integration") | backend |
"task" | No type signal — scored from tags/components/description only |
For "bug" without security keywords: +0.1 on the domain with the highest existing signal from tags/components, or no type signal if no other signals are present.
Mutates each InternalTicket to populate domainSignals:
{
"id": "4721",
"domainSignals": [
{ "domain": "backend", "score": 0.7 },
{ "domain": "security", "score": 0.4 }
]
}
Returns the full annotated InternalTicket[] array. Tickets with no signals above 0.0 will have an empty domainSignals array and will be flagged by domain-router as low-confidence.
npx claudepluginhub gagandeepp/software-agent-teams --plugin sprint-adoGuides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Enforces test-driven development: write failing test first, then minimal code to pass. Use when implementing features or bugfixes.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.