fix(validate): check for [agents] instead of [agent] in HAND.toml (#15)

* fix(validate): check for [agents] instead of [agent] in HAND.toml

All 14 hands use [agents.main] (plural) for multi-agent config,
but the validator was checking for [agent] (singular), causing
all hands to fail validation.

* fix(routing): resolve 19 routing alias collisions

Agent is a sub-unit of hand, so hands take priority for routing.
Remove conflicting aliases from agent side when hand already owns them.

- analyst: remove data analysis, analyze data, dashboard (owned by hand/analytics)
- data-scientist: remove statistical analysis, forecast, prediction (owned by hand/analytics, hand/predictor)
- sales-assistant: remove prospecting, sales, pipeline (owned by hand/lead, hand/devops)
- devops-lead: remove incident response, kubernetes, terraform (owned by hand/devops)
- researcher: remove deep research, research, literature review (owned by hand/researcher)
- academic-researcher: remove literature review, systematic review (owned by hand/researcher)
- social-media: remove duplicate content calendar from weak_aliases
- hand/collector: remove competitive analysis (owned by hand/strategist)
This commit is contained in:
Evan authored and GitHub committed 2026-03-23 09:41:29 +09:00
1 parent 31776736d0
commit d778da72a2
9 files changed
+8 -17

No files matched your search

-2
View File
@@ -8,7 +8,6 @@ tags = ["research", "academic", "papers", "literature-review", "science"]
[metadata.routing] [metadata.routing]
aliases = [ aliases = [
"academic research", "academic research",
"literature review",
"paper search", "paper search",
"scholarly research", "scholarly research",
"find papers", "find papers",
@@ -17,7 +16,6 @@ weak_aliases = [
"papers", "papers",
"citations", "citations",
"bibliography", "bibliography",
"systematic review",
"meta-analysis", "meta-analysis",
] ]
+1 -3
View File
@@ -6,13 +6,11 @@ module = "builtin:chat"
[metadata.routing] [metadata.routing]
aliases = [ aliases = [
"data analysis",
"analyze data",
"analytics", "analytics",
"metrics analysis", "metrics analysis",
"report analysis", "report analysis",
] ]
weak_aliases = ["dashboard", "kpi", "insights", "reporting"] weak_aliases = ["kpi", "insights", "reporting"]
[model] [model]
provider = "default" provider = "default"
+1 -2
View File
@@ -9,10 +9,9 @@ aliases = [
"data science", "data science",
"build model", "build model",
"train model", "train model",
"statistical analysis",
"machine learning", "machine learning",
] ]
weak_aliases = ["modeling", "forecast", "prediction", "statistics"] weak_aliases = ["modeling", "statistics"]
[model] [model]
provider = "default" provider = "default"
+1 -2
View File
@@ -9,10 +9,9 @@ aliases = [
"ci cd", "ci cd",
"deployment pipeline", "deployment pipeline",
"infrastructure ops", "infrastructure ops",
"incident response",
"production operations", "production operations",
] ]
weak_aliases = ["devops", "deployment", "kubernetes", "terraform", "infra"] weak_aliases = ["devops", "deployment", "infra"]
[model] [model]
provider = "default" provider = "default"
+1 -2
View File
@@ -7,13 +7,12 @@ tags = ["research", "analysis", "web"]
[metadata.routing] [metadata.routing]
aliases = [ aliases = [
"deep research",
"web research", "web research",
"investigate topic", "investigate topic",
"gather sources", "gather sources",
"fact finding", "fact finding",
] ]
weak_aliases = ["research", "sources", "literature review", "web search"] weak_aliases = ["sources", "web search"]
[model] [model]
provider = "default" provider = "default"
+1 -2
View File
@@ -9,11 +9,10 @@ tags = ["sales", "crm", "outreach", "pipeline", "prospecting", "deals"]
aliases = [ aliases = [
"sales outreach", "sales outreach",
"crm update", "crm update",
"prospecting",
"pipeline review", "pipeline review",
"deal tracking", "deal tracking",
] ]
weak_aliases = ["sales", "crm", "pipeline", "leads"] weak_aliases = ["crm", "leads"]
[model] [model]
provider = "default" provider = "default"
+1 -1
View File
@@ -20,7 +20,7 @@ aliases = [
"engagement strategy", "engagement strategy",
"social campaign", "social campaign",
] ]
weak_aliases = ["social media", "content calendar", "engagement", "campaign"] weak_aliases = ["social media", "engagement", "campaign"]
[model] [model]
provider = "default" provider = "default"
-1
View File
@@ -33,7 +33,6 @@ aliases = [
"change detection", "change detection",
"gather info", "gather info",
"market intelligence", "market intelligence",
"competitive analysis",
] ]
weak_aliases = [ weak_aliases = [
"watch", "watch",
+2 -2
View File
@@ -162,8 +162,8 @@ def validate_hand_file(filepath: Path, integration_ids: set[str]) -> list[str]:
if category and category not in VALID_HAND_CATEGORIES: if category and category not in VALID_HAND_CATEGORIES:
errors.append(f"{rel}: Invalid category '{category}' (valid: {', '.join(sorted(VALID_HAND_CATEGORIES))})") errors.append(f"{rel}: Invalid category '{category}' (valid: {', '.join(sorted(VALID_HAND_CATEGORIES))})")
if "agent" not in data: if "agents" not in data:
errors.append(f"{rel}: Missing [agent] section") errors.append(f"{rel}: Missing [agents] section")
# Cross-reference: check that [[requires]] with requirement_type = "integration" # Cross-reference: check that [[requires]] with requirement_type = "integration"
# reference existing integration TOML files # reference existing integration TOML files