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