Skip to content

feat(tac): Skills Taxonomy + MCP Topology + Agent Teams TAC trees - #968

Merged
POWERFULMOVES merged 2 commits into
mainfrom
feat/tac-trees-skills-mcp-agents
Mar 16, 2026
Merged

feat(tac): Skills Taxonomy + MCP Topology + Agent Teams TAC trees#968
POWERFULMOVES merged 2 commits into
mainfrom
feat/tac-trees-skills-mcp-agents

Conversation

@POWERFULMOVES

@POWERFULMOVES POWERFULMOVES commented Mar 16, 2026

Copy link
Copy Markdown
Owner

Summary

Add 3 new TAC trees completing the "who can do what, where, and how" picture:

Skills Taxonomy (skills-taxonomy.tac.yaml) - 1498 lines

  • 100+ skills grouped by 15 domains (deploy, health, github, chit, voice, search, agents, etc.)
  • 7 FlOO$ dependency chains mapped with agents and NATS subjects
  • Data: skill-pairings.yaml, CLAUDE.md skills list, PmovesSKillZ.md

MCP Topology (mcp-topology.tac.yaml) - 426 lines

  • 13 MCP servers: 3 internal (Agent Zero HTTP, Cipher Memory SSE, BoTZ HTTP) + 10 external plugins
  • ~74 tools total with transport types, auth requirements, healthcheck endpoints
  • Data: mcp-api.md, connected MCP servers, BOTZ_GATEWAY_AGENT_INTEGRATION.md

Agent Teams Taxonomy (agent-teams-taxonomy.tac.yaml) - Pending

  • 11 teams, 62 agents from agent-teams.yaml
  • Node affinity, NATS subject ownership, skill pairing assignments
  • Will be added in follow-up commit (agent still generating)

Context

These TAC trees + the existing network-dns-topology.tac.yaml (merged in #967) complete the platform's machine-readable operational map:

  • Network TAC: Where services can talk
  • Skills TAC: What they can do
  • MCP TAC: What tools are available
  • Agent Teams TAC: Who owns what

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.md

Test plan

  • YAML syntax valid: python3 -c "import yaml; yaml.safe_load(open('pmoves/configs/tac_trees/skills-taxonomy.tac.yaml'))"
  • All 100+ skills from CLAUDE.md appear in at least one domain
  • All 13 MCP servers accounted for

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores
    • Added MCP topology audit configuration for verifying transports, healthchecks, authentication, and tool inventories across internal and external services.
    • Added comprehensive skills taxonomy mapping commands to domains, NATS subjects, and dependency chains.
    • Added agent teams taxonomy documenting team compositions, affinities, compute expectations, and cross-reference validations.

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>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai

coderabbitai Bot commented Mar 16, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds 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

Cohort / File(s) Summary
MCP Topology Configuration
pmoves/configs/tac_trees/mcp-topology.tac.yaml
New TAC tree defining MCP topology audit phases for internal and external MCPs, transports, healthchecks, auth expectations, tool catalogs, topology audit rules, and a detailed server inventory table.
Skills Taxonomy Configuration
pmoves/configs/tac_trees/skills-taxonomy.tac.yaml
New comprehensive skills catalog mapping ~118 CLI commands across many domains with metadata (file refs, NATS subjects, pairing, dependency chains) and audit coverage summary.
Agent Teams Taxonomy
pmoves/configs/tac_trees/agent-teams-taxonomy.tac.yaml
New agent-team taxonomy for 11 teams listing agents, contexts, node affinities, NATS subjects, compute notes, cross-references, and audit validation rules (some Python-check hooks).

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 I hopped through YAML rows tonight,

Audited MCPs by moonlight,
Mapped each skill and team so bright,
A rabbit’s ledger, neat and light,
Hopping home with config delight.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is largely incomplete against the required template. It lacks a Testing section with actual commands/output, missing checkbox confirmations for Required Checks, and no Reviewer Notes. Follow-up Tasks section is also absent. Add Testing section with command output, complete all Required Checks checkboxes, include Reviewer Notes if needed, and document any Follow-up Tasks required for this PR.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding three TAC tree configuration files for skills taxonomy, MCP topology, and agent teams.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/tac-trees-skills-mcp-agents
📝 Coding Plan
  • Generate coding plan for human review comments

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

CodeRabbit can enforce grammar and style rules using `languagetool`.

Configure the reviews.tools.languagetool setting to enable/disable rules and categories. Refer to the LanguageTool Community to learn more.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (4)
pmoves/configs/tac_trees/skills-taxonomy.tac.yaml (3)

844-868: Inconsistent schema: mcp_tool (singular) vs mcp_tools (plural).

Lines 850 uses mcp_tool: as a single string, while lines 866-868 use mcp_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: 0 but this is a static assertion. Based on tac_runner.py, the runner has _check_file_exists capability, but no TAC action nodes actually trigger file existence validation for the 118 skill file: 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.yaml should be the source of truth for all agents.

Consider adding:

  1. A source_agents field in metadata pointing to the registry
  2. An audit rule verifying all agent: and agent_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

📥 Commits

Reviewing files that changed from the base of the PR and between f1cd56b and 7ed35a0.

📒 Files selected for processing (2)
  • pmoves/configs/tac_trees/mcp-topology.tac.yaml
  • pmoves/configs/tac_trees/skills-taxonomy.tac.yaml

Comment on lines +266 to +274
- 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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 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
fi

Repository: 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/null

Repository: 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 -30

Repository: 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/null

Repository: 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/null

Repository: 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.yaml

Repository: 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
fi

Repository: 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.py

Repository: 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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 7ed35a0 and e797ec5.

📒 Files selected for processing (1)
  • pmoves/configs/tac_trees/agent-teams-taxonomy.tac.yaml

Comment on lines +366 to +375
- 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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.

Comment on lines +566 to +660
- 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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.

Comment on lines +588 to +597
- 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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.

Comment on lines +670 to +685
- 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())}')
"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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)}')

Comment on lines +689 to +706
- 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.*)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.

Comment on lines +709 to +721
- 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')
"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.

@POWERFULMOVES
POWERFULMOVES merged commit cd57947 into main Mar 16, 2026
6 checks passed
@POWERFULMOVES
POWERFULMOVES deleted the feat/tac-trees-skills-mcp-agents branch April 21, 2026 13:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants