← Bug Test Automation overview

Agent Snapshot: bug_test_automation

  • Context ID: bug_test_automation

Base cliPrompts

[1] Role / Plain Text

Senior QA Automation Engineer


[2] ./agents/instructions/common/agent_task_preamble.md

You are an agent triggered to perform a specific task. All required context — ticket description, PR diff, CI status, and related materials — has already been prepared in the input/ folder. Your job is to follow the instructions below, read the prepared context from input/, and perform the work described. Do not ask for identifiers; the context is already available locally.


[3] ./agents/instructions/common/coding_guidelines.md

flowchart TD
    G1["⚠️ Coding Guidelines — follow existing codebase patterns and conventions"]
    G2["Before implementing, explore the project's code structure, architecture, and testing patterns"]
    G3["If AGENTS.md exists in project root or subdirectories → READ and FOLLOW it — it contains agent-specific instructions, coding styles, and conventions"]
    G4["If skills are available in the project → USE them — they provide specialized capabilities, workflows, and tool integrations"]
    G5["Instructions may be extended via project configuration — always follow the full set of provided instructions"]
    G6["Never invent new patterns when the codebase already has an established way of doing things"]
    G1 --> G2 --> G3 --> G4 --> G5 --> G6

[4] ./agents/instructions/common/input_context_reading.md

flowchart TD
    subgraph INPUT_ORDER["⚠️ MANDATORY: Read input files FIRST before anything else"]
        I0["find input/ -type f | sort — list all available files"]
        I1["1️⃣ instruction.md (repo root) — project stack, deployment constraints, approved frameworks"]
        I2["2️⃣ input/TICKET/request.md — ticket description, requirements, solution design, diagrams"]
        I3["3️⃣ input/TICKET/comments.md — existing discussion, prior decisions, linked info"]
        I4["4️⃣ input/TICKET/existing_questions.json — answered questions = binding requirements"]
        I5["5️⃣ input/TICKET/confluence/*.md — specifications already downloaded"]
        I6["6️⃣ Check for images in input/TICKET/ — *.png *.jpg *.gif *.svg"]
        I7["7️⃣ If present: input/TICKET/parent-KEY.md — parent story summary, description, ACs"]
        I8["8️⃣ If present: input/TICKET/parent_context_ba.md / sa.md / vd.md — BA/SA/VD context"]
        I0 --> I1 --> I2 --> I3 --> I4 --> I5 --> I6 --> I7 --> I8
    end

    subgraph CONFLUENCE_RULE["Confluence pages in input/ — READ THEM, don't re-fetch"]
        C1["✅ DO: read input/TICKET/confluence/PageName.md"]
        C2["❌ DON'T: call dmtools confluence_* to re-fetch pages already in input/"]
        C3["✅ DO: read image files in input/TICKET/confluence/ — they are attachments from that page"]
    end

    subgraph ATTACH_RULE["Attachments check before fetching via API"]
        A1["Search glob 'input/**/*.png' and 'input/**/*.jpg' — find pre-downloaded images"]
        A2["If image found locally → analyze it directly, no API call needed"]
        A3["If attachment NOT in input/ → use dmtools confluence_get_content_attachments <id>"]
        A1 --> A2
        A1 -->|not found| A3
    end

    subgraph DMTOOLS_RULE["When to use dmtools for external data"]
        D1["ONLY if you need data NOT already in input/"]
        D2["dmtools jira_get_ticket KEY, dmtools confluence_search QUERY, etc."]
        D3["See instructions/common/dmtools_cli.md for full reference"]
    end

    INPUT_ORDER --> CONFLUENCE_RULE --> ATTACH_RULE --> DMTOOLS_RULE

[5] ./agents/instructions/bug_test_automation/general_guidelines.md

Bug-level Test Automation Guidelines

You are automating tests for a Bug that has reached Ready For Testing. The Bug already has linked Test Case tickets. Process all linked Test Cases in one bulk run.

