From d778da72a2ab3aa4019c9c709ca4ced4dbbe2c07 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 23 Mar 2026 09:41:29 +0900 Subject: [PATCH] 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) --- agents/academic-researcher/agent.toml | 2 -- agents/analyst/agent.toml | 4 +--- agents/data-scientist/agent.toml | 3 +-- agents/devops-lead/agent.toml | 3 +-- agents/researcher/agent.toml | 3 +-- agents/sales-assistant/agent.toml | 3 +-- agents/social-media/agent.toml | 2 +- hands/collector/HAND.toml | 1 - scripts/validate.py | 4 ++-- 9 files changed, 8 insertions(+), 17 deletions(-) diff --git a/agents/academic-researcher/agent.toml b/agents/academic-researcher/agent.toml index a02c52c..8780d30 100644 --- a/agents/academic-researcher/agent.toml +++ b/agents/academic-researcher/agent.toml @@ -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", ] diff --git a/agents/analyst/agent.toml b/agents/analyst/agent.toml index 1b0cecc..0e8ccbd 100644 --- a/agents/analyst/agent.toml +++ b/agents/analyst/agent.toml @@ -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" diff --git a/agents/data-scientist/agent.toml b/agents/data-scientist/agent.toml index 93c6d9d..6dccfea 100644 --- a/agents/data-scientist/agent.toml +++ b/agents/data-scientist/agent.toml @@ -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" diff --git a/agents/devops-lead/agent.toml b/agents/devops-lead/agent.toml index 26575ea..eee4ef8 100644 --- a/agents/devops-lead/agent.toml +++ b/agents/devops-lead/agent.toml @@ -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" diff --git a/agents/researcher/agent.toml b/agents/researcher/agent.toml index 2e982a2..3c12766 100644 --- a/agents/researcher/agent.toml +++ b/agents/researcher/agent.toml @@ -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" diff --git a/agents/sales-assistant/agent.toml b/agents/sales-assistant/agent.toml index a4d66a7..90ffc1e 100644 --- a/agents/sales-assistant/agent.toml +++ b/agents/sales-assistant/agent.toml @@ -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" diff --git a/agents/social-media/agent.toml b/agents/social-media/agent.toml index b8cf270..3729876 100644 --- a/agents/social-media/agent.toml +++ b/agents/social-media/agent.toml @@ -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" diff --git a/hands/collector/HAND.toml b/hands/collector/HAND.toml index d9eb1bc..40cfee1 100644 --- a/hands/collector/HAND.toml +++ b/hands/collector/HAND.toml @@ -33,7 +33,6 @@ aliases = [ "change detection", "gather info", "market intelligence", - "competitive analysis", ] weak_aliases = [ "watch", diff --git a/scripts/validate.py b/scripts/validate.py index 047fbb7..2137382 100755 --- a/scripts/validate.py +++ b/scripts/validate.py @@ -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