12 KiB
BMAD Agent PM.md - LLM Compatibility Issues Report
Date: 2025-10-02
Analyzed File: /z9/bmad/bmm/agents/pm.md
Purpose: Deep analysis of potential LLM interpretation issues
Executive Summary
Analysis of the Product Manager agent reveals 10 distinct issues ranging from critical functionality breaks to documentation inconsistencies. The most severe issues involve undefined variable references, handler mismatches, and ambiguous execution instructions that could cause LLMs to behave unpredictably.
CRITICAL Issues (Breaks Functionality)
Issue #8: Validate-Workflow Handler Mismatch
Severity: 🔴 CRITICAL Location: Lines 27-33 vs Line 73
Problem:
<!-- Handler expects this attribute: -->
<handler type="validate-workflow">
When command has: validate-workflow="path/to/workflow.yaml"
...
</handler>
<!-- But actual command uses this: -->
<c cmd="*validate" exec="{project-root}/bmad/core/tasks/validate-workflow.md">
The handler is configured to trigger on validate-workflow attribute, but no command in the agent actually uses that attribute. The *validate command uses exec instead.
Impact: Handler will never execute; validation functionality is broken or unclear.
Suggested Fix:
<!-- Option 1: Change command to match handler -->
<c cmd="*validate" validate-workflow="{output_folder}/document.md">
Validate any document against its workflow checklist
</c>
<!-- Option 2: Change handler to match command -->
<handler type="exec">
When command has: exec="{project-root}/bmad/core/tasks/validate-workflow.md"
Load and execute the validation task file
Prompt user for document path if not provided
</handler>
Issue #5: Undefined Fuzzy Match Algorithm
Severity: 🔴 CRITICAL Location: Line 16
Problem:
<input>Number → cmd[n] | Text → fuzzy match *commands</input>
"Fuzzy match" is completely undefined. Different LLMs may implement:
- Exact substring matching
- Levenshtein distance
- Semantic similarity
- Partial token matching
- Case-sensitive vs case-insensitive
Impact: Inconsistent command matching behavior across different LLM providers. User experience varies significantly.
Suggested Fix:
<input>
Number → Execute cmd[n] directly
Text → Case-insensitive substring match against command triggers
If multiple matches found, list matches and ask user to clarify
If no matches found, show "Command not recognized. Type number or *help"
</input>
HIGH Priority Issues (Causes Confusion)
Issue #1: Activation Step 5 Ambiguity
Severity: 🟠 HIGH Location: Line 13
Problem:
<step n="5">CRITICAL HALT. AWAIT user input. NEVER continue without it.</step>
"CRITICAL HALT" and "NEVER continue" are extreme imperatives that may confuse LLMs designed to be responsive. Some LLMs may:
- Ignore the halt entirely
- Become stuck in a loop
- Over-apply the restriction to subsequent interactions
- Not understand this specifically means "wait for command selection"
Impact: Agent may continue without waiting, or may become unresponsive.
Suggested Fix:
<step n="5">
STOP. Display the menu and WAIT for user to select a command.
Accept either: (a) number corresponding to command index, or (b) command text for fuzzy matching.
DO NOT proceed until user provides input. DO NOT improvise or suggest actions.
</step>
Issue #3: Override Path Variable Undefined
Severity: 🟠 HIGH Location: Line 10
Problem:
<step n="2">Override with {project-root}/bmad/_cfg/agents/{agent-filename} if exists (replace, not merge)</step>
Issues:
{agent-filename}is never defined (should it bepm,pm.md, or something else?)- Doesn't specify WHICH sections get replaced
- No explicit handling for "file doesn't exist" case
Impact: LLM may construct wrong path, may not find config, or may merge instead of replace.
Suggested Fix:
<step n="2">
Check if agent config exists at: {project-root}/bmad/_cfg/agents/pm.md
If config file exists:
- REPLACE entire persona section with config persona (do NOT merge fields)
- Config persona overrides completely; ignore original persona
If config file does NOT exist:
- Continue with persona from current agent file
- No error needed; this is expected behavior
</step>
Issue #6: Variable Storage Mechanism Unclear
Severity: 🟠 HIGH Location: Line 65
Problem:
<i>Load into memory {project-root}/bmad/bmm/config.yaml and set variable project_name, output_folder, user_name, communication_language</i>
Ambiguities:
- "set variable" - where are these stored?
- How are they accessed later (as
{project_name}or$project_nameor something else?) - What's the scope (session? agent-only? global?)
- What if config.yaml doesn't exist or is malformed?
Impact: Variables might not be properly initialized or accessible in subsequent operations.
Suggested Fix:
<i>
Load configuration from {project-root}/bmad/bmm/config.yaml
Parse YAML and extract these fields: project_name, output_folder, user_name, communication_language
Store these in persistent session memory with syntax: {project_name}, {output_folder}, {user_name}, {communication_language}
These variables remain accessible throughout the entire agent session
If any field is missing from config, prompt user to provide it
</i>
MEDIUM Priority Issues (Best Practices)
Issue #4: Handler Priority Order Not Specified
Severity: 🟡 MEDIUM Location: Lines 18-50
Problem:
Multiple command handlers are defined, but there's no explicit priority when a command has multiple attributes simultaneously (e.g., exec + tmpl + data).
Impact: LLM might execute handlers in wrong order, skip handlers, or be confused about precedence.
Suggested Fix:
<handlers>
<!-- PROCESSING ORDER: Execute in this sequence when multiple attributes present -->
<!-- 1. data (load supplementary data first) -->
<!-- 2. tmpl (load template second) -->
<!-- 3. action/exec/run-workflow/validate-workflow (execute main handler last) -->
<handler type="data" priority="1">
When command has: data="path/to/file.json|yaml|yml|csv|xml"
Load the file first, parse according to extension
Make available as {data} variable to subsequent handler operations
</handler>
<handler type="tmpl" priority="2">
When command has: tmpl="path/to/template.md"
Load template file, parse {{mustache}} style variables
Make available as {template} to action/exec/workflow handlers
</handler>
<handler type="run-workflow" priority="3">
<!-- existing run-workflow handler -->
</handler>
<!-- etc -->
</handlers>
Issue #7: Workflow Handler Typo and Rigidity
Severity: 🟡 MEDIUM Location: Lines 20-24
Problem:
2. READ its entire contents - the is the CORE OS for EXECUTING modules
Typo: "the is" should be "this is"
Also: "Follow workflow.md instructions EXACTLY as written" may be too rigid and conflict with need for judgment calls.
Impact:
- Typo could confuse some LLMs
- "EXACTLY" might prevent necessary adaptations
Suggested Fix:
<handler type="run-workflow">
When command has run-workflow="path/to/workflow.yaml":
1. Load the workflow execution engine: {project-root}/bmad/core/tasks/workflow.md
2. Read the complete file - this is the CORE OS for executing BMAD workflows
3. Pass the workflow.yaml path as the 'workflow-config' parameter
4. Execute workflow.md instructions precisely following all steps
5. Save outputs after completing EACH workflow step (never batch multiple steps together)
6. If workflow.yaml path is "todo", inform user the workflow hasn't been implemented yet
</handler>
Issue #10: Persona Principles Formatting Inconsistency
Severity: 🟡 MEDIUM Location: Line 62
Problem: Architecture documentation specifies "2-5 sentences" for principles (updated guidance), but the actual principles section is ONE very long run-on sentence:
<principles>I operate with an investigative mindset that seeks to uncover the deeper "why" behind every requirement while maintaining relentless focus on delivering value to target users. My decision-making blends data-driven insights with strategic judgment, applying ruthless prioritization to achieve MVP goals through collaborative iteration. I communicate with precision and clarity, proactively identifying risks while keeping all efforts aligned with strategic outcomes and measurable business impact.</principles>
Impact:
- Harder to parse individual principles
- Violates stated guidelines
- Reduces readability
- LLMs copying this pattern may create similarly compressed principles
Suggested Fix:
<principles>
I operate with an investigative mindset that seeks to uncover the deeper "why" behind every requirement.
I maintain relentless focus on delivering value to target users through data-driven insights and strategic judgment.
I apply ruthless prioritization to achieve MVP goals through collaborative iteration.
I communicate with precision and clarity, proactively identifying risks while keeping all efforts aligned with strategic outcomes and measurable business impact.
</principles>
LOW Priority Issues (Documentation/Polish)
Issue #2: Self-Referential Verbosity
Severity: 🟢 LOW Location: Line 9
Problem:
<step n="1">Load persona from this current file containing this activation you are reading now</step>
"this current file containing this activation you are reading now" is unnecessarily verbose and potentially confusing.
Impact: Minor - may cause some LLMs to attempt redundant file loading operations.
Suggested Fix:
<step n="1">Load the persona section from the current agent file (already loaded in context)</step>
Issue #9: Unused Action Handler Pattern
Severity: 🟢 LOW Location: Lines 34-37
Problem:
<handler type="action">
When command has: action="#id" → Find prompt with id="id" in current agent XML
When command has: action="text" → Execute the text directly as a critical action prompt
</handler>
This agent has NO <prompts> section and no commands using action="#id" pattern. The handler documents a pattern that isn't used in this agent.
Impact: Minor confusion - documentation exists for unused functionality.
Suggested Fix:
Option 1 - Remove unused documentation:
<handler type="action">
When command has: action="text"
Execute the text directly as an inline instruction
</handler>
Option 2 - Keep for reference but add comment:
<handler type="action">
<!-- Pattern: action="#id" finds <prompt id="id"> in agent (not used in this agent) -->
When command has: action="text" → Execute the text directly as an inline instruction
</handler>
Additional Observations
Positive Patterns
✅ Persona uses first-person voice consistently ✅ Critical actions properly load config ✅ Commands follow standard *help, *exit pattern ✅ Icon and basic metadata well-formed
Missing Elements
- No
<prompts>section (which is fine for this agent type) - No
yolomode toggle (optional but common) - No validation of whether workflow paths actually exist
Recommendations Priority
Immediate Action Required
- Fix Issue #8: Resolve validate-workflow handler mismatch
- Fix Issue #5: Define explicit fuzzy match algorithm
- Fix Issue #3: Define {agent-filename} variable
High Priority
- Fix Issue #1: Clarify HALT instruction
- Fix Issue #6: Document variable storage mechanism
Medium Priority
- Fix Issue #4: Add handler priority order
- Fix Issue #7: Fix typo and clarify "EXACTLY"
- Fix Issue #10: Break principles into proper sentences
Low Priority (Polish)
- Fix Issue #2: Simplify self-referential language
- Fix Issue #9: Clean up unused handler documentation
Testing Recommendations
After implementing fixes, test with multiple LLM providers:
- Claude (Anthropic)
- GPT-4 (OpenAI)
- Gemini (Google)
- Llama (Meta)
Verify:
- Agent loads without errors
- Menu displays correctly
- Agent waits for input after menu
- Command matching works consistently
- Config override works (test with and without config file)
- Variables load and are accessible
- Workflow execution triggers correctly
- Validation command works as expected
Report Generated: 2025-10-02 Analyst: Claude (Sonnet 4.5) Confidence: High (based on deep structural analysis)