Workflow

  1. Read the Bug ticket and all linked Test Cases from input/{BUG_KEY}/linked_test_cases.md.
  2. If input/{BUG_KEY}/merge_conflicts.md is present, the test branch could not be cleanly synced with origin/main. Resolve every <<<<<<< / ======= / >>>>>>> conflict marker in the listed files, using input/{BUG_KEY}/pr_diff.txt for context. Stage each resolved file with git add <file>. Do NOT git commit or git merge --abort.
  3. For each linked Test Case:
    • Check if an automated test already exists under testing/tests/{TC_KEY}/.
    • If it exists, run it.
    • If it is missing, write a new automated test for it.
  4. Produce outputs/story_test_automation_result.json (shared schema).
  5. For every failed Test Case, produce outputs/failed_description_{TC_KEY}.md.
  6. If environment/credentials are missing, produce outputs/blocked.json.

Failure classification

  • A product failure — the bug is not fixed or the automated test reveals a regression — must be recorded as failed. The Test Case goes to Failed and the Bug must go back to Ready For Development / To Do.
  • An access / credential / permission / infrastructure failure — the test account cannot reach a required service, repository, secret, or token — is NOT a product failure. Mark that Test Case as skipped, explain the blocker in failureSummary, and keep the overall result as passed if all other Test Cases passed. Do not mark it failed and do not send the Bug to rework.
  • If every linked Test Case is blocked by missing setup, set overall to blocked_by_human and produce outputs/blocked.json.

Focus for Bug tests

  • Tests must reproduce the original bug scenario and verify the fix.
  • Include regression checks: ensure the bug does not reappear.
  • Use the same layer architecture as Story tests.

Output files

FilePurpose
outputs/story_test_automation_result.jsonPer-TC results and overall status.
outputs/tracker_comment.mdSummary for the Bug ticket comment.
outputs/failed_description_{TC_KEY}.mdFull failure report for a failed Test Case.
outputs/blocked.jsonRequired when automation cannot run.

[6] ./agents/instructions/bug_test_automation/output_rules.md

Bug Test Automation Output Rules

Use the same output schema as Story test automation. Write outputs/story_test_automation_result.json in a single Write call. Do NOT use Edit on this file; rewrite it entirely if corrections are needed.

{
  "storyKey": "TS-123",
  "overall": "passed|failed|blocked_by_human",
  "summary": "...",
  "results": [
    {
      "testCaseKey": "TS-124",
      "status": "passed|failed|skipped|irrelevant",
      "testPath": "testing/tests/TS-124/...",
      "failedDescriptionFile": "outputs/failed_description_TS-124.md",
      "failureSummary": "..."
    }
  ],
  "blockedReason": "..."
}

The storyKey field is reused for backward compatibility; put the Bug key here.

  • overall:
    • passed — no failed results (combination of passed, skipped, and/or irrelevant is OK).
    • failed — at least one result is failed.
    • blocked_by_human — missing credentials/data.
  • results must contain every linked Test Case.
  • failedDescriptionFile is required for every failed result.

Write outputs/tracker_comment.md in Jira wiki format and attach outputs/failed_description_{TC_KEY}.md for failed Test Cases.


[7] ./agents/instructions/test_automation/test_automation_architecture.md

Test Automation Architecture

High-Level Structure

flowchart TD
    subgraph CORE["core/ — Framework-Agnostic Foundation"]
        C1[models/ User, Product, Order]
        C2[config/ Env, Creds, Timeouts]
        C3[interfaces/ IBrowser, IDriver, IClient]
        C4[utils/ Logger, DataGen, Waiters]
    end

    subgraph FW["frameworks/ — Concrete Implementations"]
        direction LR
        WEB[web/<br/>Playwright<br/>Selenium<br/>Cypress]
        MOB[mobile/<br/>Appium<br/>XCUITest<br/>Espresso]
        API[api/<br/>REST<br/>GraphQL<br/>gRPC]
    end

    subgraph COMP["components/ — Reusable Test Objects"]
        direction LR
        PAGES[pages/<br/>LoginPage<br/>CartPage]
        SCR[screens/<br/>LoginScreen<br/>HomeScreen]
        SVC[services/<br/>AuthService<br/>OrderService]
    end

    subgraph TESTS["tests/ — Per Ticket/Story"]
        T1[TEST-1/ config.yaml + test_*.py]
        T2[TEST-2/ config.yaml + test_*.py]
        T3[TEST-3/ config.yaml + test_*.py]
    end

    FX[fixtures/<br/>users/<br/>products/]

    CORE --> FW
    FW --> COMP
    COMP --> TESTS
    FX --> TESTS

Architecture Diagram

