feat(tac): Skills Taxonomy + MCP Topology + Agent Teams TAC trees - #968
Conversation
Skills Taxonomy (skills-taxonomy.tac.yaml): - 100+ skills grouped by 15 domains - 7 FlOO$ dependency chains with agents and NATS subjects - Data sources: skill-pairings.yaml, CLAUDE.md, PmovesSKillZ.md MCP Topology (mcp-topology.tac.yaml): - 13 MCP servers (3 internal + 10 external plugins) - ~74 tools across all servers - Transport types: HTTP, SSE, cloud-hosted - Auth and healthcheck per server Agent Teams TAC pending — will be added in follow-up commit. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
📝 WalkthroughWalkthroughAdds three new TAC YAML trees: an MCP topology audit, a skills taxonomy of CLI commands, and an agent-teams taxonomy with team/agent mappings and validation hooks (configuration-only changes; no code or API surface edits). Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
📝 Coding Plan
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment Tip CodeRabbit can enforce grammar and style rules using `languagetool`.Configure the |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (4)
pmoves/configs/tac_trees/skills-taxonomy.tac.yaml (3)
844-868: Inconsistent schema:mcp_tool(singular) vsmcp_tools(plural).Lines 850 uses
mcp_tool:as a single string, while lines 866-868 usemcp_tools:as a list. This inconsistency will complicate parsing and validation logic.♻️ Suggested fix: standardize on `mcp_tools` as a list
- id: skills.cipher.store command: "/cipher:store" file: "cipher/store.md" description: "Store knowledge in Cipher Memory" nats_subjects: [] pairing: null - mcp_tool: "pmoves_cipher_store" + mcp_tools: + - "pmoves_cipher_store" - id: skills.cipher.search command: "/cipher:search" file: "cipher/search.md" description: "Search Cipher Memory knowledge graph" nats_subjects: [] pairing: null - mcp_tool: "pmoves_cipher_search" + mcp_tools: + - "pmoves_cipher_search"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@pmoves/configs/tac_trees/skills-taxonomy.tac.yaml` around lines 844 - 868, The YAML entries for skills.cipher.store and skills.cipher.search use the singular field mcp_tool while skills.cipher.reasoning uses mcp_tools (a list); standardize by changing mcp_tool to mcp_tools for the store and search entries and convert their values into a single-item list (e.g., ["pmoves_cipher_store"] and ["pmoves_cipher_search"]) so all three skill definitions consistently use the mcp_tools list field.
1443-1448: Audit coverage is hardcoded, not dynamically validated.The audit section claims
unmapped: 0but this is a static assertion. Based ontac_runner.py, the runner has_check_file_existscapability, but no TAC action nodes actually trigger file existence validation for the 118 skillfile:paths.Consider adding a TAC action to validate that all referenced command files under
.claude/commands/actually exist:validation: - id: audit.file-existence task: "Validate all skill command files exist" action: type: file_exists_batch target: ".claude/commands/" pattern: "All files referenced in skills[].file"Alternatively, the audit section should note that coverage is a manual claim requiring external validation.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@pmoves/configs/tac_trees/skills-taxonomy.tac.yaml` around lines 1443 - 1448, The audit YAML currently hardcodes coverage numbers (total_command_files/mapped_skills/unmapped) without actually validating that the 118 referenced skill files exist; add a TAC validation action (e.g., an action node with id audit.file-existence and action.type file_exists_batch) that scans the target ".claude/commands/" and checks all skills[].file paths, or update the audit text to state that coverage is a claimed/manual value; reference the existing audit block and add the validation under audit.validation (or replace the unmapped: 0 claim) so tac_runner.py’s _check_file_exists-backed action is invoked to verify file existence for each skills[].file entry.
17-23: Consider cross-referencing agents against the canonical agent registry.Multiple skills reference agents (e.g.,
tokenism,codex,claude-opus,archon,hirag,deepresearch,hyperdimensions, etc.), but there's no validation that these agent names exist in the canonical registry. As per coding guidelines,pmoves/config/agent_registry.yamlshould be the source of truth for all agents.Consider adding:
- A
source_agentsfield in metadata pointing to the registry- An audit rule verifying all
agent:andagent_hint:values exist in the registry🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@pmoves/configs/tac_trees/skills-taxonomy.tac.yaml` around lines 17 - 23, Add a metadata linkage to the canonical agent registry and an audit that verifies all referenced agents exist: update the YAML metadata by adding a new metadata field source_agents that points to the canonical agent registry, then implement an audit rule that scans the document for any agent: and agent_hint: values and validates each value against the registry entries; ensure the audit fails or logs missing names so fields like metadata.source_agents, agent:, and agent_hint: are cross-referenced and enforced consistently.pmoves/configs/tac_trees/mcp-topology.tac.yaml (1)
54-117: Tool enumeration incomplete: 9 tools claimed but only 6 audit children.The task at line 55 states "Agent Zero MCP tools catalog (9 tools)" and the context lists all 9 tool names, but only 6 children are defined for validation:
- ✓
execute_task- ✓
create_subordinate- ✓
query_agent_status- ✓
list_agents- ✓
create_subordinate_with_persona- ✓
list_commands(actually an endpoint, not in the 9-tool list)- ✗
query_task_status(missing)- ✗
list_personas(missing)- ✗
get_persona(missing)- ✗
get_persona_enhancements(missing)Consider adding the missing tool audit nodes for complete coverage, or updating the count to reflect what's actually validated.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@pmoves/configs/tac_trees/mcp-topology.tac.yaml` around lines 54 - 117, The mcp.agent-zero.tools node claims "9 tools" but only defines six child audit entries; add missing child entries for the tools referenced in the context (query_task_status, list_personas, get_persona, get_persona_enhancements) under id: mcp.agent-zero.tools so the catalog and validation match; create children with ids like mcp.agent-zero.tools.query-task-status, mcp.agent-zero.tools.list-personas, mcp.agent-zero.tools.get-persona, mcp.agent-zero.tools.get-persona-enhancements and provide appropriate task, action (grep .claude/context/mcp-api.md with the relevant endpoint patterns), expect and context fields to mirror the style of existing children, or alternatively update the parent task string and context list to reflect the actual number and names validated.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@pmoves/configs/tac_trees/mcp-topology.tac.yaml`:
- Around line 266-274: The grep action for rule id mcp.botz-gateway.auth
references a non-existent directory target "PMOVES-BoTZ/features/mcp_bridge/";
locate the actual MCP bridge code (or confirm it's in another repo) and update
the target field to the correct relative path used by tac_runner.py (which uses
recursive search via rglob()), or if the implementation is not present, change
the action to a manual review note or mark the rule as pending so it won't run
and fail at execution.
---
Nitpick comments:
In `@pmoves/configs/tac_trees/mcp-topology.tac.yaml`:
- Around line 54-117: The mcp.agent-zero.tools node claims "9 tools" but only
defines six child audit entries; add missing child entries for the tools
referenced in the context (query_task_status, list_personas, get_persona,
get_persona_enhancements) under id: mcp.agent-zero.tools so the catalog and
validation match; create children with ids like
mcp.agent-zero.tools.query-task-status, mcp.agent-zero.tools.list-personas,
mcp.agent-zero.tools.get-persona, mcp.agent-zero.tools.get-persona-enhancements
and provide appropriate task, action (grep .claude/context/mcp-api.md with the
relevant endpoint patterns), expect and context fields to mirror the style of
existing children, or alternatively update the parent task string and context
list to reflect the actual number and names validated.
In `@pmoves/configs/tac_trees/skills-taxonomy.tac.yaml`:
- Around line 844-868: The YAML entries for skills.cipher.store and
skills.cipher.search use the singular field mcp_tool while
skills.cipher.reasoning uses mcp_tools (a list); standardize by changing
mcp_tool to mcp_tools for the store and search entries and convert their values
into a single-item list (e.g., ["pmoves_cipher_store"] and
["pmoves_cipher_search"]) so all three skill definitions consistently use the
mcp_tools list field.
- Around line 1443-1448: The audit YAML currently hardcodes coverage numbers
(total_command_files/mapped_skills/unmapped) without actually validating that
the 118 referenced skill files exist; add a TAC validation action (e.g., an
action node with id audit.file-existence and action.type file_exists_batch) that
scans the target ".claude/commands/" and checks all skills[].file paths, or
update the audit text to state that coverage is a claimed/manual value;
reference the existing audit block and add the validation under audit.validation
(or replace the unmapped: 0 claim) so tac_runner.py’s _check_file_exists-backed
action is invoked to verify file existence for each skills[].file entry.
- Around line 17-23: Add a metadata linkage to the canonical agent registry and
an audit that verifies all referenced agents exist: update the YAML metadata by
adding a new metadata field source_agents that points to the canonical agent
registry, then implement an audit rule that scans the document for any agent:
and agent_hint: values and validates each value against the registry entries;
ensure the audit fails or logs missing names so fields like
metadata.source_agents, agent:, and agent_hint: are cross-referenced and
enforced consistently.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 1cb16a39-3046-46f1-a22a-e0f8ab615982
📒 Files selected for processing (2)
pmoves/configs/tac_trees/mcp-topology.tac.yamlpmoves/configs/tac_trees/skills-taxonomy.tac.yaml
| - id: mcp.botz-gateway.auth | ||
| task: "JWT authentication on MCP bridge" | ||
| action: | ||
| type: grep | ||
| target: "PMOVES-BoTZ/features/mcp_bridge/" | ||
| pattern: "JWT_SECRET|jose|jwt" | ||
| expect: "JWT auth implemented in MCP bridge" | ||
| context: "P1 audit finding: fail-open auth path must be closed" | ||
| agent_hint: codex |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check if the target path is a directory and what files exist there
if [ -d "PMOVES-BoTZ/features/mcp_bridge" ]; then
echo "Directory exists, listing contents:"
fd . "PMOVES-BoTZ/features/mcp_bridge" --type f 2>/dev/null | head -20
else
echo "Directory not found or is not a directory"
# Try to find mcp_bridge anywhere
fd -t d mcp_bridge 2>/dev/null | head -10
fiRepository: POWERFULMOVES/PMOVES.AI
Length of output: 108
🏁 Script executed:
# Find the actual tac file mentioned in the comment
find . -name "mcp-topology.tac.yaml" 2>/dev/nullRepository: POWERFULMOVES/PMOVES.AI
Length of output: 115
🏁 Script executed:
# Search for mcp_bridge references in the codebase
rg "mcp_bridge" --type yaml --type py 2>/dev/null | head -30Repository: POWERFULMOVES/PMOVES.AI
Length of output: 562
🏁 Script executed:
# Check the repository structure around pmoves
ls -la pmoves/ 2>/dev/null || echo "pmoves not found at root"
fd -t d "pmoves" --max-depth 1 2>/dev/nullRepository: POWERFULMOVES/PMOVES.AI
Length of output: 8927
🏁 Script executed:
# Look for tac_runner.py to understand how it processes target fields
fd -t f "tac_runner.py" 2>/dev/nullRepository: POWERFULMOVES/PMOVES.AI
Length of output: 93
🏁 Script executed:
# Read the actual mcp-topology.tac.yaml file at lines 266-274
sed -n '260,280p' pmoves/configs/tac_trees/mcp-topology.tac.yamlRepository: POWERFULMOVES/PMOVES.AI
Length of output: 851
🏁 Script executed:
# Check if PMOVES-BoTZ/features/mcp_bridge exists
if [ -d "PMOVES-BoTZ/features/mcp_bridge" ]; then
echo "Directory exists"
find PMOVES-BoTZ/features/mcp_bridge -type f | head -20
else
echo "Directory does not exist"
# Check what does exist in PMOVES-BoTZ
ls -la PMOVES-BoTZ/ 2>/dev/null | head -20
fiRepository: POWERFULMOVES/PMOVES.AI
Length of output: 204
🏁 Script executed:
# Read tac_runner.py to understand how it handles grep actions
cat pmoves/tools/tac_runner.pyRepository: POWERFULMOVES/PMOVES.AI
Length of output: 8222
Directory target in grep action does not exist.
The target field at line 270 points to PMOVES-BoTZ/features/mcp_bridge/ which does not exist in the repository. While tac_runner.py does support directory targets (using recursive file search via rglob()), this particular path will fail with "target not found" when the action executes.
Verify the correct path to the MCP bridge implementation and update the target field accordingly. If the MCP bridge code is located elsewhere or in a different repository, the target should be adjusted or this action should be marked as manual review pending.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@pmoves/configs/tac_trees/mcp-topology.tac.yaml` around lines 266 - 274, The
grep action for rule id mcp.botz-gateway.auth references a non-existent
directory target "PMOVES-BoTZ/features/mcp_bridge/"; locate the actual MCP
bridge code (or confirm it's in another repo) and update the target field to the
correct relative path used by tac_runner.py (which uses recursive search via
rglob()), or if the implementation is not present, change the action to a manual
review note or mark the rule as pending so it won't run and fail at execution.
11 teams, 62 agents mapped with full cross-references: - Node affinity, NATS subject ownership (78+ subjects) - Skill pairing participation, GPU/CPU requirements - 4 audit rules for consistency validation Data: agent-teams.yaml, skill-pairings.yaml, nats-subjects.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@pmoves/configs/tac_trees/agent-teams-taxonomy.tac.yaml`:
- Around line 588-597: The entry with id
cross_references.research_summarize_render (task "research-summarize-render
participants") is missing the summarize stage but references the subject
skills.pipeline.research-render.v1; either add the summarize step to the
pipeline definition (so the flow becomes deepresearch -> summarize -> chart ->
render and the subject/pairing matches pmoves/configs/skill-pairings.yaml) or
rename the id/task/subject to reflect the implemented
deepresearch->chart->render flow (e.g., remove "summarize" from id/task and
change the subject to the canonical pairing used for research->chart->render),
updating the Agents/agent_hint as needed to keep semantics consistent with other
pairings.
- Around line 366-375: The entries under id "team.evolution.skill_pairings"
reference the agent id "tokenism", which is not defined in the
team.evolution.agents roster and causes orphaned mappings and unresolved
cross_references; replace "tokenism" with the canonical agent id from the agent
registry (the official agent name used across configs) or, if this is a
capability namespace, model it as a separate capability key and update the
context lines (ingest-chit-index, chit-3d-viz, pr-monitor-graphiti-chit,
health-sync, finance-sync) and the agent_hint accordingly so they point to a
declared agent/capability; ensure the chosen id matches the canonical name used
in the agent registry so cross_references resolve.
- Around line 689-706: The audit rule audit.team_has_nats_subject currently
forces every team to claim owned nats_subjects; change its logic so
consumer-only teams are exempt or roles are split: update the rule (id:
audit.team_has_nats_subject) to either (A) only apply to teams that have a
producing/publisher role (introduce or check an existing flag like
produces_subjects or publishers list) or (B) allow a team-level attribute (e.g.,
is_consumer_only or role: consumer) that the audit will skip; adjust the
action/description/expect text to reflect the new behavior and ensure teams that
only subscribe (e.g., publisher_discord subscribers and agentgym.train.*
consumers) are not required to claim ownership.
- Around line 709-721: The audit rule with id "audit.agent_count" currently
reads pmoves/configs/agent-teams.yaml and asserts a hard-coded total (62);
update it to read the canonical registry pmoves/config/agent_registry.yaml and
derive the expected count from that file instead of baking a number into the
TAC. Specifically, change the script invoked by the "command" for
audit.agent_count to load pmoves/config/agent_registry.yaml (e.g., count entries
under the registry's top-level agents list/key) compute expected_count =
len(registry_agents) and then assert total == expected_count while printing a
clear message; keep the existing calculation of total from the teams input but
replace the hard-coded 62 with the derived expected_count.
- Around line 566-660: The cross_references ids were changed from the canonical
hyphenated pairing keys to underscore forms (e.g.
cross_references.model_benchmark_viz, cross_references.ingest_chit_index,
cross_references.research_summarize_render, cross_references.chit_3d_viz,
cross_references.voice_synthesis, cross_references.agent_card_gen,
cross_references.pr_monitor_graphiti_chit, cross_references.health_sync,
cross_references.finance_sync); revert each id to the exact hyphenated key used
in skill-pairings.yaml (e.g. cross_references.model-benchmark-viz,
cross_references.ingest-chit-index, etc.) so joins by pairing id will match, and
scan the file for any other cross_references.* entries to apply the same
hyphenation rule.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 1495d5c0-f1da-45c1-a17b-4cf4d8cbdc70
📒 Files selected for processing (1)
pmoves/configs/tac_trees/agent-teams-taxonomy.tac.yaml
| - id: team.evolution.skill_pairings | ||
| task: "Skill pairing participation" | ||
| context: | | ||
| ingest-chit-index — tokenism (chit-encode step via swarm_attribution) | ||
| chit-3d-viz — tokenism (chit-encode step) | ||
| pr-monitor-graphiti-chit — tokenism (pr-learnings-encode step) | ||
| health-sync — tokenism (health-weekly-cgp step) | ||
| finance-sync — tokenism (finance-monthly-cgp step) | ||
| note: "tensorzero is a dependency for all pairings that call LLMs" | ||
| agent_hint: codex |
There was a problem hiding this comment.
Use a canonical agent id instead of tokenism.
tokenism is not declared in the team.evolution.agents roster on Lines 329-335, so these mappings are orphaned and the later cross_references entries inherit the same unresolved id. If this is a capability namespace, model it separately; otherwise point to the actual agent id.
As per coding guidelines, "Maintain canonical agent definitions in pmoves/config/agent_registry.yaml as the source of truth for all 60 agents".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@pmoves/configs/tac_trees/agent-teams-taxonomy.tac.yaml` around lines 366 -
375, The entries under id "team.evolution.skill_pairings" reference the agent id
"tokenism", which is not defined in the team.evolution.agents roster and causes
orphaned mappings and unresolved cross_references; replace "tokenism" with the
canonical agent id from the agent registry (the official agent name used across
configs) or, if this is a capability namespace, model it as a separate
capability key and update the context lines (ingest-chit-index, chit-3d-viz,
pr-monitor-graphiti-chit, health-sync, finance-sync) and the agent_hint
accordingly so they point to a declared agent/capability; ensure the chosen id
matches the canonical name used in the agent registry so cross_references
resolve.
| - id: cross_references.model_benchmark_viz | ||
| task: "model-benchmark-viz participants" | ||
| context: | | ||
| Pipeline: model-trainer -> benchmark -> chart -> render | ||
| NATS: skills.pipeline.model-benchmark-viz.v1 | ||
| Agents: | ||
| agent_zero (orchestration) — model-trainer, hf-benchmark steps | ||
| archon (orchestration) — a2ui-chart step | ||
| creator (media) — remotion-render step | ||
| agent_hint: codex | ||
|
|
||
| - id: cross_references.ingest_chit_index | ||
| task: "ingest-chit-index participants" | ||
| context: | | ||
| Pipeline: extract -> chit-encode -> hirag-index | ||
| NATS: skills.pipeline.ingest-chit-index.v1 | ||
| Agents: | ||
| extract_worker (research) — extract-worker step | ||
| tokenism (evolution) — chit-encode step (via swarm_attribution) | ||
| hirag_v2 (research) — hirag-index step | ||
| agent_hint: codex | ||
|
|
||
| - id: cross_references.research_summarize_render | ||
| task: "research-summarize-render participants" | ||
| context: | | ||
| Pipeline: deepresearch -> chart -> render | ||
| NATS: skills.pipeline.research-render.v1 | ||
| Agents: | ||
| deep_research (research) — deepresearch step | ||
| archon (orchestration) — a2ui-chart step | ||
| creator (media) — remotion-render step | ||
| agent_hint: codex | ||
|
|
||
| - id: cross_references.chit_3d_viz | ||
| task: "chit-3d-viz participants" | ||
| context: | | ||
| Pipeline: chit-encode -> threejs-render | ||
| NATS: skills.pipeline.chit-3d-viz.v1 | ||
| Agents: | ||
| tokenism (evolution) — chit-encode step | ||
| hyperdimensions (ui) — threejs-render step | ||
| agent_hint: codex | ||
|
|
||
| - id: cross_references.voice_synthesis | ||
| task: "voice-synthesis participants" | ||
| context: | | ||
| Pipeline: text-generate -> prosodic-analyze -> tts-synthesize | ||
| NATS: skills.pipeline.voice-synthesis.v1 | ||
| Agents: | ||
| agent_zero (orchestration) — text-generate step | ||
| flute_gateway (media) — prosodic-analyze step | ||
| ultimate_tts (media) — tts-synthesize step | ||
| agent_hint: codex | ||
|
|
||
| - id: cross_references.agent_card_gen | ||
| task: "agent-card-gen participants" | ||
| context: | | ||
| Pipeline: theme-lookup -> comfyui-generate -> a2ui-card | ||
| NATS: skills.pipeline.agent-card-gen.v1 | ||
| Agents: | ||
| archon (orchestration) — theme-lookup step, a2ui-card step | ||
| creator (media) — comfyui-generate step | ||
| agent_hint: codex | ||
|
|
||
| - id: cross_references.pr_monitor_graphiti_chit | ||
| task: "pr-monitor-graphiti-chit participants" | ||
| context: | | ||
| Pipeline: pr-monitor -> pr-hedge-trim -> pr-learnings-encode -> graphiti-trail-sync | ||
| NATS: skills.pipeline.pr-monitor-graphiti-chit.v1 | ||
| Agents: | ||
| codex (external) — pr-monitor step | ||
| claude-opus (external) — pr-hedge-trim step | ||
| tokenism (evolution) — pr-learnings-encode step | ||
| archon (orchestration) — graphiti-trail-sync step | ||
| agent_hint: codex | ||
|
|
||
| - id: cross_references.health_sync | ||
| task: "health-sync participants" | ||
| context: | | ||
| Pipeline: n8n-health-sync -> health-weekly-cgp | ||
| NATS: skills.pipeline.health-sync.v1 | ||
| Agents: | ||
| n8n (automation) — n8n-health-sync step | ||
| tokenism (evolution) — health-weekly-cgp step | ||
| agent_hint: codex | ||
|
|
||
| - id: cross_references.finance_sync | ||
| task: "finance-sync participants" | ||
| context: | | ||
| Pipeline: n8n-finance-sync -> finance-monthly-cgp | ||
| NATS: skills.pipeline.finance-sync.v1 | ||
| Agents: | ||
| n8n (automation) — n8n-finance-sync step | ||
| tokenism (evolution) — finance-monthly-cgp step | ||
| agent_hint: codex |
There was a problem hiding this comment.
Keep cross_references ids identical to the canonical pairing keys.
pmoves/configs/skill-pairings.yaml defines hyphenated ids like model-benchmark-viz and ingest-chit-index, but this block rewrites every key with underscores (cross_references.model_benchmark_viz, cross_references.ingest_chit_index, ...). Any join keyed by pairing id will miss all nine entries.
Proposed fix
- - id: cross_references.model_benchmark_viz
+ - id: cross_references.model-benchmark-viz
- - id: cross_references.ingest_chit_index
+ - id: cross_references.ingest-chit-index
- - id: cross_references.research_summarize_render
+ - id: cross_references.research-summarize-render
- - id: cross_references.chit_3d_viz
+ - id: cross_references.chit-3d-viz
- - id: cross_references.voice_synthesis
+ - id: cross_references.voice-synthesis
- - id: cross_references.agent_card_gen
+ - id: cross_references.agent-card-gen
- - id: cross_references.pr_monitor_graphiti_chit
+ - id: cross_references.pr-monitor-graphiti-chit
- - id: cross_references.health_sync
+ - id: cross_references.health-sync
- - id: cross_references.finance_sync
+ - id: cross_references.finance-sync🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@pmoves/configs/tac_trees/agent-teams-taxonomy.tac.yaml` around lines 566 -
660, The cross_references ids were changed from the canonical hyphenated pairing
keys to underscore forms (e.g. cross_references.model_benchmark_viz,
cross_references.ingest_chit_index, cross_references.research_summarize_render,
cross_references.chit_3d_viz, cross_references.voice_synthesis,
cross_references.agent_card_gen, cross_references.pr_monitor_graphiti_chit,
cross_references.health_sync, cross_references.finance_sync); revert each id to
the exact hyphenated key used in skill-pairings.yaml (e.g.
cross_references.model-benchmark-viz, cross_references.ingest-chit-index, etc.)
so joins by pairing id will match, and scan the file for any other
cross_references.* entries to apply the same hyphenation rule.
| - id: cross_references.research_summarize_render | ||
| task: "research-summarize-render participants" | ||
| context: | | ||
| Pipeline: deepresearch -> chart -> render | ||
| NATS: skills.pipeline.research-render.v1 | ||
| Agents: | ||
| deep_research (research) — deepresearch step | ||
| archon (orchestration) — a2ui-chart step | ||
| creator (media) — remotion-render step | ||
| agent_hint: codex |
There was a problem hiding this comment.
research-summarize-render is missing the summarize stage.
This pipeline is deepresearch -> chart -> render, and the subject on Line 592 is skills.pipeline.research-render.v1. That drifts from the canonical pairing in pmoves/configs/skill-pairings.yaml, which explicitly includes a summarize step. Either add the missing summarizer or rename the pairing and subject to match the implemented flow.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@pmoves/configs/tac_trees/agent-teams-taxonomy.tac.yaml` around lines 588 -
597, The entry with id cross_references.research_summarize_render (task
"research-summarize-render participants") is missing the summarize stage but
references the subject skills.pipeline.research-render.v1; either add the
summarize step to the pipeline definition (so the flow becomes deepresearch ->
summarize -> chart -> render and the subject/pairing matches
pmoves/configs/skill-pairings.yaml) or rename the id/task/subject to reflect the
implemented deepresearch->chart->render flow (e.g., remove "summarize" from
id/task and change the subject to the canonical pairing used for
research->chart->render), updating the Agents/agent_hint as needed to keep
semantics consistent with other pairings.
| - id: audit.single_team_membership | ||
| task: "Every agent belongs to exactly one team" | ||
| action: | ||
| type: script | ||
| command: | | ||
| python -c " | ||
| import yaml | ||
| t = yaml.safe_load(open('pmoves/configs/agent-teams.yaml')) | ||
| seen = {} | ||
| for team, cfg in t['teams'].items(): | ||
| for agent in cfg.get('agents', []): | ||
| if agent in seen: | ||
| print(f'FAIL: {agent} in both {seen[agent]} and {team}') | ||
| seen[agent] = team | ||
| print(f'Total agents: {len(seen)}, all unique: {len(seen) == sum(len(c.get(\"agents\",[])) for c in t[\"teams\"].values())}') | ||
| " |
There was a problem hiding this comment.
Make audit.single_team_membership fail on duplicates and cover the full roster.
The script only prints duplicate memberships and a final boolean; it never asserts or exits non-zero, so a runner can still mark the audit as passed. It also reads only pmoves/configs/agent-teams.yaml, so it cannot catch duplicates declared only in this TAC, like crush also appearing under team.external on Line 485. Line 671's invariant is not actually enforced.
Proposed fix
import yaml
t = yaml.safe_load(open('pmoves/configs/agent-teams.yaml'))
seen = {}
+ duplicates = []
for team, cfg in t['teams'].items():
for agent in cfg.get('agents', []):
if agent in seen:
- print(f'FAIL: {agent} in both {seen[agent]} and {team}')
+ duplicates.append((agent, seen[agent], team))
seen[agent] = team
- print(f'Total agents: {len(seen)}, all unique: {len(seen) == sum(len(c.get(\"agents\",[])) for c in t[\"teams\"].values())}')
+ assert not duplicates, f'Duplicate team membership: {duplicates}'
+ assert len(seen) == sum(len(c.get(\"agents\",[])) for c in t[\"teams\"].values())
+ print(f'Total agents: {len(seen)}')| - id: audit.team_has_nats_subject | ||
| task: "Every team has at least one NATS subject" | ||
| action: | ||
| type: manual | ||
| description: "Verify each team section in this TAC tree has a non-empty nats_subjects child" | ||
| expect: "All 11 teams (including external) have NATS subject ownership documented" | ||
| note: | | ||
| orchestration: 7 subjects (supaserch.*, agent.*, botz.mcp.*) | ||
| research: 7 subjects (research.*, cipher.*, ingest.file.*) | ||
| media: 7 subjects (ingest.transcript.*, tokenism.geometry.*, voice.*) | ||
| data: 3 subjects (mesh.node.*, test.*, dev.*) | ||
| ui: 5 subjects (remote.session.*, openclaw.*) | ||
| automation: 8 subjects (publisher_discord subscriptions, health/finance sync) | ||
| evolution: 18 subjects (mesh.gpu.*, model.*, geometry.*, tokenism.*, agentgym.*) | ||
| infra: 5 subjects (mesh.node.*, vpn.*) | ||
| sandbox: 3 subjects (agentgym.*) | ||
| external: 7 subjects (claude.code.*, ops.pr.*, agent.graphiti.*) | ||
| life: 8 subjects (health.*, finance.*) |
There was a problem hiding this comment.
Don't force every team to "own" a subject.
This audit pushes consumer-only teams into documenting subscriptions/consumed events as owned subjects. Examples: publisher_discord subscribes to on Lines 298-304 and agentgym.train.* on Lines 452-455. That makes ownership ambiguous and duplicates the same subject across teams. Split publisher/subscriber roles or relax this invariant for dependency-only teams.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@pmoves/configs/tac_trees/agent-teams-taxonomy.tac.yaml` around lines 689 -
706, The audit rule audit.team_has_nats_subject currently forces every team to
claim owned nats_subjects; change its logic so consumer-only teams are exempt or
roles are split: update the rule (id: audit.team_has_nats_subject) to either (A)
only apply to teams that have a producing/publisher role (introduce or check an
existing flag like produces_subjects or publishers list) or (B) allow a
team-level attribute (e.g., is_consumer_only or role: consumer) that the audit
will skip; adjust the action/description/expect text to reflect the new behavior
and ensure teams that only subscribe (e.g., publisher_discord subscribers and
agentgym.train.* consumers) are not required to claim ownership.
| - id: audit.agent_count | ||
| task: "Total agent count matches expected (62 in-house)" | ||
| action: | ||
| type: script | ||
| command: | | ||
| python -c " | ||
| import yaml | ||
| t = yaml.safe_load(open('pmoves/configs/agent-teams.yaml')) | ||
| total = sum(len(c.get('agents', [])) for c in t['teams'].values()) | ||
| print(f'Total agents across all teams: {total}') | ||
| assert total == 62, f'Expected 62, got {total}' | ||
| print('PASS') | ||
| " |
There was a problem hiding this comment.
Drive the count audit from the canonical registry, not a second roster file.
Hard-coding 62 here and reading pmoves/configs/agent-teams.yaml makes this check drift-prone. The taxonomy already references agent_registry.yaml elsewhere, so this audit can pass while the TAC disagrees with the canonical roster. Read the canonical registry and derive the expected total from it instead of baking the number into the TAC.
As per coding guidelines, "Maintain canonical agent definitions in pmoves/config/agent_registry.yaml as the source of truth for all 60 agents".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@pmoves/configs/tac_trees/agent-teams-taxonomy.tac.yaml` around lines 709 -
721, The audit rule with id "audit.agent_count" currently reads
pmoves/configs/agent-teams.yaml and asserts a hard-coded total (62); update it
to read the canonical registry pmoves/config/agent_registry.yaml and derive the
expected count from that file instead of baking a number into the TAC.
Specifically, change the script invoked by the "command" for audit.agent_count
to load pmoves/config/agent_registry.yaml (e.g., count entries under the
registry's top-level agents list/key) compute expected_count =
len(registry_agents) and then assert total == expected_count while printing a
clear message; keep the existing calculation of total from the teams input but
replace the hard-coded 62 with the derived expected_count.
Summary
Add 3 new TAC trees completing the "who can do what, where, and how" picture:
Skills Taxonomy (
skills-taxonomy.tac.yaml) - 1498 linesskill-pairings.yaml,CLAUDE.mdskills list,PmovesSKillZ.mdMCP Topology (
mcp-topology.tac.yaml) - 426 linesmcp-api.md, connected MCP servers,BOTZ_GATEWAY_AGENT_INTEGRATION.mdAgent Teams Taxonomy (
agent-teams-taxonomy.tac.yaml) - Pendingagent-teams.yamlContext
These TAC trees + the existing
network-dns-topology.tac.yaml(merged in #967) complete the platform's machine-readable operational map:Source docs reviewed:
pmoves/docs/AGENTS/PMOVES_UNIFIED_AGENT_TAXONOMY.md,PMOVES_AGENT_CLASS_TAXONOMY.md,AGENT_TAXONOMY_CROSS_REFERENCE.md,PmovesSKillZ.md,BOTZ_GATEWAY_AGENT_INTEGRATION.mdTest plan
python3 -c "import yaml; yaml.safe_load(open('pmoves/configs/tac_trees/skills-taxonomy.tac.yaml'))"🤖 Generated with Claude Code
Summary by CodeRabbit