Breakthrough Method for Agile Ai Driven Development
This report summarizes scanner evidence for bmad-code-org/BMAD-METHOD, a Python project with 54,014 GitHub stars. SynthScan examined 89,301 lines of code across 684 source files, recording 1222 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 16.9 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1099 finding(s).
Are imports declared and package/API names verified? 62 finding(s).
Are wrappers, guards, and repeated structures necessary? 871 finding(s).
Which changes need focused human review? 1222 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1222 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/validate_skills.py | 156 | def parse_frontmatter_multiline(content: str) -> dict[str, str] | None: | CODE |
| LOW | tools/validate_file_refs.py | 159 | def strip_json_example_blocks(content: str) -> str: | CODE |
| LOW | tools/validate_file_refs.py | 325 | def check_absolute_path_leaks(file_path: str, content: str) -> list[Leak]: | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 96 | def test_code_blocks_stripped(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 104 | def test_json_example_blocks_stripped(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 108 | def test_unresolvable_refs_skipped(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 112 | def test_project_root_runtime_variable_skipped(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 118 | def test_refs_with_lines_and_keys(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 127 | def test_unresolvable_skipped(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 131 | def test_multi_document_yaml_scans_all_documents(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 139 | def test_invalid_yaml_returns_empty(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 155 | def test_install_only_paths_skipped(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 164 | def test_install_generated_files_skipped(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 170 | def test_leaks_found_with_line_numbers(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 208 | def test_skill_root_resolution(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 216 | def test_prose_path_not_flagged(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 224 | def test_assets_and_samples_are_not_scanned(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 232 | def test_stray_file_in_skills_root(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 239 | def test_leak_reported_in_run(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 246 | def test_default_mode_warns_but_exits_zero(self): | CODE |
| LOW⚡ | tools/tests/test_validate_file_refs.py | 254 | def test_install_only_ref_not_counted_as_broken(self): | CODE |
| LOW | tools/tests/test_validate_file_refs.py | 79 | def test_backtick_prose_forms_skipped(self): | CODE |
| LOW | tools/tests/test_validate_file_refs.py | 188 | def test_clean_tree_exits_zero(self): | CODE |
| LOW | tools/tests/test_validate_file_refs.py | 196 | def test_broken_vs_unresolved(self): | CODE |
| LOW | tools/tests/test_validate_file_refs.py | 276 | def test_github_actions_annotations_and_step_summary(self): | CODE |
| LOW | tools/tests/test_validate_file_refs.py | 290 | def test_csv_files_not_scanned(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 98 | def test_a_named_skills_list_limits_a_document_and_a_star_or_no_key_covers_the_module(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 107 | def test_installed_skills_are_the_listed_skills_whose_folder_exists(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 117 | def test_a_single_skill_module_is_its_own_one_member(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 132 | def test_a_record_is_found_whatever_its_folder_is_called(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 141 | def test_a_second_record_for_a_code_is_a_problem_and_the_first_wins(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 151 | def test_a_skill_whose_record_is_absent_has_no_module_and_names_the_install_command(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 177 | def test_a_skill_that_names_no_record_is_a_problem(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 186 | def test_a_skills_value_of_the_wrong_type_drops_the_document(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 194 | def test_help_md_is_read_with_no_entry_and_covers_every_skill(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 206 | def test_a_module_without_help_md_offers_no_document_and_no_problem(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 213 | def test_an_entry_naming_help_md_is_reported_and_the_file_is_read_once(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 221 | def test_topic_files_are_listed_with_their_path_and_never_their_text(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 313 | def test_a_named_document_that_is_absent_is_a_problem(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 322 | def test_an_unreadable_file_is_named_and_the_rest_continue(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 331 | def test_a_folder_without_a_bmod_file_is_ignored(self): | CODE |
| LOW⚡ | tools/tests/test_knowledge.py | 340 | def test_the_first_root_shadows_later_ones(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 75 | def test_a_document_is_reported_once_with_the_modules_skills(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 87 | def test_same_filename_in_two_modules_stays_two_documents(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 165 | def test_a_named_record_folder_with_no_usable_record_offers_no_install_command(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 243 | def test_a_help_file_named_as_a_knowledge_document_is_not_also_a_topic(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 251 | def test_a_topic_that_links_outside_the_record_is_a_problem_and_not_listed(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 265 | def test_a_path_named_twice_is_reported_and_the_first_entry_is_kept(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 277 | def test_a_url_is_reported_as_a_problem_not_read_as_a_path(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 288 | def test_traversal_is_refused(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 299 | def test_a_document_that_links_outside_the_record_folder_is_refused(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 354 | def test_a_record_in_one_root_covers_its_skills_in_another(self): | CODE |
| LOW | tools/tests/test_knowledge.py | 366 | def test_content_is_returned_on_request(self): | CODE |
| LOW⚡ | tools/tests/test_bmad_setup.py | 3455 | def test_no_install_is_offered_when_the_new_name_is_in_another_active_root(self): | CODE |
| LOW⚡ | tools/tests/test_bmad_setup.py | 3462 | def test_removal_modes_cannot_be_combined_with_other_modes(self): | CODE |
| LOW⚡ | tools/tests/test_bmad_setup.py | 3469 | def test_status_reports_the_same_and_changes_nothing(self): | CODE |
| LOW⚡ | tools/tests/test_bmad_setup.py | 3585 | def test_a_name_a_module_still_lists_is_not_retired(self): | CODE |
| LOW⚡ | tools/tests/test_bmad_setup.py | 3590 | def test_an_unusable_retired_file_is_a_problem_and_setup_carries_on(self): | CODE |
| LOW⚡ | tools/tests/test_bmad_setup.py | 3597 | def test_bad_retired_lists_are_rejected(self): | CODE |
| LOW⚡ | tools/tests/test_bmad_setup.py | 3774 | def test_a_module_may_have_no_documents(self): | CODE |
| 748 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …existing-codebases/set-and-maintain-project-context.md | 23 | ## Step 1: Run It | COMMENT |
| LOW | …existing-codebases/set-and-maintain-project-context.md | 38 | ## Step 2: Tell It What You Bring | COMMENT |
| LOW | …existing-codebases/set-and-maintain-project-context.md | 53 | ## Step 3: It Verifies the Rest | COMMENT |
| LOW | …existing-codebases/set-and-maintain-project-context.md | 64 | ## Step 4: Approve the Block | COMMENT |
| LOW | skills/bmad-customize/SKILL.md | 24 | ## Step 1: Classify intent | COMMENT |
| LOW | skills/bmad-customize/SKILL.md | 31 | ## Step 2: Discovery | COMMENT |
| LOW | skills/bmad-customize/SKILL.md | 43 | ## Step 3: Determine the right surface | COMMENT |
| LOW | skills/bmad-customize/SKILL.md | 62 | ## Step 4: Compose the override | COMMENT |
| LOW | skills/bmad-customize/SKILL.md | 75 | ## Step 5: Team or user placement | COMMENT |
| LOW | skills/bmad-customize/SKILL.md | 83 | ## Step 6: Show, confirm, write, verify | COMMENT |
| LOW⚡ | skills/bmad-retrospective/workflow.md | 23 | ### Step 1: Execute Prepend Steps | COMMENT |
| LOW⚡ | skills/bmad-retrospective/workflow.md | 29 | ### Step 2: Load Persistent Facts | COMMENT |
| LOW⚡ | skills/bmad-retrospective/workflow.md | 35 | ### Step 3: Execute Append Steps | COMMENT |
| LOW | skills/bmad-eval/references/description-optimization.md | 7 | ## Step 1: generate the query set | COMMENT |
| LOW | skills/bmad-eval/references/description-optimization.md | 20 | ## Step 2: stratified 60/40 split | COMMENT |
| LOW | skills/bmad-eval/references/description-optimization.md | 26 | ## Step 3: measure real triggering | COMMENT |
| LOW⚡ | skills/bmad-eval/references/description-optimization.md | 37 | ## Step 4: improve from train failures, test blinded | COMMENT |
| LOW⚡ | skills/bmad-eval/references/description-optimization.md | 45 | ## Step 5: re-measure and iterate | COMMENT |
| LOW⚡ | skills/bmad-eval/references/description-optimization.md | 49 | ## Step 6: pick the winner by test score | COMMENT |
| LOW | skills/bmad-agent-pm/SKILL.md | 21 | ### Step 1: Resolve the Agent Block | COMMENT |
| LOW⚡ | skills/bmad-agent-pm/SKILL.md | 35 | ### Step 2: Execute Prepend Steps | COMMENT |
| LOW⚡ | skills/bmad-agent-pm/SKILL.md | 39 | ### Step 3: Adopt Persona | COMMENT |
| LOW⚡ | skills/bmad-agent-pm/SKILL.md | 45 | ### Step 4: Load Persistent Facts | COMMENT |
| LOW⚡ | skills/bmad-agent-pm/SKILL.md | 49 | ### Step 5: Load Config | COMMENT |
| LOW⚡ | skills/bmad-agent-pm/SKILL.md | 55 | ### Step 6: Greet the User | COMMENT |
| LOW⚡ | skills/bmad-agent-pm/SKILL.md | 61 | ### Step 7: Execute Append Steps | COMMENT |
| LOW⚡ | skills/bmad-agent-pm/SKILL.md | 67 | ### Step 8: Dispatch or Present the Menu | COMMENT |
| LOW | skills/bmad-qa-generate-e2e-tests/SKILL.md | 21 | ### Step 1: Resolve the Workflow Block | COMMENT |
| LOW⚡ | skills/bmad-qa-generate-e2e-tests/SKILL.md | 35 | ### Step 2: Execute Prepend Steps | COMMENT |
| LOW⚡ | skills/bmad-qa-generate-e2e-tests/SKILL.md | 39 | ### Step 3: Load Persistent Facts | COMMENT |
| LOW⚡ | skills/bmad-qa-generate-e2e-tests/SKILL.md | 43 | ### Step 4: Load Config | COMMENT |
| LOW⚡ | skills/bmad-qa-generate-e2e-tests/SKILL.md | 53 | ### Step 5: Greet the User | COMMENT |
| LOW⚡ | skills/bmad-qa-generate-e2e-tests/SKILL.md | 57 | ### Step 6: Execute Append Steps | COMMENT |
| LOW | skills/bmad-qa-generate-e2e-tests/SKILL.md | 71 | ### Step 0: Detect Test Framework | COMMENT |
| LOW⚡ | skills/bmad-qa-generate-e2e-tests/SKILL.md | 83 | ### Step 1: Identify Features | COMMENT |
| LOW⚡ | skills/bmad-qa-generate-e2e-tests/SKILL.md | 91 | ### Step 2: Generate API Tests (if applicable) | COMMENT |
| LOW⚡ | skills/bmad-qa-generate-e2e-tests/SKILL.md | 100 | ### Step 3: Generate E2E Tests (if UI exists) | COMMENT |
| LOW | skills/bmad-qa-generate-e2e-tests/SKILL.md | 111 | ### Step 4: Run Tests | COMMENT |
| LOW | skills/bmad-qa-generate-e2e-tests/SKILL.md | 117 | ### Step 5: Create Summary | COMMENT |
| LOW | skills/bmad-agent-ux-designer/SKILL.md | 21 | ### Step 1: Resolve the Agent Block | COMMENT |
| LOW⚡ | skills/bmad-agent-ux-designer/SKILL.md | 35 | ### Step 2: Execute Prepend Steps | COMMENT |
| LOW⚡ | skills/bmad-agent-ux-designer/SKILL.md | 39 | ### Step 3: Adopt Persona | COMMENT |
| LOW⚡ | skills/bmad-agent-ux-designer/SKILL.md | 45 | ### Step 4: Load Persistent Facts | COMMENT |
| LOW⚡ | skills/bmad-agent-ux-designer/SKILL.md | 49 | ### Step 5: Load Config | COMMENT |
| LOW⚡ | skills/bmad-agent-ux-designer/SKILL.md | 55 | ### Step 6: Greet the User | COMMENT |
| LOW⚡ | skills/bmad-agent-ux-designer/SKILL.md | 61 | ### Step 7: Execute Append Steps | COMMENT |
| LOW⚡ | skills/bmad-agent-ux-designer/SKILL.md | 67 | ### Step 8: Dispatch or Present the Menu | COMMENT |
| LOW | skills/bmad-correct-course/SKILL.md | 21 | ### Step 1: Resolve the Workflow Block | COMMENT |
| LOW⚡ | skills/bmad-correct-course/SKILL.md | 35 | ### Step 2: Execute Prepend Steps | COMMENT |
| LOW⚡ | skills/bmad-correct-course/SKILL.md | 39 | ### Step 3: Load Persistent Facts | COMMENT |
| LOW⚡ | skills/bmad-correct-course/SKILL.md | 43 | ### Step 4: Load Config | COMMENT |
| LOW | skills/bmad-correct-course/SKILL.md | 54 | ### Step 5: Greet the User | COMMENT |
| LOW | skills/bmad-correct-course/SKILL.md | 58 | ### Step 6: Execute Append Steps | COMMENT |
| LOW | skills/bmad-prfaq/SKILL.md | 31 | ### Step 1: Resolve the Workflow Block | COMMENT |
| LOW⚡ | skills/bmad-prfaq/SKILL.md | 45 | ### Step 2: Execute Prepend Steps | COMMENT |
| LOW⚡ | skills/bmad-prfaq/SKILL.md | 49 | ### Step 3: Load Persistent Facts | COMMENT |
| LOW⚡ | skills/bmad-prfaq/SKILL.md | 53 | ### Step 4: Load Config | COMMENT |
| LOW⚡ | skills/bmad-prfaq/SKILL.md | 61 | ### Step 5: Greet the User | COMMENT |
| LOW⚡ | skills/bmad-prfaq/SKILL.md | 65 | ### Step 6: Execute Append Steps | COMMENT |
| LOW | skills/bmad-build-auto/step-04-review.md | 8 | # Step 4: Review | COMMENT |
| 90 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/bmad-eval/scripts/convert_cases.py | 12 | [{"id": "1", "input": "...", "rubric": [...], "state_prefix": null, "files": [...]}] | STRING |
| HIGH | skills/bmad-toolsmith/scripts/registry.py | 20 | "bmad": {"present": bool, "version": str|null}, | STRING |
| HIGH | skills/bmad-toolsmith/scripts/scan_legacy_module.py | 23 | "setup_skill": name or null, | STRING |
| HIGH | skills/bmad-brainstorming/scripts/brain.py | 250 | if (!t) { t = (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; } | CODE |
| HIGH | skills/bmad-brainstorming/scripts/brain.py | 423 | var sec = null; | CODE |
| HIGH | skills/bmad-brainstorming/scripts/brain.py | 438 | if (!b.checked || seen[b.dataset.name]) { return; } | CODE |
| HIGH | skills/bmad-brainstorming/scripts/brain.py | 440 | out.push(b); | CODE |
| HIGH | skills/bmad-brainstorming/scripts/brain.py | 468 | var show = !act.length || act.some(function(g){ return good.indexOf(g) >= 0; }); | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 483 | while (out.length < n && a.length){ out.push(a.splice(Math.floor(Math.random() * a.length), 1)[0]); } | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 483 | while (out.length < n && a.length){ out.push(a.splice(Math.floor(Math.random() * a.length), 1)[0]); } | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 493 | L.push("", 'Techniques to use:'); | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 495 | L.push((i + 1) + '.' + (t.r ? ' (random pick)' : '') + ' ' + t.n + ' · ' + t.c); | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 496 | L.push(' ' + t.d); | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 500 | if (state.inv > 0){ extra.push('invent ' + state.inv + ' brand-new technique' + (state.inv > 1 ? 's' : '') + ' on th | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 501 | checkedInvent().forEach(function(b){ extra.push('invent 1 new technique in the spirit of ' + b.dataset.invent); }); | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 502 | if (state.ai > 0){ extra.push('you choose ' + state.ai + ' more technique' + (state.ai > 1 ? 's' : '') + ' that fit | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 503 | if (extra.length){ L.push("", 'Then: ' + extra.join('; and ') + '.'); } | CODE |
| HIGH⚡ | skills/bmad-brainstorming/scripts/brain.py | 505 | L.push("", state.mode === 'Ideate for me' | CODE |
| HIGH | skills/bmad-brainstorming/scripts/brain.py | 536 | if (navigator.clipboard && navigator.clipboard.writeText){ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/bmad-prd/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-prd/customize.toml | 21 | COMMENT | |
| LOW | skills/bmad-prd/customize.toml | 41 | # to the product, project type, and domain. Override the path in team/user TOML | COMMENT |
| LOW | skills/bmad-prd/customize.toml | 61 | COMMENT | |
| LOW | skills/bmad-prd/customize.toml | 81 | # | COMMENT |
| LOW | skills/bmad-prd/customize.toml | 101 | # a registry consulted on demand and only when the conversation surfaces a | COMMENT |
| LOW | skills/bmad-prd/customize.toml | 121 | # Fired once at Finalize step 6, never during Discovery or drafting. | COMMENT |
| LOW | skills/bmad-prd/customize.toml | 141 | # subagent applying that prompt to the PRD | COMMENT |
| LOW | skills/bmad-retrospective/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-retrospective/customize.toml | 21 | activation_steps_append = [] | COMMENT |
| LOW | skills/bmad-eval/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-ux/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-ux/customize.toml | 41 | # visual identity work. The user runs the tool externally and saves outputs | COMMENT |
| LOW | skills/bmad-ux/customize.toml | 61 | COMMENT | |
| LOW | skills/bmad-ux/customize.toml | 81 | # names them; drop it to let bmad-review pick what fits the content. | COMMENT |
| LOW | skills/bmad-toolsmith/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | …h/shapes/rendered-skill/assets/customize-template.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | …-toolsmith/shapes/agent/assets/customize-template.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | …ith/shapes/memory-agent/assets/customize-template.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | …mith/shapes/plain-skill/assets/customize-template.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-product-brief/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-product-brief/customize.toml | 21 | COMMENT | |
| LOW | skills/bmad-product-brief/customize.toml | 41 | # to the product, purpose, and domain. Override the path in team/user TOML | COMMENT |
| LOW | skills/bmad-product-brief/customize.toml | 61 | # 2. Content/voice/conventions (org standards, tone, terminology, compliance) | COMMENT |
| LOW | skills/bmad-product-brief/customize.toml | 81 | # Examples (set in team/user override TOML): | COMMENT |
| LOW | skills/bmad-agent-pm/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-agent-pm/customize.toml | 21 | activation_steps_prepend = [] | COMMENT |
| LOW | skills/bmad-qa-generate-e2e-tests/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-qa-generate-e2e-tests/customize.toml | 21 | activation_steps_append = [] | COMMENT |
| LOW | skills/bmad-forge-idea/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-forge-idea/customize.toml | 21 | # (domain constraints, house rules, what's off the table). Each entry is a | COMMENT |
| LOW | skills/bmad-agent-ux-designer/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-agent-ux-designer/customize.toml | 21 | activation_steps_prepend = [] | COMMENT |
| LOW | skills/bmad-spec/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-spec/customize.toml | 21 | # Each entry is either a literal sentence, a skill prefixed with `skill:`, | COMMENT |
| LOW | skills/bmad-spec/customize.toml | 41 | # input-derived slug at activation. Same slug = same folder, so a | COMMENT |
| LOW | skills/bmad-correct-course/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-correct-course/customize.toml | 21 | activation_steps_append = [] | COMMENT |
| LOW | skills/bmad-deep-recon/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-deep-recon/customize.toml | 21 | COMMENT | |
| LOW | skills/bmad-deep-recon/customize.toml | 41 | # pins that knob over the preset. What the user says in the request beats | COMMENT |
| LOW | skills/bmad-deep-recon/customize.toml | 61 | COMMENT | |
| LOW | skills/bmad-deep-recon/customize.toml | 81 | # plan gate), or "on" (always; headless honors only "on"). high/max | COMMENT |
| LOW | skills/bmad-deep-recon/customize.toml | 101 | # credible; banned sources are never cited (their claims may still be leads | COMMENT |
| LOW | skills/bmad-deep-recon/customize.toml | 121 | # Default audience shaping for the synthesis — freeform, empty = balanced | COMMENT |
| LOW | skills/bmad-deep-recon/customize.toml | 141 | # Polish passes applied to the report at finalize. Entries are `skill:NAME` | COMMENT |
| LOW | skills/bmad-deep-recon/customize.toml | 161 | # two-source classes, downstream bindings) used by all three modes — it | COMMENT |
| LOW | skills/bmad-prfaq/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-prfaq/customize.toml | 21 | activation_steps_append = [] | COMMENT |
| LOW | skills/bmad-party-mode/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-party-mode/customize.toml | 21 | COMMENT | |
| LOW | skills/bmad-party-mode/customize.toml | 41 | # the session; an unsupported mode (e.g. agent-team outside Claude Code) falls back | COMMENT |
| LOW | skills/bmad-party-mode/customize.toml | 61 | # ephemeral until saved as a party. | COMMENT |
| LOW | skills/bmad-party-mode/customize.toml | 81 | # name display name | COMMENT |
| LOW | skills/bmad-party-mode/customize.toml | 161 | # (alias `--group <id>`) or switched to mid-session. Keyed by `id`. | COMMENT |
| LOW | skills/bmad-party-mode/customize.toml | 181 | # show up on the fly in a remembered party can be saved into its roster at the | COMMENT |
| LOW | skills/bmad-build-auto/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-review/customize.toml | 1 | # DO NOT EDIT -- overwritten on every update. | COMMENT |
| LOW | skills/bmad-review/customize.toml | 21 | COMMENT | |
| LOW | skills/bmad-review/customize.toml | 41 | # Example: | COMMENT |
| 30 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/bmad-build-auto/customize.toml | 0 | launch a context-free subagent with this prompt: read `{plan_file}` — the plan holding the acceptance criteria and inten | STRING |
| HIGH | skills/bmad-build/customize.toml | 0 | launch a context-free subagent with this prompt: read `{plan_file}` — the plan holding the acceptance criteria and inten | STRING |
| HIGH | skills/bmad-code-review/customize.toml | 0 | launch a context-free subagent with this prompt: read `{plan_file}` — the plan holding the acceptance criteria and inten | STRING |
| HIGH | skills/bmad-build-auto/customize.toml | 0 | launch a context-free subagent with this prompt: conduct a review of content. look for what's missing, not only what's w | STRING |
| HIGH | skills/bmad-build/customize.toml | 0 | launch a context-free subagent with this prompt: conduct a review of content. look for what's missing, not only what's w | STRING |
| HIGH | skills/bmad-code-review/customize.toml | 0 | launch a context-free subagent with this prompt: conduct a review of content. look for what's missing, not only what's w | STRING |
| HIGH | skills/bmad-build-auto/customize.toml | 0 | launch a context-free subagent with this prompt: read `{skill-root}/review-prompts/edge-case-hunter.md` completely and f | STRING |
| HIGH | skills/bmad-build/customize.toml | 0 | launch a context-free subagent with this prompt: read `{skill-root}/review-prompts/edge-case-hunter.md` completely and f | STRING |
| HIGH | skills/bmad-code-review/customize.toml | 0 | launch a context-free subagent with this prompt: read `{skill-root}/review-prompts/edge-case-hunter.md` completely and f | STRING |
| HIGH | skills/bmad-build-auto/customize.toml | 0 | launch a context-free subagent with this prompt: read `{skill-root}/review-prompts/verification-gap.md` completely and f | STRING |
| HIGH | skills/bmad-build/customize.toml | 0 | launch a context-free subagent with this prompt: read `{skill-root}/review-prompts/verification-gap.md` completely and f | STRING |
| HIGH | skills/bmad-code-review/customize.toml | 0 | launch a context-free subagent with this prompt: read `{skill-root}/review-prompts/verification-gap.md` completely and f | STRING |
| HIGH | skills/bmad-build-auto/customize.toml | 0 | launch a subagent with this prompt: you are an intent-alignment auditor. you have no other context about how this change | STRING |
| HIGH | skills/bmad-build/customize.toml | 0 | launch a subagent with this prompt: you are an intent-alignment auditor. you have no other context about how this change | STRING |
| HIGH | skills/bmad-code-review/customize.toml | 0 | launch a subagent with this prompt: you are an intent-alignment auditor. you have no other context about how this change | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs-site/scripts/validate-sidebar-order.js | 27 | // ── Main ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs-site/scripts/validate-sidebar-order.js | 101 | // ── Directory classification ───────────────────────────────────────────── | COMMENT |
| MEDIUM | docs-site/scripts/validate-sidebar-order.js | 121 | // ── Per-directory validation ───────────────────────────────────────────── | COMMENT |
| MEDIUM | docs-site/scripts/validate-sidebar-order.js | 200 | // ── Cross-language drift ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs-site/scripts/validate-sidebar-order.js | 257 | // ── Output ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs-site/scripts/validate-sidebar-order.js | 315 | // ── Leaf helpers ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | skills/bmad-deep-recon/customize.toml | 158 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/bmad-deep-recon/customize.toml | 176 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/bmad-party-mode/customize.toml | 74 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/bmad-party-mode/customize.toml | 93 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/bmad-party-mode/customize.toml | 159 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/bmad-party-mode/customize.toml | 197 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/bmad-review/customize.toml | 81 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/bmad-review/customize.toml | 105 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CHANGELOG.md | 198 | * **Pass diff inline to the blind-hunter reviewer** (#2463). Diff output is passed inline in the subagent prompt rather | COMMENT |
| MEDIUM | skills/bmad-prd/customize.toml | 23 | # (standards, compliance constraints, stylistic guardrails). | COMMENT |
| MEDIUM | skills/bmad-retrospective/customize.toml | 24 | # (standards, compliance constraints, stylistic guardrails). | COMMENT |
| MEDIUM | skills/bmad-product-brief/customize.toml | 23 | # (standards, compliance constraints, stylistic guardrails). | COMMENT |
| MEDIUM | skills/bmad-qa-generate-e2e-tests/customize.toml | 24 | # (standards, compliance constraints, stylistic guardrails). | COMMENT |
| MEDIUM | skills/bmad-correct-course/customize.toml | 24 | # (standards, compliance constraints, stylistic guardrails). | COMMENT |
| MEDIUM⚡ | skills/bmad-deep-recon/customize.toml | 86 | # orchestration when it offers one (e.g. workflows): "off", "offer" | COMMENT |
| MEDIUM | skills/bmad-prfaq/customize.toml | 24 | # (standards, compliance constraints, stylistic guardrails). | COMMENT |
| MEDIUM | skills/bmad-build-auto/plan-template.md | 17 | warnings: [] # optional: machine-readable warnings for orchestration, e.g. oversized, multiple-goals | CODE |
| MEDIUM | skills/bmad-brainstorming/customize.toml | 23 | # (domain constraints, house rules, stylistic guardrails). Each entry is a | COMMENT |
| MEDIUM | skills/bmad-walkthrough/customize.toml | 19 | # (standards, compliance constraints, stylistic guardrails). | COMMENT |
| MEDIUM | skills/bmad-code-review/customize.toml | 24 | # (standards, compliance constraints, stylistic guardrails). | COMMENT |
| MEDIUM | skills/bmad-architecture/customize.toml | 23 | # (approved stacks, banned dependencies, platform constraints, compliance guardrails). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/dogfood.py | 32 | CODE | |
| LOW | tools/validate_skills.py | 30 | CODE | |
| LOW | tools/quality.py | 11 | CODE | |
| LOW | tools/validate_file_refs.py | 35 | CODE | |
| LOW | …lls/bmad-customize/scripts/list_customizable_skills.py | 29 | CODE | |
| LOW | …stomize/scripts/tests/test_list_customizable_skills.py | 19 | CODE | |
| LOW | skills/bmad-eval/scripts/convert_cases.py | 25 | CODE | |
| LOW | skills/bmad-eval/scripts/run_triggers.py | 37 | CODE | |
| LOW | skills/bmad-eval/scripts/eval_common.py | 23 | CODE | |
| LOW | skills/bmad-eval/scripts/aggregate_benchmark.py | 36 | CODE | |
| LOW | skills/bmad-eval/scripts/run_evals.py | 43 | CODE | |
| LOW | …lsmith/shapes/script-utility/assets/script-template.py | 13 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/scan_paths.py | 35 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/init_skill.py | 36 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/count_tokens.py | 20 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/registry.py | 28 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/read_session_log.py | 32 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/prepass.py | 33 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/process_template.py | 26 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/scan_legacy_module.py | 33 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/scan_scripts.py | 30 | CODE | |
| LOW | skills/bmad/scripts/render_skill.py | 8 | CODE | |
| LOW | skills/bmad/scripts/validate_manifests.py | 15 | CODE | |
| LOW | skills/bmad/scripts/stamp_release.py | 30 | CODE | |
| LOW | skills/bmad/scripts/setup_check.py | 16 | CODE | |
| LOW | skills/bmad/scripts/setup.py | 7 | CODE | |
| LOW | skills/bmad/scripts/memlog.py | 73 | CODE | |
| LOW | skills/bmad/scripts/knowledge.py | 35 | CODE | |
| LOW | skills/bmad/scripts/config_utils.py | 3 | CODE | |
| LOW | skills/bmad/scripts/roster.py | 22 | CODE | |
| LOW | skills/bmad/scripts/tests/test_render_skill.py | 10 | CODE | |
| LOW | skills/bmad-deep-recon/scripts/recon_kit.py | 32 | CODE | |
| LOW | skills/bmad-architecture/scripts/lint_spine.py | 25 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/bmad/scripts/setup.py | 2173 | except (ValueError, tomllib.TOMLDecodeError): | CODE |
| HIGH | skills/bmad-party-mode/scripts/resolve_party.py | 128 | except (OSError, tomllib.TOMLDecodeError): | CODE |
| HIGH | skills/bmad-ticket/scripts/tickets.py | 1279 | except (TicketError, OSError, ValueError): # a backlog that cannot be read holds no match | CODE |
| HIGH | skills/bmad-ticket/scripts/tickets.py | 185 | except ValueError: | CODE |
| HIGH | skills/bmad-ticket/scripts/tickets.py | 879 | except TicketError: # none set: the store and the project root | CODE |
| HIGH | skills/bmad-ticket/scripts/tickets.py | 1331 | except OSError: # keep restoring the rest; the first failure is the one reported | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/validate_skills.py | 712 | print(f'Error: "{skill_dir}" is not a valid directory.', file=sys.stderr) | CODE |
| LOW | skills/bmad-retrospective/scripts/git_evidence.py | 108 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | skills/bmad-eval/scripts/run_evals.py | 332 | except Exception as e: | CODE |
| LOW | skills/bmad-toolsmith/scripts/count_tokens.py | 36 | except Exception: | CODE |
| LOW | skills/bmad-toolsmith/scripts/count_tokens.py | 40 | except Exception: | CODE |
| LOW | skills/bmad/scripts/render_skill.py | 478 | except Exception as error: | CODE |
| LOW | skills/bmad/scripts/render_skill.py | 628 | except Exception: | CODE |
| LOW | skills/bmad/scripts/validate_manifests.py | 74 | except Exception as error: | CODE |
| LOW | skills/bmad/scripts/validate_manifests.py | 87 | except Exception as error: | CODE |
| LOW | skills/bmad/scripts/validate_manifests.py | 435 | except Exception as error: | CODE |
| MEDIUM | skills/bmad/scripts/stamp_release.py | 114 | print(f"Error: {error}", file=sys.stderr) | CODE |
| LOW | skills/bmad/scripts/resolve_customization.py | 162 | except Exception: | CODE |
| LOW | skills/bmad/scripts/setup_check.py | 139 | except Exception: | CODE |
| LOW | skills/bmad/scripts/setup.py | 998 | except Exception: | CODE |
| LOW | skills/bmad/scripts/setup.py | 1022 | except Exception: | CODE |
| LOW | skills/bmad/scripts/setup.py | 1175 | except Exception as error: | CODE |
| LOW | skills/bmad/scripts/setup.py | 1282 | except Exception: | CODE |
| LOW | skills/bmad/scripts/setup.py | 1325 | except Exception as error: | CODE |
| LOW | skills/bmad/scripts/setup.py | 1743 | except Exception as error: | CODE |
| LOW | skills/bmad/scripts/setup.py | 1827 | except Exception as error: | CODE |
| LOW | skills/bmad/scripts/setup.py | 1850 | except Exception as error: | CODE |
| LOW | skills/bmad/scripts/setup.py | 2031 | except Exception: | CODE |
| LOW | skills/bmad/scripts/setup.py | 2291 | except Exception: | CODE |
| LOW | skills/bmad/scripts/setup.py | 2305 | except Exception: | CODE |
| LOW | skills/bmad/scripts/setup.py | 2502 | except Exception as error: | CODE |
| MEDIUM | skills/bmad/scripts/setup.py | 2499 | def cli() -> int: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | skills/bmad-eval/scripts/eval_common.py | 72 | # --- harness ----------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | skills/bmad-deep-recon/customize.toml | 85 | # Run the acquisition fan-out through the harness's deterministic | COMMENT |
| MEDIUM⚡ | skills/bmad-deep-recon/customize.toml | 92 | # harness can provide wins; [] lets the harness/skill choose (lead stays on | COMMENT |
| MEDIUM | skills/bmad-project-context/customize.toml | 15 | # harness, not through this array. Users append their own standing facts. | COMMENT |
| MEDIUM⚡ | skills/bmad-brainstorming/assets/brain-selector.html | 134 | <section data-cat="Proven & Professional" style="--c:#3d4f73"><h2>Proven & Professional<span class="cnt">29</spa | CODE |
| MEDIUM⚡ | skills/bmad-brainstorming/assets/brain-selector.html | 134 | <section data-cat="Proven & Professional" style="--c:#3d4f73"><h2>Proven & Professional<span class="cnt">29</spa | CODE |
| MEDIUM⚡ | skills/bmad-brainstorming/assets/brain-selector.html | 137 | <section data-cat="Deep" style="--c:#4658c9"><h2>Deep<span class="cnt">13</span></h2><div class="grid"><label class="tec | CODE |
| MEDIUM⚡ | skills/bmad-brainstorming/assets/brain-selector.html | 137 | <section data-cat="Deep" style="--c:#4658c9"><h2>Deep<span class="cnt">13</span></h2><div class="grid"><label class="tec | CODE |
| MEDIUM⚡ | …lls/bmad-architecture/scripts/tests/test_lint_spine.py | 248 | # an unfilled {scope}/{paradigm}/{date} in frontmatter is part of the contract and must lint | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/validate_skills.py | 156 | CODE | |
| LOW | tools/validate_skills.py | 293 | CODE | |
| LOW | tools/validate_skills.py | 569 | CODE | |
| LOW | tools/validate_file_refs.py | 337 | CODE | |
| LOW | tools/tests/test_bmad_setup.py | 1391 | CODE | |
| LOW | …lls/bmad-customize/scripts/list_customizable_skills.py | 89 | CODE | |
| LOW | skills/bmad-eval/scripts/run_triggers.py | 151 | CODE | |
| LOW | skills/bmad-eval/scripts/eval_common.py | 236 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/init_skill.py | 200 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/registry.py | 74 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/read_session_log.py | 125 | CODE | |
| LOW | skills/bmad-toolsmith/scripts/read_session_log.py | 171 | CODE | |
| LOW | skills/bmad/scripts/validate_manifests.py | 226 | CODE | |
| LOW | skills/bmad/scripts/setup_check.py | 34 | CODE | |
| LOW | skills/bmad/scripts/setup.py | 1379 | CODE | |
| LOW | skills/bmad/scripts/setup.py | 1582 | CODE | |
| LOW | skills/bmad/scripts/knowledge.py | 118 | CODE | |
| LOW | skills/bmad/scripts/config_utils.py | 38 | CODE | |
| LOW | skills/bmad/scripts/tests/test_render_skill.py | 303 | CODE | |
| LOW | skills/bmad-review/scripts/word_metrics.py | 35 | CODE | |
| LOW | skills/bmad-ticket/scripts/tickets.py | 237 | CODE | |
| LOW | skills/bmad-ticket/scripts/tickets.py | 602 | CODE | |
| LOW | skills/bmad-ticket/scripts/tickets.py | 1264 | CODE | |
| LOW | skills/bmad-brainstorming/scripts/brain.py | 719 | CODE | |
| LOW | skills/bmad-architecture/scripts/lint_spine.py | 162 | CODE | |
| LOW | …ills/bmad-advanced-elicitation/scripts/pick_methods.py | 180 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/bmad-ticket/references/slice.md | 69 | - Split, never shrink: "for now", "placeholder", "simplified", "wired later" is a second story. | CODE |
| LOW | skills/bmad-architecture/scripts/lint_spine.py | 83 | "category": "placeholder", | CODE |
| LOW | skills/bmad-architecture/scripts/lint_spine.py | 103 | "category": "placeholder", | CODE |
| LOW⚡ | …lls/bmad-architecture/scripts/tests/test_lint_spine.py | 71 | assert "placeholder" not in cats(result) | STRING |
| LOW⚡ | …lls/bmad-architecture/scripts/tests/test_lint_spine.py | 77 | assert "placeholder" in cats(result) | STRING |
| LOW⚡ | …lls/bmad-architecture/scripts/tests/test_lint_spine.py | 89 | assert any(f["category"] == "placeholder" for f in result["findings"]) | STRING |
| LOW⚡ | …lls/bmad-architecture/scripts/tests/test_lint_spine.py | 155 | toks = [f for f in result["findings"] if f["category"] == "placeholder" and "template token" in f["detail"]] | STRING |
| LOW⚡ | …lls/bmad-architecture/scripts/tests/test_lint_spine.py | 162 | assert "placeholder" in cats(result) # TBD caught even with no frontmatter | STRING |
| LOW⚡ | …lls/bmad-architecture/scripts/tests/test_lint_spine.py | 251 | fm = [f for f in result["findings"] if f["category"] == "placeholder" and "frontmatter" in f["detail"]] | STRING |
| LOW⚡ | …lls/bmad-architecture/scripts/tests/test_lint_spine.py | 259 | f["category"] == "placeholder" and "frontmatter" in f["detail"] and "TBD" in f["detail"] | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/validate_file_refs.py | 405 | # Print results — file header appears once, in one place | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/tests/test_bmad_setup.py | 179 | CODE | |
| LOW | skills/bmad-ticket/scripts/tests/test_tickets.py | 15 | CODE |