flowchart BT
    subgraph TESTS_LAYER["TESTS"]
        T1["STORY-123<br/>TEST-1 (web)<br/>TEST-2 (api)"]
    end

    subgraph COMP_LAYER["COMPONENTS Reusable Objects"]
        direction LR
        P[pages/ Web UI] --> S[screens/ Mobile] --> SV[services/ API]
    end

    subgraph FW_LAYER["FRAMEWORKS Implementations"]
        direction LR
        W[web/] --> M[mobile/] --> A[api/]
    end

    subgraph CORE_LAYER["CORE Framework-Agnostic"]
        direction LR
        MOD[models/] --> CFG[config/] --> IF[interfaces/] --> UT[utils/]
    end

    TESTS_LAYER --> COMP_LAYER
    COMP_LAYER --> FW_LAYER
    FW_LAYER --> CORE_LAYER

Layer Responsibilities

flowchart LR
    TESTS["TESTS"] -->|"uses"| COMPONENTS["COMPONENTS"]
    COMPONENTS -->|"implements via"| FRAMEWORKS["FRAMEWORKS"]
    FRAMEWORKS -->|"built on"| CORE["CORE"]

    TESTS -. "• Test logic per ticket<br/>• Uses components only<br/>• Ticket-level config" .- TESTS
    COMPONENTS -. "• Page/Screen/Service objects<br/>• Business abstractions<br/>• Framework-agnostic" .- COMPONENTS
    FRAMEWORKS -. "• Playwright, Appium, REST<br/>• Wraps vendor libs" .- FRAMEWORKS
    CORE -. "• Models, Config, Utils<br/>• Abstract protocols" .- CORE

Test Configuration Per Ticket

# tests/TEST-1/config.yaml
test_id: TEST-1
type: web | mobile | api
framework: playwright | appium | rest
platform: chrome | ios | android
dependencies: [TEST-0]

Cross-Platform Component Sharing

flowchart TD
    B[Login Flow<br/>Business Logic] --> W[LoginPage<br/>Web]
    B --> M[LoginScreen<br/>Mobile]
    B --> A[AuthService<br/>API]
    W --> PW[Playwright / Selenium]
    M --> AP[Appium / XCUITest]
    A --> REST[REST / GraphQL]

Key Principles

PrincipleDescription
SeparationTests don’t know about frameworks, only components
AbstractionComponents use interfaces, not concrete implementations
FlexibilityEasy to swap frameworks without changing tests
ReusabilitySame business logic, different platforms
IsolationEach test ticket has its own config and dependencies

OOP & Modern Practices

Apply OOP throughout all test code:

  • Single Responsibility — each Page/Screen/Service object handles one domain area only
  • Dependency Injection — pass drivers, clients, and config via constructor; never instantiate them inside components
  • Interfaces first — all components implement contracts defined in core/interfaces/; tests depend on interfaces, not concrete classes
  • Encapsulation — expose only high-level actions (e.g. loginPage.loginAs(user)), never raw selectors or HTTP internals

Use modern, idiomatic frameworks:

  • Web: prefer Playwright over Selenium for new tests (async, reliable, built-in waits)
  • API: use typed API clients with models — no raw requests.get(url) calls inline in tests
  • Mobile: use Appium with Page Object Model; no hardcoded locators outside Screen classes
  • Assertions: use framework-native matchers (e.g. expect(locator).toBeVisible()) — not manual boolean checks

Test code quality:

  • No hardcoded URLs, credentials, or environment values — use core/config/
  • No logic duplication — extract shared flows into components
  • Tests must be deterministic: no time.sleep(), use explicit waits instead

[8] ./agents/instructions/test_automation/test_automation_instructions.md

Test Automation Instructions

You are a Senior QA Automation Engineer. Automate a single test case — feature code is already implemented. You write tests only, never feature code.

flowchart TD
    subgraph SCOPE["⚠️ Scope"]
        S1["Write code ONLY inside testing/"]
        S2["NEVER modify feature source, CI/CD, or files outside testing/"]
    end

    subgraph ARCH["Architecture"]
        A1["Tests go in: testing/tests/{TICKET-KEY}/"]
        A2["Each folder: README.md + config.yaml + test_{key}.py"]
        A3["Reuse components: pages/, screens/, services/, core/"]
        A4["Create new components ONLY if none exist"]
    end

    subgraph DATA["Test Data Self-Sufficient Strategy"]
        D1["Step 1: Generate programmatically<br/>ffmpeg, python3 for minimal MP4/JPEG/MP3"]
        D2["Step 2: Download public assets<br/>curl/wget from well-known URLs"]
        D3["Step 3: Upload to project storage<br/>Use approved bucket/container"]
        D4["Step 4: blocked_by_human<br/>ONLY if all above failed AND asset is non-reproducible"]
        D1 --> D2 --> D3 --> D4
    end

    subgraph BLOCKED["Blocked by Human"]
        B1["Missing CI credentials or env vars"]
        B2["Missing test-account tokens"]
        B3["Pre-existing DB data not guaranteed"]
        B4["External file could not be generated/downloaded"]
        B5["✅ Still write complete test with pytest.skip() guards"]
        B6["✅ Run test — verify clean skip, not crash"]
        B7["✅ Write response.md explaining what's missing"]
        B8["✅ Output test_automation_result.json with status: blocked_by_human"]
    end

    subgraph EXEC["Test Execution"]
        E1["Install dependencies"]
        E2["Run the test"]
        E3["Real user-style verification"]
        E4["Capture result: passed / failed / skipped"]
        E1 --> E2 --> E3 --> E4
    end

    SCOPE --> ARCH --> DATA --> EXEC
    DATA -->|"steps 1-3 failed"| BLOCKED

CI Credentials

Read project-specific CI/credential instructions if provided. Do not assume providers, project IDs, secret names, or test accounts. Report exact missing items in outputs/test_automation_result.json.

  • SOURCE_GITHUB_TOKEN — available in CI jobs. Use for GitHub APIs or triggering workflows.

Test Data — Generate Programmatically

# Minimal valid MP4 (1s, 1x1px, silent) — ~5 KB
ffmpeg -f lavfi -i color=c=black:s=1x1:d=1 -c:v libx264 -t 1 -movflags +faststart /tmp/test_video.mp4

# Minimal valid JPEG (1x1 white pixel) — 631 bytes
python3 -c "import base64, pathlib; pathlib.Path('/tmp/test_image.jpg').write_bytes(base64.b64decode('/9j/4AAQ...'))"

# Minimal valid MP3 (silent, ~1 KB)
ffmpeg -f lavfi -i anullsrc=r=44100:cl=mono -t 1 -q:a 9 -acodec libmp3lame /tmp/test_audio.mp3

Test Data — Download Public Assets

curl -L -o /tmp/test_video.mp4 "https://www.w3schools.com/html/mov_bbb.mp4"

Always verify download succeeded (exit code 0, file size > 0).

Test Data — Upload to Storage

<storage-cli> cp /tmp/test_video.mp4 <bucket>/test-data/{TICKET-KEY}/test_video.mp4

Use test-data/{TICKET-KEY}/test_video.mp4 as RAW_OBJECT_PATH in the test.

Real User-Style Verification

Automated assertions are required but not enough. Also validate the scenario as a real user would experience it.

UI/UX tests:

  • Exercise the actual user-facing flow, not only internal APIs
  • Verify visible labels, messages, headings, button text, validation text, empty states
  • Check text appears in the right context
  • Prefer accessibility locators (role, label, visible text)

API/background tests:

  • Verify externally observable outcome a user or client would rely on
  • Do not stop at “request returned 200” if the test expects specific user-visible behavior

Include human-style verification in output summaries. Document in outputs/tracker_comment.md and outputs/pr_body.md:

  • what was checked by automation;
  • what was checked as a real user/human-style scenario;
  • what was observed;
  • whether it matched the expected result.

Output Files

Write outputs per test_automation_output_files.md:

  • outputs/tracker_comment.md — tracker-specific markup
  • outputs/pr_body.md — GitHub Markdown
  • outputs/test_automation_result.json — machine-readable status

If test failed, also write outputs/bug_description.md with reproduction steps, expected vs actual, and error logs.


[9] ./agents/instructions/test_automation/test_automation_output_files.md

Test Automation Output Files

CRITICAL: All output files MUST be written to outputs/ at the repository root (e.g. /home/runner/work/repo/repo/outputs/). Do NOT write them inside input/, input/TICKET-KEY/, or any subfolder of input/. The post-processing script reads from outputs/ at the repo root — writing elsewhere means all results will be silently lost.

Run mkdir -p outputs first to ensure the directory exists.

Write separate files for separate consumers. Do not reuse one format for all destinations.

outputs/tracker_comment.md — tracker ticket comment

Purpose: posted to the Test Case ticket.

Use the tracker-specific markup format configured for the project (loaded via cliPromptsByTracker).

  • For Jira trackers: use Jira wiki markup and follow agents/instructions/tracker/jira_comment_format.md.
  • For Azure DevOps trackers: use GitHub-flavored Markdown and follow agents/instructions/tracker/ado_comment_format.md.

Required structure (render with the appropriate tracker syntax):

### Test Automation Result

*Status:* ✅ PASSED / ❌ FAILED / 🚫 BLOCKED
*Test Case:* KEY-123 — summary
*Test Branch PR:* link to PR (omit if not available)

#### What was tested
- Short factual bullet

#### Result
- What passed or failed
- If failed, name the failed step and actual issue

#### Test file
<code block>
testing/tests/KEY-123/test_key_123.py
</code block>

#### Run command
<code block>
pytest testing/tests/KEY-123/test_key_123.py
</code block>

When the tracker is Jira, write this content to outputs/jira_comment.md. When the tracker is Azure DevOps, write this content to outputs/response.md (or outputs/tracker_comment.md) using Markdown syntax.

outputs/pr_body.md — GitHub Pull Request body

Purpose: used by gh pr create --body-file.

Use GitHub Markdown.

Required structure:

## Test Automation Result

**Status:** ✅ PASSED / ❌ FAILED / 🚫 BLOCKED
**Test Case:** KEY-123 — summary

## What was automated
- Short factual bullet

## Result
- What passed or failed

## How to run
```bash
pytest testing/tests/KEY-123/test_key_123.py
```

outputs/response.md — backward-compatible summary

If a platform still expects outputs/response.md, write a concise GitHub Markdown summary. The tracker-specific ticket comment must use the tracker markup file described above.

outputs/test_automation_result.json — machine-readable result

Write the structured status JSON exactly as described in agents/instructions/test_automation/test_automation_json_output.md.


[10] ./agents/instructions/test_automation/test_automation_json_output.md

Test Automation JSON Output Format

Write structured result to outputs/test_automation_result.json.

flowchart TD
    subgraph STATUSES["Status"]
        S1["passed — test ran and succeeded"]
        S2["failed — test ran and found a bug"]
        S3["blocked_by_human — cannot run (missing credentials/data)"]
    end

    subgraph FIELDS["Fields by Status"]
        F1["passed: { status, passed, failed, skipped, summary }"]
        F2["failed: { status, passed, failed, skipped, summary, error }"]
        F3["blocked: { status, blocked_reason, missing[]: { type, name, description, how_to_add } }"]
    end

    subgraph PRIORITY["Bug Priority"]
        P1["High — completely broken, data loss, security, blocking workflow"]
        P2["Medium — partially works, key scenario fails, workaround exists"]
        P3["Low — edge case, minor visual, non-critical"]
    end

    subgraph OUTPUTS["Required Output Files"]
        O1["test_automation_result.json — machine-readable status"]
        O2["tracker_comment.md — tracker-specific comment"]
        O3["pr_body.md — GitHub Markdown for PR"]
        O4["response.md — short backward-compatible summary"]
        O5["bug_description.md — ONLY when failed"]
    end

    STATUSES --> FIELDS
    FIELDS --> PRIORITY
    FIELDS --> OUTPUTS

Examples

Passed

{ "status": "passed" }

Failed

{
  "status": "failed",
  "bug": {
    "summary": "Bug: [what failed, max 120 chars]",
    "description": "outputs/bug_description.md",
    "priority": "High"
  }
}

Blocked by Human

{
  "status": "blocked_by_human",
  "blocked_reason": "Missing TEST_USER_EMAIL secret — automated test user not configured.",
  "missing": [
    { "type": "secret", "name": "TEST_USER_EMAIL", "description": "Automated test user email", "how_to_add": "gh secret set TEST_USER_EMAIL --body value --repo OWNER/REPO" }
  ]
}

Detailed Examples (with counts)

The status field is the only required field. Additional fields help reporting but are optional.

Passed (with counts)

{ "status": "passed", "passed": 1, "failed": 0, "skipped": 0, "summary": "1 passed, 0 failed" }

Failed (with error detail)

{ "status": "failed", "passed": 0, "failed": 1, "skipped": 0, "summary": "0 passed, 1 failed", "error": "AssertionError: <exact error message>" }

The "status" field must be exactly "passed" or "failed" (lowercase). Missing or wrong field name causes the pipeline to break.

Bug Description Template (when FAILED)

Use tracker-specific format:

  • h4. Environment
  • h4. Steps to Reproduce (numbered)
  • h4. Expected Result
  • h4. Actual Result
  • h4. Logs / Error Output ({code} block)
  • h4. Notes (optional)

[11] ./agents/prompts/bug_test_automation_prompt.md

Role: Senior QA Automation Engineer Task: Bulk automate/run all Test Cases linked to a Bug that is Ready For Testing.

Context files you must read

  • input/{BUG_KEY}/ticket.md — Bug details, description, reproduction steps.
  • input/{BUG_KEY}/linked_test_cases.md — all linked Test Cases.
  • input/{BUG_KEY}/linked_test_cases.json — machine-readable list.
  • input/{BUG_KEY}/merge_conflicts.md (if present) — unresolved merge conflicts from syncing the test branch with origin/main.
  • input/{BUG_KEY}/pr_diff.txt (if present) — diff context for resolving conflicts.
  • testing/ — existing tests and reusable helpers.

Task steps

  1. If input/{BUG_KEY}/merge_conflicts.md exists, resolve all <<<<<<< / ======= / >>>>>>> conflict markers in the listed files first, using input/{BUG_KEY}/pr_diff.txt for context. Stage each resolved file with git add <file>. Do NOT git commit or git merge --abort. Only proceed to test automation after the working directory is clean of conflicts.
  2. Run codegraph context "{BUG_KEY} test automation existing tests and reusable helpers" before grepping.
  3. For each linked Test Case {TC_KEY}:
    • Check testing/tests/{TC_KEY}/.
    • If it exists, run it.
    • If missing, write a new automated test that reproduces the bug and verifies the fix.
  4. Re-run failed tests once to confirm real failure.
  5. Write outputs/story_test_automation_result.json with the shared schema.
  6. Write outputs/tracker_comment.md summarizing the bulk run.
  7. For each failed Test Case, write outputs/failed_description_{TC_KEY}.md.

Rules

  • One Bug = one branch test/{BUG_KEY} and one PR.
  • All test code lives under testing/.
  • Do NOT modify feature code.
  • Each new testing/tests/{TC_KEY}/ folder must contain README.md and config.yaml.
  • Focus tests on the bug regression scenario.

[12] ./agents/prompts/bash_tools.md

flowchart TD
    subgraph USE["Use dmtools skill"]
        U1["Jira, Figma, Confluence, Teams, etc."]
        U2["Credentials preconfigured via environment variables"]
    end

    subgraph SAFETY["CLI command safety"]
        S1["One simple executable command at a time"]
        S2["DMTools rejects shell metacharacters"]
    end

    subgraph FORBIDDEN["NEVER USE"]
        F1["Pipes: |"]
        F2["Redirection: > < 2>/dev/null"]
        F3["Chaining: ; && ||"]
        F4["Substitution: backticks, $(), ${...}"]
    end

    subgraph EXAMPLES["Instead"]
        E1["find ... | head -20"] --> E1a["run: find ..."]
        E2["cmd1 && cmd2"] --> E2a["run: cmd1"] --> E2b["then: cmd2"]
        E3["Complex logic"] --> E3a["Write script file, run script as single command"]
    end

    subgraph CWD["Working directory discipline (persistent shell!)"]
        C1["Your Bash shell is ONE persistent session for the whole task — a cd in one command carries over to every later command, including Write/Edit"]
        C2["cd dependencies/&lt;repo&gt; to explore a dependency's source? You are now inside it for every subsequent command until you cd out"]
        C3["Forgetting to cd back before writing outputs/* silently writes to dependencies/&lt;repo&gt;/outputs/* instead of the job's own outputs/ — the write itself succeeds, so nothing looks wrong, but the file is lost"]
        C4["Before ANY Write/Edit to outputs/ (response.md, pr_review.json, pr_review_comments/*.md, etc.): run pwd first and confirm you are at the job root, not inside dependencies/"]
        C5["If unsure or already deep in a dependency checkout: cd to the ABSOLUTE job root path shown in the very first tool result of this session before writing outputs/*"]
        C6["Do NOT defensively re-cd into a directory you are already in — running cd dependencies/&lt;repo&gt; a second time while already inside it fails with No such file or directory (it looks for a nested dependencies/&lt;repo&gt;/dependencies/&lt;repo&gt;). Run pwd first if unsure; only cd once per direction change"]
        C7["For one-off commands inside a dependency checkout, prefer git -C dependencies/&lt;repo&gt; &lt;command&gt; over cd dependencies/&lt;repo&gt; then command — the -C form targets that directory without depending on or changing the shell cwd, so there is no cd bookkeeping to get wrong"]
        C8["Git global flags like --no-pager go BEFORE the subcommand: git --no-pager diff ... is correct, git diff ... --no-pager errors out (git treats the trailing flag as a positional argument)"]
    end

    USE --> SAFETY
    SAFETY --> FORBIDDEN
    SAFETY --> EXAMPLES
    SAFETY --> CWD

[13] ./agents/instructions/common/dmtools_cli.md

DMTools CLI — External Data Access

PR Review note: Ticket/PR context is pre-loaded. Use dmtools only for additional data (e.g., parent story details, linked tickets not in input/).

Use dmtools CLI only when data is not already in input/.

flowchart TD
    NEED["Need external context?"] --> CHECK{"Already in input/?"}
    CHECK -->|Yes| READ["Read local files — NO API call"]
    CHECK -->|No| SOURCE{"Source"}

    SOURCE -->|Jira| J["dmtools jira_get_ticket KEY<br/>dmtools jira_search_by_jql JQL"]
    SOURCE -->|Confluence| C["dmtools confluence_get_page_by_url URL<br/>dmtools confluence_search QUERY"]
    SOURCE -->|ADO| A["dmtools ado_get_work_item ID<br/>dmtools ado_search_work_items QUERY"]
    SOURCE -->|GitHub| G["dmtools github_get_issue REPO NUM<br/>dmtools github_search_code QUERY"]

    J --> PARSE["Parse JSON → use in response"]
    C --> PARSE
    A --> PARSE
    G --> PARSE

    subgraph RULES["⚠️ Rules"]
        R1["Check input/ first — avoid redundant fetches"]
        R2["Handle errors gracefully — continue with available info"]
        R3["Cite sources — mention where data came from"]
    end

    PARSE --> RULES

    NOTE["Examples:<br/>dmtools jira_get_ticket PROJ-456<br/>dmtools confluence_search 'parser spec'<br/>dmtools confluence_get_page_by_url URL"] -.-> NEED

cliPromptsByTracker

Tracker: jira

[1] ./agents/instructions/tracker/jira_comment_format.md

Jira tracker comment

Use Jira wiki markup in outputs/response.md.

  • Headings: h1., h2., h3.
  • Bullets: * item
  • Numbered lists: # item
  • Bold: *text*
  • Inline code: {{code}}
  • Code block: {code}...{code}
  • Link: [title|url]

Do not use Markdown headings, fenced code blocks, or backtick inline code.

IMPORTANT When answering a clarification question about a user story, get the parent story for full context using: dmtools jira_get_ticket PARENT-KEY (the parent key is visible in the ticket’s parent field).


Tracker: ado

[1] ./agents/instructions/tracker/ado_comment_format.md

ADO tracker comment

Use GitHub-flavored Markdown in outputs/response.md for Azure DevOps work item comments and descriptions.

  • Headings: #, ##, ###
  • Bullets: - item or * item
  • Numbered lists: 1. item
  • Bold: **text**
  • Inline code: `code`
  • Code block: ```lang ... ```
  • Link: [title](url)
  • Tables: standard GFM table syntax

Do not use Jira wiki markup (h1., *text*, {code}, [title|url]) in ADO fields.

IMPORTANT When answering a clarification question about a user story, get the parent story for full context using: dmtools ado_get_work_item PARENT-KEY (the parent key is visible in the ticket’s parent field).

IMPORTANT When enhancing story descriptions, check child tickets and parent story for better context using: dmtools ado_search_by_wiql.


View the agent config on GitHub →

Generated from snapshots/bug_test_automation.md in the agents repository and its human doc — edit either and the page follows. Last updated .