[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-red-hat-developer-bug-fix":3,"mdc-ccoa73-key":34,"related-repo-red-hat-developer-bug-fix":4443,"related-org-red-hat-developer-bug-fix":4547},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"bug-fix","diagnose and fix plugin bugs","Reproduce, diagnose, fix, and PR plugin bugs from Jira tickets or GitHub issues. Works with both rhdh-plugins and community-plugins. Supports UI bugs (Playwright e2e with before\u002Fafter recordings) and backend bugs (unit\u002Fintegration test verification). Triages issues for agent-readiness before attempting a fix. Accepts a Jira key (RHDHBUGS-1934), Jira URL (redhat.atlassian.net\u002Fbrowse\u002F...), GitHub issue URL (github.com\u002F...\u002Fissues\u002FN), or a request to \"fix this bug\", \"reproduce and fix\", \"\u002Fbug-fix\". By default, stops after the fix for user verification before PR creation. Supports --no-verify mode to skip the verification gate and auto-create the PR. Chains into raise-pr for the full PR lifecycle.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"red-hat-developer","Red Hat Developer","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fred-hat-developer.png","redhat-developer",[13,17,20],{"name":14,"slug":15,"type":16},"QA","qa","tag",{"name":18,"slug":19,"type":16},"Testing","testing",{"name":21,"slug":22,"type":16},"Debugging","debugging",15,"https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-skill","2026-07-29T06:00:33.054762",null,28,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Claude Code skill for RHDH plugin lifecycle management","https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-skill\u002Ftree\u002FHEAD\u002Fskills\u002Fbug-fix","---\nname: bug-fix\ndescription: >\n  Reproduce, diagnose, fix, and PR plugin bugs from Jira tickets or GitHub\n  issues. Works with both rhdh-plugins and community-plugins. Supports UI bugs\n  (Playwright e2e with before\u002Fafter recordings) and backend bugs\n  (unit\u002Fintegration test verification). Triages issues for agent-readiness\n  before attempting a fix. Accepts a Jira key (RHDHBUGS-1934), Jira URL\n  (redhat.atlassian.net\u002Fbrowse\u002F...), GitHub issue URL\n  (github.com\u002F...\u002Fissues\u002FN), or a request to \"fix this bug\", \"reproduce and\n  fix\", \"\u002Fbug-fix\". By default, stops after the fix for user verification\n  before PR creation. Supports --no-verify mode to skip the verification gate\n  and auto-create the PR. Chains into raise-pr for the full PR lifecycle.\n---\n\n\u003Cessential_principles>\n\n\u003Cprinciple name=\"skill_entry_banner\">\nAs the very first action when the skill is invoked, echo a skill entry banner to the terminal:\n```\necho \"================ Using Bug Fix Skill ===========\"\n```\nThis must happen before any other work (reading references, MCP calls, etc.).\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"repro_test_is_temporary\">\nThe reproduction test (`_repro-\u003CKEY>.test.ts`) is a diagnostic tool, not a deliverable. It is deleted before staging. It must never appear in the PR.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"runtime_discovery\">\nDo not hardcode workspace internals. Discover each workspace's e2e infrastructure at runtime by reading its `playwright.config.ts`, `e2e-tests\u002Futils\u002F`, and `plugins\u002F*\u002Fsrc\u002Ftranslations\u002Fref.ts`. The `references\u002Fworkspace-map.md` maps issue metadata (Jira components, GitHub labels) to workspace directories, but everything else is discovered dynamically.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"video_evidence\">\n**Applies to full-e2e mode only.** In no-e2e mode (backend bugs or workspaces without Playwright), video recordings are not captured and this principle is skipped.\n\nIn full-e2e mode, every bug fix PR with a UI change MUST include before\u002Fafter screen recordings. This is NON-NEGOTIABLE and cannot be skipped, deferred, or worked around. The recordings prove the bug existed and the fix resolves it.\n\nEnforcement rules:\n- The reproduction test MUST be written and run BEFORE any fix is applied (Steps 3-4 happen before Step 5). Violating this order means there is no \"before\" state to record.\n- The repro test MUST create its own browser context with `recordVideo` — NEVER use workspace bootstrap helpers (e.g., `bootstrapLightspeedE2ePage`) as they do not enable video recording.\n- If video files are not present in `e2e-tests\u002F_repro-artifacts\u002F` at Step 8, STOP and go back to capture them. Do NOT proceed to PR creation without recordings.\n- If the Playwright `context.close()` call is missing, the video file will be incomplete — always close the context.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"fix_after_repro\">\n**Applies to full-e2e mode only.** In no-e2e mode, diagnosis and fix use unit tests instead of Playwright — see Step 2.5.\n\nIn full-e2e mode, NEVER apply the code fix before Steps 3 and 4 are complete. The correct order is:\n1. Write repro test (Step 3)\n2. Run repro test — it must FAIL (bug confirmed)\n3. Capture \"before\" video (Step 4)\n4. ONLY THEN apply the fix (Step 5)\n\nIf you find yourself wanting to fix first and test after, STOP — you are violating the step order. The \"before\" recording cannot be captured retroactively.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"step_echo_banners\">\nBefore executing each numbered Step, echo a clearly visible banner to the terminal so the user can track progress — even if the step's actual work is done via MCP tools or file reads rather than shell commands:\n```\necho \"================ Step N — \u003CStep title> ===========\"\n```\nThis applies to ALL steps including Step 1. Run the echo command in the terminal before doing anything else for that step.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"preflight_port_cleanup\">\nBefore running any Playwright test, check whether the dev-server port (from `playwright.config.ts`) is already in use. If it is, kill the process occupying it:\n```\nlsof -ti:\u003CPORT> | xargs kill -9 2>\u002Fdev\u002Fnull || true\n```\nA stale dev server from a prior session will cause the test to connect to the wrong app and time out.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"preflight_system_limits\">\nBefore running any Playwright test, ensure the system file descriptor limit is raised and the shell command runs without sandbox restrictions to avoid restrictions on browser launch:\n```\nulimit -n 65536 2>\u002Fdev\u002Fnull || true\n```\nWithout this, webpack's file watcher (Watchpack) may hit `EMFILE: too many open files` and crash Chrome\u002FChromium. This is primarily needed on macOS where the default file descriptor limit is 256. Linux typically defaults to 1024+ and may not require this adjustment.\n\u003C\u002Fprinciple>\n\n\u003C\u002Fessential_principles>\n\n## Prerequisites\n\nTools are verified automatically in Step 0.5 (Readiness Check). The lists below document what is needed:\n\n- **`gh` CLI** — GitHub CLI must be installed and authenticated (`gh auth status`). Required for ALL paths (PR creation + GitHub issue fetching). Install: https:\u002F\u002Fcli.github.com\u002F\n- **Jira access (if Jira issue)** — At least ONE of:\n  - `acli` on PATH + `.jira-token` configured. [ACLI docs](https:\u002F\u002Fdeveloper.atlassian.com\u002Fcloud\u002Facli\u002Fguides\u002Fhow-to-get-started\u002F)\n  - Jira MCP (Atlassian Rovo MCP server). [Setup guide](https:\u002F\u002Fsupport.atlassian.com\u002Fatlassian-rovo-mcp-server\u002Fdocs\u002Fgetting-started-with-the-atlassian-remote-mcp-server\u002F)\n- Working checkout of `rhdh-plugins` or `community-plugins`\n- `yarn` available on PATH\n- `ffmpeg` available on PATH (good-to-have; for video conversion; fall back to raw `.webm` if absent)\n\n---\n\n## Mode: check for `--no-verify` flag\n\nCheck if the user invoked this skill with `--no-verify`.\n\n- **`--no-verify` present:** After the fix is verified (Step 6), skip the verification gate — chain directly into `raise-pr --a` (all approval gates auto-approved).\n- **`--no-verify` absent (default):** After the fix is verified, STOP and present a summary for the user to verify locally. The user then invokes `raise-pr` or `raise-pr --a` when ready.\n\n---\n\n## Step 0 — Detect issue source (string parsing only)\n\nDetermine whether the user provided a Jira issue or a GitHub issue. This step is pure string parsing — it does NOT fetch or call any external tool.\n\n1. Check the user's input against these patterns:\n\n   **Jira patterns** (follow parsing rules in `raise-pr\u002Freferences\u002Fjira-input.md`):\n   - Bare key: `RHDHBUGS-1934`\n   - Browse URL: `https:\u002F\u002Fredhat.atlassian.net\u002Fbrowse\u002FRHDHBUGS-1934`\n   - URL without scheme: `redhat.atlassian.net\u002Fbrowse\u002FRHIDP-15252`\n\n   **GitHub patterns** (follow parsing rules in `references\u002Fgithub-input.md`):\n   - Full URL: `https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-plugins\u002Fissues\u002F607`\n   - Short URL: `github.com\u002Fbackstage\u002Fcommunity-plugins\u002Fissues\u002F3574`\n   - Bare number in checkout context: `#123` (resolve repo from `git remote -v`)\n\n2. Store `issue_source` = `jira` or `github`.\n   - For GitHub: also extract `github_issue_repo` and `github_issue_number` from the URL. The target repo is known from the URL.\n   - For Jira: extract `jira_key`. The target repo is NOT known yet — it is resolved later in Step 2 from the workspace\u002Fcomponent mapping.\n\n**Do NOT fetch issue details yet** — that happens after the readiness check confirms the required tools are available.\n\n---\n\n## Step 0.5 — Readiness check\n\nVerify that all required tools are available before attempting to fetch the issue or fix the bug. The checks are source-aware based on `issue_source` from Step 0.\n\nEcho a readiness table to the terminal:\n\n```\necho \"================ Readiness Check ===========\"\n```\n\n### Must-have (all contexts)\n\n| Tool | Check command | Install link |\n|------|--------------|-------------|\n| `gh` CLI | `gh auth status` | https:\u002F\u002Fcli.github.com\u002F |\n| `yarn` | `yarn --version` | — |\n| `node` | `node --version` | — |\n| Working checkout | `git remote -v` matches `rhdh-plugins` or `community-plugins` | — |\n\n### Must-have (source-conditional)\n\n| Condition | Tool | Check |\n|-----------|------|-------|\n| Jira issue | At least ONE of: `acli` + `.jira-token`, OR Jira MCP | `which acli` + token file exists, OR MCP tool discovery |\n\n### Good-to-have (warn only, do not block)\n\n| Tool | Condition | What it enables | Link |\n|------|-----------|----------------|------|\n| `ffmpeg` | Always | Video conversion (.webm → .gif) | https:\u002F\u002Fffmpeg.org\u002Fdownload.html |\n| `acli` | GitHub issue path | Jira cross-linking if needed later | https:\u002F\u002Fdeveloper.atlassian.com\u002Fcloud\u002Facli\u002Fguides\u002Fhow-to-get-started\u002F |\n| Second Jira tool | Jira path, only one of ACLI\u002FMCP present | ACLI: transitions + labels. MCP: rich reads + comments | — |\n\n### Output format\n\n```\n [PASS]  gh CLI — authenticated as \u003Cuser>\n [PASS]  yarn — v\u003Cversion>\n [PASS]  node — v\u003Cversion>\n [PASS]  Working checkout — rhdh-plugins (detected from git remote)\n [PASS]  acli — v\u003Cversion>\n [PASS]  .jira-token — configured\n [WARN]  ffmpeg — not found (video will remain as .webm) — https:\u002F\u002Fffmpeg.org\u002Fdownload.html\n [WARN]  Jira MCP — not configured (Jira comment updates will be skipped)\n```\n\n**If ANY must-have check fails:** STOP with clear instructions on how to install\u002Fconfigure the missing tool.\n\n**If only good-to-have items are missing:** proceed with warnings.\n\n---\n\n## Step 1 — Fetch issue details\n\nNow that the readiness check has confirmed the required tools are available, fetch the issue.\n\n### If `issue_source` = `jira`\n\nRead `references\u002Fworkspace-map.md` for the Jira component-to-workspace mapping.\n\n1. Fetch the full issue details using Jira MCP (`read_jira_issue`) or REST API (per `raise-pr\u002Freferences\u002Fjira-input.md`):\n   - Summary, description, steps to reproduce\n   - Component field (maps to workspace)\n   - Status (for post-PR transition)\n   - Attachments\u002Fscreenshots (visual reference for reproduction)\n2. Store: `jira_key`, `jira_url`, `jira_summary`, `jira_description`, `jira_component`, `jira_status`\n\n### If `issue_source` = `github`\n\nRead `references\u002Fgithub-input.md` for `gh` CLI patterns.\n\n1. Fetch the issue:\n   ```\n   gh issue view \u003CNUMBER> --repo \u003Cowner\u002Frepo> --json title,body,labels,state,comments\n   ```\n2. Store: `github_issue_number`, `github_issue_url`, `github_issue_repo`, `github_issue_title`, `github_issue_body`, `github_issue_labels`\n\n---\n\n## Step 1.5 — Issue triage\n\nValidate that the issue has enough detail for an automated fix. This gate prevents wasted effort on underspecified bugs.\n\n### Required fields\n\nRegardless of source, the issue must contain:\n\n- **Steps to reproduce** — clear numbered steps\n- **Expected behavior** — what should happen after the fix\n- **Component \u002F workspace** — identifiable from Jira Component field, GitHub `workspace\u002F*` label, issue title prefix, or issue body\n- **Target repository** — derivable from GitHub issue URL directly, or from Jira Component-to-workspace mapping\n\nFor **Jira issues**, map to the standard bug template fields:\n- `Description of problem` — present\n- `Steps to Reproduce` — present\n- `Expected results` — present\n\nFor **GitHub issues**, scan the issue body for headings or sections containing reproduction steps and expected behavior (common patterns: `## Steps to reproduce`, `## Expected behavior`, `### How to reproduce`, `### Reproduction steps`).\n\n### If triage fails (not agent-ready)\n\nAutomatically:\n\n1. **Add label** `not-ready-for-agent` on the issue:\n   - Jira: `acli jira workitem edit --key \"$KEY\" --label \"not-ready-for-agent\" --yes`\n   - GitHub: `gh issue edit \u003CN> --repo \u003Crepo> --add-label \"not-ready-for-agent\"`\n\n2. **Add comment** with a missing-info checklist (only unchecked items are those actually missing; present items show as checked):\n\n   ```\n   This bug is not ready for automated fixing. The following information is missing:\n\n   - [ ] Steps to reproduce\n   - [ ] Component \u002F workspace\n   - [ ] Expected behavior\n   - [ ] Target repository (rhdh-plugins or community-plugins)\n\n   Please update this ticket with the missing details and remove the \"not-ready-for-agent\" label when ready.\n   ```\n\n3. **Echo the same to the user** in the terminal.\n\n4. **STOP** — do not proceed with the fix.\n\n### If triage passes\n\nEcho a summary of extracted fields (issue key\u002FURL, summary, workspace, repo) and proceed to Step 2.\n\n---\n\n## Step 2 — Identify workspace, repo, and discover infrastructure\n\nRead `references\u002Fworkspace-map.md` for workspace detection strategies.\n\n### Workspace and repo detection\n\n**If `issue_source` = `github`:**\nThe target repo is already known from the issue URL. Identify the workspace within that repo using the strategies in `references\u002Fworkspace-map.md` (labels, body fields, title prefix, package names). See also `references\u002Fgithub-input.md` for workspace extraction from GitHub issues.\n\n**If `issue_source` = `jira`:**\nThe target repo is NOT yet known. Map the Jira **Component** field to a workspace directory using `references\u002Fworkspace-map.md`. The workspace mapping determines which repo to target (rhdh-plugins vs community-plugins).\n- If no component is set or the component is unknown: ask the user which workspace and repo to target.\n\n### Navigate and discover\n\n1. Navigate to the workspace: `cd workspaces\u002F\u003Cworkspace-dir>`\n2. **Discover infrastructure dynamically**:\n   - Read `playwright.config.ts` (if present) for port configuration, locale list, start commands, and `APP_MODE` support.\n   - Scan `e2e-tests\u002Futils\u002F` to discover available helper functions (translations, navigation, API mocking, accessibility).\n   - Read `plugins\u002F*\u002Fsrc\u002Ftranslations\u002Fref.ts` for translation key structure (used for i18n-safe selectors).\n   - Read `plugins\u002F*\u002Fsrc\u002Fcomponents\u002F` to build a component-to-source-file map.\n3. Run `yarn install` if `node_modules` is missing or stale.\n\nRead `references\u002Fe2e-patterns.md` for shared Playwright patterns.\n\n### Step 2.5 — Determine e2e mode\n\nAfter discovering the workspace infrastructure, determine the execution mode:\n\n- **full-e2e mode** — when the workspace has `playwright.config.ts` AND the bug involves a UI component.\n- **no-e2e mode** — when the workspace has NO `playwright.config.ts`, OR the bug is backend-only (API, config, logic, data processing).\n\n**In full-e2e mode:** Proceed with Steps 3–7 as defined (write repro test, capture before video, fix, capture after video, convert videos).\n\n**In no-e2e mode:** Skip Steps 3, 4, 6, 7 entirely. The workflow becomes:\n\n1. **Check existing test coverage**: Run `yarn test --watchAll=false` and check if any existing test already fails on the bug. If yes, use that test as the repro confirmation — no need to write a new one.\n2. **If no existing test covers the bug**: Write a temporary repro unit test (`_repro-\u003CKEY>.test.ts`) that reproduces the bug. Run it — it should FAIL (bug confirmed).\n3. **Diagnose root cause**: No browser-based diagnostics (screenshots, DOM snapshots, computed styles) are available. Diagnosis relies on source code analysis, error logs\u002Fstack traces from the issue description, and test output.\n4. **Apply the fix** in source code.\n5. **Verify**: `yarn tsc:full` + `yarn test --watchAll=false` — all tests must pass (including the repro test or the previously-failing existing test).\n6. **Delete repro test** if one was written (same principle as full-e2e: the repro test is a diagnostic tool, not a deliverable).\n7. Proceed to Step 8 — but with NO recordings in caller context.\n\n---\n\n## Step 3 — Write reproduction test with video recording [full-e2e only]\n\nRead `references\u002Fe2e-patterns.md` for test patterns and `references\u002Fvideo-recording.md` for video configuration.\n\n1. Create a temporary test file: `e2e-tests\u002F_repro-\u003CKEY>.test.ts` (where `\u003CKEY>` is the Jira key or GitHub issue number, e.g., `_repro-RHDHBUGS-1934.test.ts` or `_repro-607.test.ts`).\n   - The `_` prefix signals this file is temporary and should not be committed.\n2. The test must:\n   - Import workspace-specific helpers discovered in Step 2 **only for navigation\u002Fsetup** (e.g., API mocking, translations).\n   - Use i18n-safe selectors (via translation keys) where available.\n   - **Always create its own browser context with video recording** — do NOT rely on workspace bootstrap helpers for the context, as they may not enable video. Use the `browser` fixture directly:\n     ```typescript\n     test('repro', async ({ browser }) => {\n       const context = await browser.newContext({\n         recordVideo: { dir: 'test-results\u002F', size: { width: 1280, height: 720 } },\n       });\n       const page = await context.newPage();\n       \n       \u002F\u002F ... test steps using page ...\n       \n       await context.close(); \u002F\u002F finalizes the video file\n     });\n     ```\n     This guarantees video recording regardless of how the workspace's own e2e infrastructure manages contexts.\n   - **CRITICAL**: Do NOT use workspace-provided bootstrap\u002Fsetup functions (like `bootstrapLightspeedE2ePage`, `setupE2eTest`, etc.) as the browser context source. These helpers create contexts WITHOUT video recording. You MUST call `browser.newContext({ recordVideo: ... })` yourself and then replicate only the mock setup from those helpers (API mocking, route handlers) on your custom page. Copy the mock calls — not the context creation.\n   - Encode the \"steps to reproduce\" from the issue description as Playwright actions.\n   - Assert the **expected** behavior (the assertion should fail when the bug is present).\n3. **Pre-flight: kill stale dev server** — before running the test, ensure the dev-server port (read from `playwright.config.ts` `webServer.url`) is free:\n   ```\n   lsof -ti:\u003CPORT> | xargs kill -9 2>\u002Fdev\u002Fnull || true\n   ```\n4. Run the test against the `en` locale in legacy mode. **Always** prefix with `ulimit -n 65536` and ensure the command runs without sandbox restrictions:\n   ```\n   ulimit -n 65536 && APP_MODE=legacy npx playwright test e2e-tests\u002F_repro-\u003CKEY>.test.ts --project=en\n   ```\n5. The test should **fail** — confirming the bug is reproduced.\n\n**If the test passes** (bug not reproduced): re-read the issue description, adjust the test, and retry. If still not reproducible after 2 attempts, report findings and ask the user for guidance.\n\n---\n\n## Step 4 — Capture \"before\" recording [full-e2e only]\n\n1. After the failed test run (Step 3), locate the video file in `test-results\u002F`.\n   - Playwright saves videos at `test-results\u002F\u003Ctest-title>\u002Fvideo.webm`.\n2. Copy the video to a stable path:\n   ```\n   mkdir -p e2e-tests\u002F_repro-artifacts\n   cp test-results\u002F*\u002Fvideo.webm e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.webm\n   ```\n3. Store the path for later conversion (Step 7).\n\n**If no video file is found in `test-results\u002F`**: the test likely used a bootstrap helper instead of a custom `recordVideo` context. Rewrite the test to use `browser.newContext({ recordVideo: ... })` directly, then re-run.\n\n---\n\n## Step 5 — Diagnose and fix\n\n**In no-e2e mode:** Skip sub-step 1 (browser diagnostics are not available). Start directly from sub-step 2 using source code analysis, error logs\u002Fstack traces from the issue description, and unit test output.\n\n1. **Capture diagnostic context** [full-e2e only] from the failing state (before applying any fix). Re-use the reproduction test or run a lightweight Playwright script to gather:\n\n   a. **Screenshot** of the buggy UI state:\n      ```typescript\n      await page.screenshot({ path: 'e2e-tests\u002F_repro-artifacts\u002Fbug-state.png', fullPage: true });\n      ```\n   b. **DOM snapshot** of the target element:\n      ```typescript\n      const targetEl = page.locator('\u003Cselector-under-test>');\n      const domSnapshot = await targetEl.evaluate(el => el.outerHTML);\n      ```\n   c. **Computed styles** of the target element (capture properties relevant to the bug):\n      ```typescript\n      const styles = await targetEl.evaluate(el => {\n        const cs = window.getComputedStyle(el);\n        return { display: cs.display, overflow: cs.overflow, scrollbarWidth: cs.scrollbarWidth };\n      });\n      ```\n\n   Use the screenshot (read it as an image), DOM structure, and computed styles to identify the exact root cause before modifying any source files. This provides concrete runtime evidence rather than guessing from source alone.\n\n2. **Diagnose**: trace from the failing Playwright selector back to the source:\n   - Identify which React component renders the UI element under test.\n   - Read the component source code (`plugins\u002F*\u002Fsrc\u002Fcomponents\u002F`).\n   - Cross-reference the captured DOM\u002Fstyles with the component's render logic to pinpoint the root cause (e.g., MUI prop misconfiguration, missing state update, CSS issue, accessibility gap, i18n key mismatch).\n3. **Apply the fix** in the source code.\n4. **Validate**:\n   - `yarn tsc:full` — type check passes.\n   - `yarn test --watchAll=false` — unit tests pass.\n\n**Confidence gates** — ask the user before proceeding if:\n- Multiple possible root causes exist — present options and let the user choose.\n- The fix touches more than 3 files — show the plan and get approval.\n- The fix changes API surface or public types — this may need a minor version bump.\n\n---\n\n## Step 6 — Capture \"after\" recording [full-e2e only]\n\n1. Re-run the reproduction test (with `ulimit` and without sandbox restrictions):\n   ```\n   ulimit -n 65536 && APP_MODE=legacy npx playwright test e2e-tests\u002F_repro-\u003CKEY>.test.ts --project=en\n   ```\n2. The test should **pass** — confirming the fix works.\n3. Copy the video:\n   ```\n   cp test-results\u002F*\u002Fvideo.webm e2e-tests\u002F_repro-artifacts\u002Fafter-fix.webm\n   ```\n4. Optionally run in NFS mode as well to check for mode-specific regressions:\n   ```\n   APP_MODE=nfs npx playwright test e2e-tests\u002F_repro-\u003CKEY>.test.ts --project=en\n   ```\n\n**If the test still fails after the fix**: re-examine the diagnosis and iterate.\n\n---\n\n## Step 7 — Convert videos for PR embedding [full-e2e only]\n\nRead `references\u002Fvideo-recording.md` for conversion details.\n\n1. Check if `ffmpeg` is available on PATH.\n2. **If available**: convert `.webm` to `.gif`:\n   ```\n   ffmpeg -i e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.webm -vf \"fps=10,scale=800:-1\" -loop 0 e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.gif\n   ffmpeg -i e2e-tests\u002F_repro-artifacts\u002Fafter-fix.webm -vf \"fps=10,scale=800:-1\" -loop 0 e2e-tests\u002F_repro-artifacts\u002Fafter-fix.gif\n   ```\n3. **If `ffmpeg` is not available**: keep the `.webm` files and note that they will be uploaded as PR comment attachments instead of inline GIFs.\n\n---\n\n## Step 8 — Clean up and create PR\n\n### 8.0 — Validate recordings exist [HARD GATE — full-e2e only]\n\n**In no-e2e mode:** Skip this sub-step entirely — there are no recordings to validate.\n\n**In full-e2e mode:** Before proceeding with cleanup or PR creation, verify both recording files exist:\n\n```\ntest -f e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.webm || { echo \"ERROR: before-fix.webm missing — go back to Step 4\"; exit 1; }\ntest -f e2e-tests\u002F_repro-artifacts\u002Fafter-fix.webm || { echo \"ERROR: after-fix.webm missing — go back to Step 6\"; exit 1; }\n```\n\nIf either file is missing, DO NOT proceed. Return to the relevant step (4 or 6) and capture the recording. This gate ensures the PR will always have visual evidence.\n\n### 8.1 — Delete temporary files\n\nRemove the reproduction test and artifacts — these must not appear in the PR:\n\n**In full-e2e mode:**\n```\nrm e2e-tests\u002F_repro-\u003CKEY>.test.ts\nrm -rf test-results\u002F\n```\nKeep `e2e-tests\u002F_repro-artifacts\u002F` temporarily (needed for PR image upload).\n\n**In no-e2e mode:**\n```\nrm _repro-\u003CKEY>.test.ts    # if a temporary repro unit test was written\nrm -rf test-results\u002F\n```\n\n### 8.2 — Stage fix files\n\nStage only the code fix (not the repro test or artifacts):\n\n```\ngit add \u003Cfixed-source-files>\n```\n\n### 8.3 — Prepare caller context\n\nAssemble the caller context that will be passed to `raise-pr`. This is prepared regardless of verify mode. Include only the fields relevant to the `issue_source`.\n\n| Field | Value | Condition |\n|-------|-------|-----------|\n| `issue_source` | `jira` or `github` | Always |\n| `jira_key` | The resolved Jira key from Step 1 | Jira only |\n| `jira_url` | `https:\u002F\u002Fredhat.atlassian.net\u002Fbrowse\u002F\u003Cjira_key>` | Jira only |\n| `jira_summary` | Issue summary from Step 1 | Jira only |\n| `github_issue_number` | Issue number from Step 0 | GitHub only |\n| `github_issue_url` | Full GitHub issue URL | GitHub only |\n| `github_issue_repo` | `owner\u002Frepo` (e.g., `redhat-developer\u002Frhdh-plugins`) | GitHub only |\n| `github_issue_title` | Issue title from Step 1 | GitHub only |\n| `recordings` | `{ before: \"e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.gif\", after: \"e2e-tests\u002F_repro-artifacts\u002Fafter-fix.gif\" }` | full-e2e only; `null` in no-e2e mode |\n| `pr_description_extra` | `### Root cause\\n\u003Cdiagnosis from Step 5>` | Always |\n| `test_plan` | Auto-generated markdown checklist (see below) | Always |\n\n**Generating the `test_plan`:**\n\nBuild a markdown checklist of verification steps for the reviewer. Derive them from:\n1. **Steps-to-reproduce** — convert each step into a positive verification action (e.g., \"Click Help menu\" becomes \"- [ ] Open the Help menu\").\n2. **Expected behavior after fix** — add steps verifying the fix works (e.g., \"- [ ] Verify scrollbar appears on hover\").\n3. **Regression check** — add at least one step confirming nothing else broke (e.g., \"- [ ] Verify other menus\u002Fdisplay modes are unchanged\").\n\nExample output:\n```\n- [ ] Open the dropdown menu with many items\n- [ ] Verify scrollbar is hidden by default\n- [ ] Hover over the menu content area\n- [ ] Verify scrollbar becomes visible on hover\n- [ ] Verify other dropdown menus are unaffected\n```\n\n### 8.4 — Verification gate [MODE-DEPENDENT]\n\n**If `--no-verify`:** Chain into `raise-pr --a` immediately with the caller context from Step 8.3. Skip to Step 8.5 after PR creation.\n\n`raise-pr` handles: repo detection, build, changeset, commit (with `Fixes:` trailer), push, PR creation (with `## UI before\u002Fafter changes` and `## Test Plan`), and post-PR updates (Jira comment\u002Ftransition or GitHub issue comment\u002Flabel depending on `issue_source`).\n\n> `raise-pr` uploads the GIF files to the branch via GitHub Contents API and embeds the resulting `raw.githubusercontent.com` URLs directly in the PR description. No manual image upload or separate PR comment is needed.\n\n**If default (no flag):** STOP and present a verification summary to the user:\n\n1. **Modified files** — list all source files changed by the fix.\n2. **Root cause** — the diagnosis from Step 5.\n3. **Recordings** — paths to before\u002Fafter GIF files.\n4. **Caller context** — print the assembled caller context table (from Step 8.3) so the user can confirm everything is ready.\n5. **Next steps** — instruct the user:\n\n```\nFix complete. Verify the changes locally, then create the PR:\n  raise-pr              — interactive mode (approval gates at branch, staging, commit)\n  raise-pr --a          — auto-approve mode (skip all gates)\n```\n\nThe agent retains the caller context in the conversation. When the user invokes `raise-pr` or `raise-pr --a`, pass the full caller context from Step 8.3 so that `raise-pr` includes the Jira link, recordings, root cause, and test plan in the PR.\n\n### 8.5 — Final cleanup\n\nAfter the PR is created, delete the artifacts directory:\n\n```\nrm -rf e2e-tests\u002F_repro-artifacts\u002F\n```\n\n---\n\n## When NOT to Use\n\n- **Bugs requiring live backend data** — if reproduction depends on real API responses that cannot be mocked via the workspace's e2e test infrastructure.\n- **Cross-workspace bugs** — if the fix requires changes across multiple workspaces, handle each workspace separately or use `raise-pr` directly.\n- **Unsupported issue trackers** — this skill supports Jira (RHIDP, RHDHBUGS, RHDHPLAN, RHDHSUPP projects) and GitHub issues (rhdh-plugins, community-plugins). Other trackers or repos are not supported.\n\n\u003Creference_index>\n\n## Reference Index\n\n| Reference | Load when... |\n|-----------|-------------|\n| `references\u002Fworkspace-map.md` | Always — at the start of every invocation (Steps 0-2) |\n| `references\u002Fgithub-input.md` | When `issue_source` = `github` (Steps 0, 1) |\n| `references\u002Fe2e-patterns.md` | When writing the reproduction test — full-e2e mode only (Step 3) |\n| `references\u002Fvideo-recording.md` | When configuring video capture — full-e2e mode only (Steps 3, 7) |\n| `raise-pr\u002Freferences\u002Fjira-input.md` | When `issue_source` = `jira` (Step 0) — shared with raise-pr |\n| `raise-pr\u002Freferences\u002Frepo-profiles.md` | Loaded by raise-pr during Step 8 chain |\n\n\u003C\u002Freference_index>\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,47,54,66,72,4437],{"type":40,"tag":41,"props":42,"children":43},"element","p",{},[44],{"type":45,"value":46},"text","\u003Cessential_principles>",{"type":40,"tag":48,"props":49,"children":51},"principle",{"name":50},"skill_entry_banner",[52],{"type":45,"value":53},"\nAs the very first action when the skill is invoked, echo a skill entry banner to the terminal:\n```\necho \"================ Using Bug Fix Skill ===========\"\n```\nThis must happen before any other work (reading references, MCP calls, etc.).\n",{"type":40,"tag":48,"props":55,"children":57},{"name":56},"repro_test_is_temporary",[58,60],{"type":45,"value":59},"\nThe reproduction test (`_repro-",{"type":40,"tag":61,"props":62,"children":63},"key",{},[64],{"type":45,"value":65},".test.ts`) is a diagnostic tool, not a deliverable. It is deleted before staging. It must never appear in the PR.\n",{"type":40,"tag":48,"props":67,"children":69},{"name":68},"runtime_discovery",[70],{"type":45,"value":71},"\nDo not hardcode workspace internals. Discover each workspace's e2e infrastructure at runtime by reading its `playwright.config.ts`, `e2e-tests\u002Futils\u002F`, and `plugins\u002F*\u002Fsrc\u002Ftranslations\u002Fref.ts`. The `references\u002Fworkspace-map.md` maps issue metadata (Jira components, GitHub labels) to workspace directories, but everything else is discovered dynamically.\n",{"type":40,"tag":48,"props":73,"children":75},{"name":74},"video_evidence",[76,78,83,88,146],{"type":45,"value":77},"\n**Applies to full-e2e mode only.** In no-e2e mode (backend bugs or workspaces without Playwright), video recordings are not captured and this principle is skipped.\n",{"type":40,"tag":41,"props":79,"children":80},{},[81],{"type":45,"value":82},"In full-e2e mode, every bug fix PR with a UI change MUST include before\u002Fafter screen recordings. This is NON-NEGOTIABLE and cannot be skipped, deferred, or worked around. The recordings prove the bug existed and the fix resolves it.",{"type":40,"tag":41,"props":84,"children":85},{},[86],{"type":45,"value":87},"Enforcement rules:",{"type":40,"tag":89,"props":90,"children":91},"ul",{},[92,98,120,133],{"type":40,"tag":93,"props":94,"children":95},"li",{},[96],{"type":45,"value":97},"The reproduction test MUST be written and run BEFORE any fix is applied (Steps 3-4 happen before Step 5). Violating this order means there is no \"before\" state to record.",{"type":40,"tag":93,"props":99,"children":100},{},[101,103,110,112,118],{"type":45,"value":102},"The repro test MUST create its own browser context with ",{"type":40,"tag":104,"props":105,"children":107},"code",{"className":106},[],[108],{"type":45,"value":109},"recordVideo",{"type":45,"value":111}," — NEVER use workspace bootstrap helpers (e.g., ",{"type":40,"tag":104,"props":113,"children":115},{"className":114},[],[116],{"type":45,"value":117},"bootstrapLightspeedE2ePage",{"type":45,"value":119},") as they do not enable video recording.",{"type":40,"tag":93,"props":121,"children":122},{},[123,125,131],{"type":45,"value":124},"If video files are not present in ",{"type":40,"tag":104,"props":126,"children":128},{"className":127},[],[129],{"type":45,"value":130},"e2e-tests\u002F_repro-artifacts\u002F",{"type":45,"value":132}," at Step 8, STOP and go back to capture them. Do NOT proceed to PR creation without recordings.",{"type":40,"tag":93,"props":134,"children":135},{},[136,138,144],{"type":45,"value":137},"If the Playwright ",{"type":40,"tag":104,"props":139,"children":141},{"className":140},[],[142],{"type":45,"value":143},"context.close()",{"type":45,"value":145}," call is missing, the video file will be incomplete — always close the context.\n\n",{"type":40,"tag":48,"props":147,"children":149},{"name":148},"fix_after_repro",[150,152,157,181,186,199,211,217,222,229,234,370,374,388,400,455,458,464,469,658,668,671,677,689,694,705,712,856,862,926,932,1043,1049,1058,1068,1078,1081,1087,1092,1109,1122,1214,1230,1248,1308,1311,1317,1322,1328,1333,1384,1396,1430,1470,1476,1481,1566,1572,1577,1580,1586,1597,1603,1639,1674,1682,1688,1793,1805,1811,1816,1853,1863,1873,1971,1974,1986,2005,2604,2614,2617,2627,2676,2705,2708,2714,2723,3282,3292,3310,3313,3323,3386,3396,3399,3409,3420,3491,3494,3500,3511,3520,3529,3538,3543,3549,3554,3561,3570,3582,3589,3598,3604,3609,3618,3624,3642,3936,3950,3955,4003,4008,4017,4028,4050,4089,4111,4121,4174,4183,4208,4214,4219,4228,4231,4237,4277,4282,4288,4432],{"type":45,"value":151},"\n**Applies to full-e2e mode only.** In no-e2e mode, diagnosis and fix use unit tests instead of Playwright — see Step 2.5.\n",{"type":40,"tag":41,"props":153,"children":154},{},[155],{"type":45,"value":156},"In full-e2e mode, NEVER apply the code fix before Steps 3 and 4 are complete. The correct order is:",{"type":40,"tag":158,"props":159,"children":160},"ol",{},[161,166,171,176],{"type":40,"tag":93,"props":162,"children":163},{},[164],{"type":45,"value":165},"Write repro test (Step 3)",{"type":40,"tag":93,"props":167,"children":168},{},[169],{"type":45,"value":170},"Run repro test — it must FAIL (bug confirmed)",{"type":40,"tag":93,"props":172,"children":173},{},[174],{"type":45,"value":175},"Capture \"before\" video (Step 4)",{"type":40,"tag":93,"props":177,"children":178},{},[179],{"type":45,"value":180},"ONLY THEN apply the fix (Step 5)",{"type":40,"tag":41,"props":182,"children":183},{},[184],{"type":45,"value":185},"If you find yourself wanting to fix first and test after, STOP — you are violating the step order. The \"before\" recording cannot be captured retroactively.\n",{"type":40,"tag":48,"props":187,"children":189},{"name":188},"step_echo_banners",[190,192],{"type":45,"value":191},"\nBefore executing each numbered Step, echo a clearly visible banner to the terminal so the user can track progress — even if the step's actual work is done via MCP tools or file reads rather than shell commands:\n```\necho \"================ Step N — ",{"type":40,"tag":193,"props":194,"children":196},"step",{"title":195},"",[197],{"type":45,"value":198}," ===========\"\n```\nThis applies to ALL steps including Step 1. Run the echo command in the terminal before doing anything else for that step.\n",{"type":40,"tag":48,"props":200,"children":202},{"name":201},"preflight_port_cleanup",[203,205],{"type":45,"value":204},"\nBefore running any Playwright test, check whether the dev-server port (from `playwright.config.ts`) is already in use. If it is, kill the process occupying it:\n```\nlsof -ti:",{"type":40,"tag":206,"props":207,"children":208},"port",{},[209],{"type":45,"value":210}," | xargs kill -9 2>\u002Fdev\u002Fnull || true\n```\nA stale dev server from a prior session will cause the test to connect to the wrong app and time out.\n",{"type":40,"tag":48,"props":212,"children":214},{"name":213},"preflight_system_limits",[215],{"type":45,"value":216},"\nBefore running any Playwright test, ensure the system file descriptor limit is raised and the shell command runs without sandbox restrictions to avoid restrictions on browser launch:\n```\nulimit -n 65536 2>\u002Fdev\u002Fnull || true\n```\nWithout this, webpack's file watcher (Watchpack) may hit `EMFILE: too many open files` and crash Chrome\u002FChromium. This is primarily needed on macOS where the default file descriptor limit is 256. Linux typically defaults to 1024+ and may not require this adjustment.\n",{"type":40,"tag":41,"props":218,"children":219},{},[220],{"type":45,"value":221},"\u003C\u002Fessential_principles>",{"type":40,"tag":223,"props":224,"children":226},"h2",{"id":225},"prerequisites",[227],{"type":45,"value":228},"Prerequisites",{"type":40,"tag":41,"props":230,"children":231},{},[232],{"type":45,"value":233},"Tools are verified automatically in Step 0.5 (Readiness Check). The lists below document what is needed:",{"type":40,"tag":89,"props":235,"children":236},{},[237,270,321,340,351],{"type":40,"tag":93,"props":238,"children":239},{},[240,252,254,260,262],{"type":40,"tag":241,"props":242,"children":243},"strong",{},[244,250],{"type":40,"tag":104,"props":245,"children":247},{"className":246},[],[248],{"type":45,"value":249},"gh",{"type":45,"value":251}," CLI",{"type":45,"value":253}," — GitHub CLI must be installed and authenticated (",{"type":40,"tag":104,"props":255,"children":257},{"className":256},[],[258],{"type":45,"value":259},"gh auth status",{"type":45,"value":261},"). Required for ALL paths (PR creation + GitHub issue fetching). Install: ",{"type":40,"tag":263,"props":264,"children":268},"a",{"href":265,"rel":266},"https:\u002F\u002Fcli.github.com\u002F",[267],"nofollow",[269],{"type":45,"value":265},{"type":40,"tag":93,"props":271,"children":272},{},[273,278,280],{"type":40,"tag":241,"props":274,"children":275},{},[276],{"type":45,"value":277},"Jira access (if Jira issue)",{"type":45,"value":279}," — At least ONE of:\n",{"type":40,"tag":89,"props":281,"children":282},{},[283,309],{"type":40,"tag":93,"props":284,"children":285},{},[286,292,294,300,302],{"type":40,"tag":104,"props":287,"children":289},{"className":288},[],[290],{"type":45,"value":291},"acli",{"type":45,"value":293}," on PATH + ",{"type":40,"tag":104,"props":295,"children":297},{"className":296},[],[298],{"type":45,"value":299},".jira-token",{"type":45,"value":301}," configured. ",{"type":40,"tag":263,"props":303,"children":306},{"href":304,"rel":305},"https:\u002F\u002Fdeveloper.atlassian.com\u002Fcloud\u002Facli\u002Fguides\u002Fhow-to-get-started\u002F",[267],[307],{"type":45,"value":308},"ACLI docs",{"type":40,"tag":93,"props":310,"children":311},{},[312,314],{"type":45,"value":313},"Jira MCP (Atlassian Rovo MCP server). ",{"type":40,"tag":263,"props":315,"children":318},{"href":316,"rel":317},"https:\u002F\u002Fsupport.atlassian.com\u002Fatlassian-rovo-mcp-server\u002Fdocs\u002Fgetting-started-with-the-atlassian-remote-mcp-server\u002F",[267],[319],{"type":45,"value":320},"Setup guide",{"type":40,"tag":93,"props":322,"children":323},{},[324,326,332,334],{"type":45,"value":325},"Working checkout of ",{"type":40,"tag":104,"props":327,"children":329},{"className":328},[],[330],{"type":45,"value":331},"rhdh-plugins",{"type":45,"value":333}," or ",{"type":40,"tag":104,"props":335,"children":337},{"className":336},[],[338],{"type":45,"value":339},"community-plugins",{"type":40,"tag":93,"props":341,"children":342},{},[343,349],{"type":40,"tag":104,"props":344,"children":346},{"className":345},[],[347],{"type":45,"value":348},"yarn",{"type":45,"value":350}," available on PATH",{"type":40,"tag":93,"props":352,"children":353},{},[354,360,362,368],{"type":40,"tag":104,"props":355,"children":357},{"className":356},[],[358],{"type":45,"value":359},"ffmpeg",{"type":45,"value":361}," available on PATH (good-to-have; for video conversion; fall back to raw ",{"type":40,"tag":104,"props":363,"children":365},{"className":364},[],[366],{"type":45,"value":367},".webm",{"type":45,"value":369}," if absent)",{"type":40,"tag":371,"props":372,"children":373},"hr",{},[],{"type":40,"tag":223,"props":375,"children":377},{"id":376},"mode-check-for-no-verify-flag",[378,380,386],{"type":45,"value":379},"Mode: check for ",{"type":40,"tag":104,"props":381,"children":383},{"className":382},[],[384],{"type":45,"value":385},"--no-verify",{"type":45,"value":387}," flag",{"type":40,"tag":41,"props":389,"children":390},{},[391,393,398],{"type":45,"value":392},"Check if the user invoked this skill with ",{"type":40,"tag":104,"props":394,"children":396},{"className":395},[],[397],{"type":45,"value":385},{"type":45,"value":399},".",{"type":40,"tag":89,"props":401,"children":402},{},[403,426],{"type":40,"tag":93,"props":404,"children":405},{},[406,416,418,424],{"type":40,"tag":241,"props":407,"children":408},{},[409,414],{"type":40,"tag":104,"props":410,"children":412},{"className":411},[],[413],{"type":45,"value":385},{"type":45,"value":415}," present:",{"type":45,"value":417}," After the fix is verified (Step 6), skip the verification gate — chain directly into ",{"type":40,"tag":104,"props":419,"children":421},{"className":420},[],[422],{"type":45,"value":423},"raise-pr --a",{"type":45,"value":425}," (all approval gates auto-approved).",{"type":40,"tag":93,"props":427,"children":428},{},[429,439,441,447,448,453],{"type":40,"tag":241,"props":430,"children":431},{},[432,437],{"type":40,"tag":104,"props":433,"children":435},{"className":434},[],[436],{"type":45,"value":385},{"type":45,"value":438}," absent (default):",{"type":45,"value":440}," After the fix is verified, STOP and present a summary for the user to verify locally. The user then invokes ",{"type":40,"tag":104,"props":442,"children":444},{"className":443},[],[445],{"type":45,"value":446},"raise-pr",{"type":45,"value":333},{"type":40,"tag":104,"props":449,"children":451},{"className":450},[],[452],{"type":45,"value":423},{"type":45,"value":454}," when ready.",{"type":40,"tag":371,"props":456,"children":457},{},[],{"type":40,"tag":223,"props":459,"children":461},{"id":460},"step-0-detect-issue-source-string-parsing-only",[462],{"type":45,"value":463},"Step 0 — Detect issue source (string parsing only)",{"type":40,"tag":41,"props":465,"children":466},{},[467],{"type":45,"value":468},"Determine whether the user provided a Jira issue or a GitHub issue. This step is pure string parsing — it does NOT fetch or call any external tool.",{"type":40,"tag":158,"props":470,"children":471},{},[472,594],{"type":40,"tag":93,"props":473,"children":474},{},[475,477,481,486,488,494,496,532,535,540,541,547,548],{"type":45,"value":476},"Check the user's input against these patterns:",{"type":40,"tag":478,"props":479,"children":480},"br",{},[],{"type":40,"tag":241,"props":482,"children":483},{},[484],{"type":45,"value":485},"Jira patterns",{"type":45,"value":487}," (follow parsing rules in ",{"type":40,"tag":104,"props":489,"children":491},{"className":490},[],[492],{"type":45,"value":493},"raise-pr\u002Freferences\u002Fjira-input.md",{"type":45,"value":495},"):",{"type":40,"tag":89,"props":497,"children":498},{},[499,510,521],{"type":40,"tag":93,"props":500,"children":501},{},[502,504],{"type":45,"value":503},"Bare key: ",{"type":40,"tag":104,"props":505,"children":507},{"className":506},[],[508],{"type":45,"value":509},"RHDHBUGS-1934",{"type":40,"tag":93,"props":511,"children":512},{},[513,515],{"type":45,"value":514},"Browse URL: ",{"type":40,"tag":104,"props":516,"children":518},{"className":517},[],[519],{"type":45,"value":520},"https:\u002F\u002Fredhat.atlassian.net\u002Fbrowse\u002FRHDHBUGS-1934",{"type":40,"tag":93,"props":522,"children":523},{},[524,526],{"type":45,"value":525},"URL without scheme: ",{"type":40,"tag":104,"props":527,"children":529},{"className":528},[],[530],{"type":45,"value":531},"redhat.atlassian.net\u002Fbrowse\u002FRHIDP-15252",{"type":40,"tag":478,"props":533,"children":534},{},[],{"type":40,"tag":241,"props":536,"children":537},{},[538],{"type":45,"value":539},"GitHub patterns",{"type":45,"value":487},{"type":40,"tag":104,"props":542,"children":544},{"className":543},[],[545],{"type":45,"value":546},"references\u002Fgithub-input.md",{"type":45,"value":495},{"type":40,"tag":89,"props":549,"children":550},{},[551,562,573],{"type":40,"tag":93,"props":552,"children":553},{},[554,556],{"type":45,"value":555},"Full URL: ",{"type":40,"tag":104,"props":557,"children":559},{"className":558},[],[560],{"type":45,"value":561},"https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-plugins\u002Fissues\u002F607",{"type":40,"tag":93,"props":563,"children":564},{},[565,567],{"type":45,"value":566},"Short URL: ",{"type":40,"tag":104,"props":568,"children":570},{"className":569},[],[571],{"type":45,"value":572},"github.com\u002Fbackstage\u002Fcommunity-plugins\u002Fissues\u002F3574",{"type":40,"tag":93,"props":574,"children":575},{},[576,578,584,586,592],{"type":45,"value":577},"Bare number in checkout context: ",{"type":40,"tag":104,"props":579,"children":581},{"className":580},[],[582],{"type":45,"value":583},"#123",{"type":45,"value":585}," (resolve repo from ",{"type":40,"tag":104,"props":587,"children":589},{"className":588},[],[590],{"type":45,"value":591},"git remote -v",{"type":45,"value":593},")",{"type":40,"tag":93,"props":595,"children":596},{},[597,599,605,607,613,614,620,621],{"type":45,"value":598},"Store ",{"type":40,"tag":104,"props":600,"children":602},{"className":601},[],[603],{"type":45,"value":604},"issue_source",{"type":45,"value":606}," = ",{"type":40,"tag":104,"props":608,"children":610},{"className":609},[],[611],{"type":45,"value":612},"jira",{"type":45,"value":333},{"type":40,"tag":104,"props":615,"children":617},{"className":616},[],[618],{"type":45,"value":619},"github",{"type":45,"value":399},{"type":40,"tag":89,"props":622,"children":623},{},[624,645],{"type":40,"tag":93,"props":625,"children":626},{},[627,629,635,637,643],{"type":45,"value":628},"For GitHub: also extract ",{"type":40,"tag":104,"props":630,"children":632},{"className":631},[],[633],{"type":45,"value":634},"github_issue_repo",{"type":45,"value":636}," and ",{"type":40,"tag":104,"props":638,"children":640},{"className":639},[],[641],{"type":45,"value":642},"github_issue_number",{"type":45,"value":644}," from the URL. The target repo is known from the URL.",{"type":40,"tag":93,"props":646,"children":647},{},[648,650,656],{"type":45,"value":649},"For Jira: extract ",{"type":40,"tag":104,"props":651,"children":653},{"className":652},[],[654],{"type":45,"value":655},"jira_key",{"type":45,"value":657},". The target repo is NOT known yet — it is resolved later in Step 2 from the workspace\u002Fcomponent mapping.",{"type":40,"tag":41,"props":659,"children":660},{},[661,666],{"type":40,"tag":241,"props":662,"children":663},{},[664],{"type":45,"value":665},"Do NOT fetch issue details yet",{"type":45,"value":667}," — that happens after the readiness check confirms the required tools are available.",{"type":40,"tag":371,"props":669,"children":670},{},[],{"type":40,"tag":223,"props":672,"children":674},{"id":673},"step-05-readiness-check",[675],{"type":45,"value":676},"Step 0.5 — Readiness check",{"type":40,"tag":41,"props":678,"children":679},{},[680,682,687],{"type":45,"value":681},"Verify that all required tools are available before attempting to fetch the issue or fix the bug. The checks are source-aware based on ",{"type":40,"tag":104,"props":683,"children":685},{"className":684},[],[686],{"type":45,"value":604},{"type":45,"value":688}," from Step 0.",{"type":40,"tag":41,"props":690,"children":691},{},[692],{"type":45,"value":693},"Echo a readiness table to the terminal:",{"type":40,"tag":695,"props":696,"children":700},"pre",{"className":697,"code":699,"language":45},[698],"language-text","echo \"================ Readiness Check ===========\"\n",[701],{"type":40,"tag":104,"props":702,"children":703},{"__ignoreMap":195},[704],{"type":45,"value":699},{"type":40,"tag":706,"props":707,"children":709},"h3",{"id":708},"must-have-all-contexts",[710],{"type":45,"value":711},"Must-have (all contexts)",{"type":40,"tag":713,"props":714,"children":715},"table",{},[716,740],{"type":40,"tag":717,"props":718,"children":719},"thead",{},[720],{"type":40,"tag":721,"props":722,"children":723},"tr",{},[724,730,735],{"type":40,"tag":725,"props":726,"children":727},"th",{},[728],{"type":45,"value":729},"Tool",{"type":40,"tag":725,"props":731,"children":732},{},[733],{"type":45,"value":734},"Check command",{"type":40,"tag":725,"props":736,"children":737},{},[738],{"type":45,"value":739},"Install link",{"type":40,"tag":741,"props":742,"children":743},"tbody",{},[744,773,798,823],{"type":40,"tag":721,"props":745,"children":746},{},[747,757,765],{"type":40,"tag":748,"props":749,"children":750},"td",{},[751,756],{"type":40,"tag":104,"props":752,"children":754},{"className":753},[],[755],{"type":45,"value":249},{"type":45,"value":251},{"type":40,"tag":748,"props":758,"children":759},{},[760],{"type":40,"tag":104,"props":761,"children":763},{"className":762},[],[764],{"type":45,"value":259},{"type":40,"tag":748,"props":766,"children":767},{},[768],{"type":40,"tag":263,"props":769,"children":771},{"href":265,"rel":770},[267],[772],{"type":45,"value":265},{"type":40,"tag":721,"props":774,"children":775},{},[776,784,793],{"type":40,"tag":748,"props":777,"children":778},{},[779],{"type":40,"tag":104,"props":780,"children":782},{"className":781},[],[783],{"type":45,"value":348},{"type":40,"tag":748,"props":785,"children":786},{},[787],{"type":40,"tag":104,"props":788,"children":790},{"className":789},[],[791],{"type":45,"value":792},"yarn --version",{"type":40,"tag":748,"props":794,"children":795},{},[796],{"type":45,"value":797},"—",{"type":40,"tag":721,"props":799,"children":800},{},[801,810,819],{"type":40,"tag":748,"props":802,"children":803},{},[804],{"type":40,"tag":104,"props":805,"children":807},{"className":806},[],[808],{"type":45,"value":809},"node",{"type":40,"tag":748,"props":811,"children":812},{},[813],{"type":40,"tag":104,"props":814,"children":816},{"className":815},[],[817],{"type":45,"value":818},"node --version",{"type":40,"tag":748,"props":820,"children":821},{},[822],{"type":45,"value":797},{"type":40,"tag":721,"props":824,"children":825},{},[826,831,852],{"type":40,"tag":748,"props":827,"children":828},{},[829],{"type":45,"value":830},"Working checkout",{"type":40,"tag":748,"props":832,"children":833},{},[834,839,841,846,847],{"type":40,"tag":104,"props":835,"children":837},{"className":836},[],[838],{"type":45,"value":591},{"type":45,"value":840}," matches ",{"type":40,"tag":104,"props":842,"children":844},{"className":843},[],[845],{"type":45,"value":331},{"type":45,"value":333},{"type":40,"tag":104,"props":848,"children":850},{"className":849},[],[851],{"type":45,"value":339},{"type":40,"tag":748,"props":853,"children":854},{},[855],{"type":45,"value":797},{"type":40,"tag":706,"props":857,"children":859},{"id":858},"must-have-source-conditional",[860],{"type":45,"value":861},"Must-have (source-conditional)",{"type":40,"tag":713,"props":863,"children":864},{},[865,885],{"type":40,"tag":717,"props":866,"children":867},{},[868],{"type":40,"tag":721,"props":869,"children":870},{},[871,876,880],{"type":40,"tag":725,"props":872,"children":873},{},[874],{"type":45,"value":875},"Condition",{"type":40,"tag":725,"props":877,"children":878},{},[879],{"type":45,"value":729},{"type":40,"tag":725,"props":881,"children":882},{},[883],{"type":45,"value":884},"Check",{"type":40,"tag":741,"props":886,"children":887},{},[888],{"type":40,"tag":721,"props":889,"children":890},{},[891,896,915],{"type":40,"tag":748,"props":892,"children":893},{},[894],{"type":45,"value":895},"Jira issue",{"type":40,"tag":748,"props":897,"children":898},{},[899,901,906,908,913],{"type":45,"value":900},"At least ONE of: ",{"type":40,"tag":104,"props":902,"children":904},{"className":903},[],[905],{"type":45,"value":291},{"type":45,"value":907}," + ",{"type":40,"tag":104,"props":909,"children":911},{"className":910},[],[912],{"type":45,"value":299},{"type":45,"value":914},", OR Jira MCP",{"type":40,"tag":748,"props":916,"children":917},{},[918,924],{"type":40,"tag":104,"props":919,"children":921},{"className":920},[],[922],{"type":45,"value":923},"which acli",{"type":45,"value":925}," + token file exists, OR MCP tool discovery",{"type":40,"tag":706,"props":927,"children":929},{"id":928},"good-to-have-warn-only-do-not-block",[930],{"type":45,"value":931},"Good-to-have (warn only, do not block)",{"type":40,"tag":713,"props":933,"children":934},{},[935,959],{"type":40,"tag":717,"props":936,"children":937},{},[938],{"type":40,"tag":721,"props":939,"children":940},{},[941,945,949,954],{"type":40,"tag":725,"props":942,"children":943},{},[944],{"type":45,"value":729},{"type":40,"tag":725,"props":946,"children":947},{},[948],{"type":45,"value":875},{"type":40,"tag":725,"props":950,"children":951},{},[952],{"type":45,"value":953},"What it enables",{"type":40,"tag":725,"props":955,"children":956},{},[957],{"type":45,"value":958},"Link",{"type":40,"tag":741,"props":960,"children":961},{},[962,992,1021],{"type":40,"tag":721,"props":963,"children":964},{},[965,973,978,983],{"type":40,"tag":748,"props":966,"children":967},{},[968],{"type":40,"tag":104,"props":969,"children":971},{"className":970},[],[972],{"type":45,"value":359},{"type":40,"tag":748,"props":974,"children":975},{},[976],{"type":45,"value":977},"Always",{"type":40,"tag":748,"props":979,"children":980},{},[981],{"type":45,"value":982},"Video conversion (.webm → .gif)",{"type":40,"tag":748,"props":984,"children":985},{},[986],{"type":40,"tag":263,"props":987,"children":990},{"href":988,"rel":989},"https:\u002F\u002Fffmpeg.org\u002Fdownload.html",[267],[991],{"type":45,"value":988},{"type":40,"tag":721,"props":993,"children":994},{},[995,1003,1008,1013],{"type":40,"tag":748,"props":996,"children":997},{},[998],{"type":40,"tag":104,"props":999,"children":1001},{"className":1000},[],[1002],{"type":45,"value":291},{"type":40,"tag":748,"props":1004,"children":1005},{},[1006],{"type":45,"value":1007},"GitHub issue path",{"type":40,"tag":748,"props":1009,"children":1010},{},[1011],{"type":45,"value":1012},"Jira cross-linking if needed later",{"type":40,"tag":748,"props":1014,"children":1015},{},[1016],{"type":40,"tag":263,"props":1017,"children":1019},{"href":304,"rel":1018},[267],[1020],{"type":45,"value":304},{"type":40,"tag":721,"props":1022,"children":1023},{},[1024,1029,1034,1039],{"type":40,"tag":748,"props":1025,"children":1026},{},[1027],{"type":45,"value":1028},"Second Jira tool",{"type":40,"tag":748,"props":1030,"children":1031},{},[1032],{"type":45,"value":1033},"Jira path, only one of ACLI\u002FMCP present",{"type":40,"tag":748,"props":1035,"children":1036},{},[1037],{"type":45,"value":1038},"ACLI: transitions + labels. MCP: rich reads + comments",{"type":40,"tag":748,"props":1040,"children":1041},{},[1042],{"type":45,"value":797},{"type":40,"tag":706,"props":1044,"children":1046},{"id":1045},"output-format",[1047],{"type":45,"value":1048},"Output format",{"type":40,"tag":695,"props":1050,"children":1053},{"className":1051,"code":1052,"language":45},[698]," [PASS]  gh CLI — authenticated as \u003Cuser>\n [PASS]  yarn — v\u003Cversion>\n [PASS]  node — v\u003Cversion>\n [PASS]  Working checkout — rhdh-plugins (detected from git remote)\n [PASS]  acli — v\u003Cversion>\n [PASS]  .jira-token — configured\n [WARN]  ffmpeg — not found (video will remain as .webm) — https:\u002F\u002Fffmpeg.org\u002Fdownload.html\n [WARN]  Jira MCP — not configured (Jira comment updates will be skipped)\n",[1054],{"type":40,"tag":104,"props":1055,"children":1056},{"__ignoreMap":195},[1057],{"type":45,"value":1052},{"type":40,"tag":41,"props":1059,"children":1060},{},[1061,1066],{"type":40,"tag":241,"props":1062,"children":1063},{},[1064],{"type":45,"value":1065},"If ANY must-have check fails:",{"type":45,"value":1067}," STOP with clear instructions on how to install\u002Fconfigure the missing tool.",{"type":40,"tag":41,"props":1069,"children":1070},{},[1071,1076],{"type":40,"tag":241,"props":1072,"children":1073},{},[1074],{"type":45,"value":1075},"If only good-to-have items are missing:",{"type":45,"value":1077}," proceed with warnings.",{"type":40,"tag":371,"props":1079,"children":1080},{},[],{"type":40,"tag":223,"props":1082,"children":1084},{"id":1083},"step-1-fetch-issue-details",[1085],{"type":45,"value":1086},"Step 1 — Fetch issue details",{"type":40,"tag":41,"props":1088,"children":1089},{},[1090],{"type":45,"value":1091},"Now that the readiness check has confirmed the required tools are available, fetch the issue.",{"type":40,"tag":706,"props":1093,"children":1095},{"id":1094},"if-issue_source-jira",[1096,1098,1103,1104],{"type":45,"value":1097},"If ",{"type":40,"tag":104,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":45,"value":604},{"type":45,"value":606},{"type":40,"tag":104,"props":1105,"children":1107},{"className":1106},[],[1108],{"type":45,"value":612},{"type":40,"tag":41,"props":1110,"children":1111},{},[1112,1114,1120],{"type":45,"value":1113},"Read ",{"type":40,"tag":104,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":45,"value":1119},"references\u002Fworkspace-map.md",{"type":45,"value":1121}," for the Jira component-to-workspace mapping.",{"type":40,"tag":158,"props":1123,"children":1124},{},[1125,1168],{"type":40,"tag":93,"props":1126,"children":1127},{},[1128,1130,1136,1138,1143,1145],{"type":45,"value":1129},"Fetch the full issue details using Jira MCP (",{"type":40,"tag":104,"props":1131,"children":1133},{"className":1132},[],[1134],{"type":45,"value":1135},"read_jira_issue",{"type":45,"value":1137},") or REST API (per ",{"type":40,"tag":104,"props":1139,"children":1141},{"className":1140},[],[1142],{"type":45,"value":493},{"type":45,"value":1144},"):\n",{"type":40,"tag":89,"props":1146,"children":1147},{},[1148,1153,1158,1163],{"type":40,"tag":93,"props":1149,"children":1150},{},[1151],{"type":45,"value":1152},"Summary, description, steps to reproduce",{"type":40,"tag":93,"props":1154,"children":1155},{},[1156],{"type":45,"value":1157},"Component field (maps to workspace)",{"type":40,"tag":93,"props":1159,"children":1160},{},[1161],{"type":45,"value":1162},"Status (for post-PR transition)",{"type":40,"tag":93,"props":1164,"children":1165},{},[1166],{"type":45,"value":1167},"Attachments\u002Fscreenshots (visual reference for reproduction)",{"type":40,"tag":93,"props":1169,"children":1170},{},[1171,1173,1178,1180,1186,1187,1193,1194,1200,1201,1207,1208],{"type":45,"value":1172},"Store: ",{"type":40,"tag":104,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":45,"value":655},{"type":45,"value":1179},", ",{"type":40,"tag":104,"props":1181,"children":1183},{"className":1182},[],[1184],{"type":45,"value":1185},"jira_url",{"type":45,"value":1179},{"type":40,"tag":104,"props":1188,"children":1190},{"className":1189},[],[1191],{"type":45,"value":1192},"jira_summary",{"type":45,"value":1179},{"type":40,"tag":104,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":45,"value":1199},"jira_description",{"type":45,"value":1179},{"type":40,"tag":104,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":45,"value":1206},"jira_component",{"type":45,"value":1179},{"type":40,"tag":104,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":45,"value":1213},"jira_status",{"type":40,"tag":706,"props":1215,"children":1217},{"id":1216},"if-issue_source-github",[1218,1219,1224,1225],{"type":45,"value":1097},{"type":40,"tag":104,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":45,"value":604},{"type":45,"value":606},{"type":40,"tag":104,"props":1226,"children":1228},{"className":1227},[],[1229],{"type":45,"value":619},{"type":40,"tag":41,"props":1231,"children":1232},{},[1233,1234,1239,1241,1246],{"type":45,"value":1113},{"type":40,"tag":104,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":45,"value":546},{"type":45,"value":1240}," for ",{"type":40,"tag":104,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":45,"value":249},{"type":45,"value":1247}," CLI patterns.",{"type":40,"tag":158,"props":1249,"children":1250},{},[1251,1265],{"type":40,"tag":93,"props":1252,"children":1253},{},[1254,1256],{"type":45,"value":1255},"Fetch the issue:\n",{"type":40,"tag":695,"props":1257,"children":1260},{"className":1258,"code":1259,"language":45},[698],"gh issue view \u003CNUMBER> --repo \u003Cowner\u002Frepo> --json title,body,labels,state,comments\n",[1261],{"type":40,"tag":104,"props":1262,"children":1263},{"__ignoreMap":195},[1264],{"type":45,"value":1259},{"type":40,"tag":93,"props":1266,"children":1267},{},[1268,1269,1274,1275,1281,1282,1287,1288,1294,1295,1301,1302],{"type":45,"value":1172},{"type":40,"tag":104,"props":1270,"children":1272},{"className":1271},[],[1273],{"type":45,"value":642},{"type":45,"value":1179},{"type":40,"tag":104,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":45,"value":1280},"github_issue_url",{"type":45,"value":1179},{"type":40,"tag":104,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":45,"value":634},{"type":45,"value":1179},{"type":40,"tag":104,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":45,"value":1293},"github_issue_title",{"type":45,"value":1179},{"type":40,"tag":104,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":45,"value":1300},"github_issue_body",{"type":45,"value":1179},{"type":40,"tag":104,"props":1303,"children":1305},{"className":1304},[],[1306],{"type":45,"value":1307},"github_issue_labels",{"type":40,"tag":371,"props":1309,"children":1310},{},[],{"type":40,"tag":223,"props":1312,"children":1314},{"id":1313},"step-15-issue-triage",[1315],{"type":45,"value":1316},"Step 1.5 — Issue triage",{"type":40,"tag":41,"props":1318,"children":1319},{},[1320],{"type":45,"value":1321},"Validate that the issue has enough detail for an automated fix. This gate prevents wasted effort on underspecified bugs.",{"type":40,"tag":706,"props":1323,"children":1325},{"id":1324},"required-fields",[1326],{"type":45,"value":1327},"Required fields",{"type":40,"tag":41,"props":1329,"children":1330},{},[1331],{"type":45,"value":1332},"Regardless of source, the issue must contain:",{"type":40,"tag":89,"props":1334,"children":1335},{},[1336,1346,1356,1374],{"type":40,"tag":93,"props":1337,"children":1338},{},[1339,1344],{"type":40,"tag":241,"props":1340,"children":1341},{},[1342],{"type":45,"value":1343},"Steps to reproduce",{"type":45,"value":1345}," — clear numbered steps",{"type":40,"tag":93,"props":1347,"children":1348},{},[1349,1354],{"type":40,"tag":241,"props":1350,"children":1351},{},[1352],{"type":45,"value":1353},"Expected behavior",{"type":45,"value":1355}," — what should happen after the fix",{"type":40,"tag":93,"props":1357,"children":1358},{},[1359,1364,1366,1372],{"type":40,"tag":241,"props":1360,"children":1361},{},[1362],{"type":45,"value":1363},"Component \u002F workspace",{"type":45,"value":1365}," — identifiable from Jira Component field, GitHub ",{"type":40,"tag":104,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":45,"value":1371},"workspace\u002F*",{"type":45,"value":1373}," label, issue title prefix, or issue body",{"type":40,"tag":93,"props":1375,"children":1376},{},[1377,1382],{"type":40,"tag":241,"props":1378,"children":1379},{},[1380],{"type":45,"value":1381},"Target repository",{"type":45,"value":1383}," — derivable from GitHub issue URL directly, or from Jira Component-to-workspace mapping",{"type":40,"tag":41,"props":1385,"children":1386},{},[1387,1389,1394],{"type":45,"value":1388},"For ",{"type":40,"tag":241,"props":1390,"children":1391},{},[1392],{"type":45,"value":1393},"Jira issues",{"type":45,"value":1395},", map to the standard bug template fields:",{"type":40,"tag":89,"props":1397,"children":1398},{},[1399,1410,1420],{"type":40,"tag":93,"props":1400,"children":1401},{},[1402,1408],{"type":40,"tag":104,"props":1403,"children":1405},{"className":1404},[],[1406],{"type":45,"value":1407},"Description of problem",{"type":45,"value":1409}," — present",{"type":40,"tag":93,"props":1411,"children":1412},{},[1413,1419],{"type":40,"tag":104,"props":1414,"children":1416},{"className":1415},[],[1417],{"type":45,"value":1418},"Steps to Reproduce",{"type":45,"value":1409},{"type":40,"tag":93,"props":1421,"children":1422},{},[1423,1429],{"type":40,"tag":104,"props":1424,"children":1426},{"className":1425},[],[1427],{"type":45,"value":1428},"Expected results",{"type":45,"value":1409},{"type":40,"tag":41,"props":1431,"children":1432},{},[1433,1434,1439,1441,1447,1448,1454,1455,1461,1462,1468],{"type":45,"value":1388},{"type":40,"tag":241,"props":1435,"children":1436},{},[1437],{"type":45,"value":1438},"GitHub issues",{"type":45,"value":1440},", scan the issue body for headings or sections containing reproduction steps and expected behavior (common patterns: ",{"type":40,"tag":104,"props":1442,"children":1444},{"className":1443},[],[1445],{"type":45,"value":1446},"## Steps to reproduce",{"type":45,"value":1179},{"type":40,"tag":104,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":45,"value":1453},"## Expected behavior",{"type":45,"value":1179},{"type":40,"tag":104,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":45,"value":1460},"### How to reproduce",{"type":45,"value":1179},{"type":40,"tag":104,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":45,"value":1467},"### Reproduction steps",{"type":45,"value":1469},").",{"type":40,"tag":706,"props":1471,"children":1473},{"id":1472},"if-triage-fails-not-agent-ready",[1474],{"type":45,"value":1475},"If triage fails (not agent-ready)",{"type":40,"tag":41,"props":1477,"children":1478},{},[1479],{"type":45,"value":1480},"Automatically:",{"type":40,"tag":158,"props":1482,"children":1483},{},[1484,1527,1546,1556],{"type":40,"tag":93,"props":1485,"children":1486},{},[1487,1492,1494,1500,1502],{"type":40,"tag":241,"props":1488,"children":1489},{},[1490],{"type":45,"value":1491},"Add label",{"type":45,"value":1493}," ",{"type":40,"tag":104,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":45,"value":1499},"not-ready-for-agent",{"type":45,"value":1501}," on the issue:",{"type":40,"tag":89,"props":1503,"children":1504},{},[1505,1516],{"type":40,"tag":93,"props":1506,"children":1507},{},[1508,1510],{"type":45,"value":1509},"Jira: ",{"type":40,"tag":104,"props":1511,"children":1513},{"className":1512},[],[1514],{"type":45,"value":1515},"acli jira workitem edit --key \"$KEY\" --label \"not-ready-for-agent\" --yes",{"type":40,"tag":93,"props":1517,"children":1518},{},[1519,1521],{"type":45,"value":1520},"GitHub: ",{"type":40,"tag":104,"props":1522,"children":1524},{"className":1523},[],[1525],{"type":45,"value":1526},"gh issue edit \u003CN> --repo \u003Crepo> --add-label \"not-ready-for-agent\"",{"type":40,"tag":93,"props":1528,"children":1529},{},[1530,1535,1537],{"type":40,"tag":241,"props":1531,"children":1532},{},[1533],{"type":45,"value":1534},"Add comment",{"type":45,"value":1536}," with a missing-info checklist (only unchecked items are those actually missing; present items show as checked):",{"type":40,"tag":695,"props":1538,"children":1541},{"className":1539,"code":1540,"language":45},[698],"This bug is not ready for automated fixing. The following information is missing:\n\n- [ ] Steps to reproduce\n- [ ] Component \u002F workspace\n- [ ] Expected behavior\n- [ ] Target repository (rhdh-plugins or community-plugins)\n\nPlease update this ticket with the missing details and remove the \"not-ready-for-agent\" label when ready.\n",[1542],{"type":40,"tag":104,"props":1543,"children":1544},{"__ignoreMap":195},[1545],{"type":45,"value":1540},{"type":40,"tag":93,"props":1547,"children":1548},{},[1549,1554],{"type":40,"tag":241,"props":1550,"children":1551},{},[1552],{"type":45,"value":1553},"Echo the same to the user",{"type":45,"value":1555}," in the terminal.",{"type":40,"tag":93,"props":1557,"children":1558},{},[1559,1564],{"type":40,"tag":241,"props":1560,"children":1561},{},[1562],{"type":45,"value":1563},"STOP",{"type":45,"value":1565}," — do not proceed with the fix.",{"type":40,"tag":706,"props":1567,"children":1569},{"id":1568},"if-triage-passes",[1570],{"type":45,"value":1571},"If triage passes",{"type":40,"tag":41,"props":1573,"children":1574},{},[1575],{"type":45,"value":1576},"Echo a summary of extracted fields (issue key\u002FURL, summary, workspace, repo) and proceed to Step 2.",{"type":40,"tag":371,"props":1578,"children":1579},{},[],{"type":40,"tag":223,"props":1581,"children":1583},{"id":1582},"step-2-identify-workspace-repo-and-discover-infrastructure",[1584],{"type":45,"value":1585},"Step 2 — Identify workspace, repo, and discover infrastructure",{"type":40,"tag":41,"props":1587,"children":1588},{},[1589,1590,1595],{"type":45,"value":1113},{"type":40,"tag":104,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":45,"value":1119},{"type":45,"value":1596}," for workspace detection strategies.",{"type":40,"tag":706,"props":1598,"children":1600},{"id":1599},"workspace-and-repo-detection",[1601],{"type":45,"value":1602},"Workspace and repo detection",{"type":40,"tag":41,"props":1604,"children":1605},{},[1606,1623,1625,1630,1632,1637],{"type":40,"tag":241,"props":1607,"children":1608},{},[1609,1610,1615,1616,1621],{"type":45,"value":1097},{"type":40,"tag":104,"props":1611,"children":1613},{"className":1612},[],[1614],{"type":45,"value":604},{"type":45,"value":606},{"type":40,"tag":104,"props":1617,"children":1619},{"className":1618},[],[1620],{"type":45,"value":619},{"type":45,"value":1622},":",{"type":45,"value":1624},"\nThe target repo is already known from the issue URL. Identify the workspace within that repo using the strategies in ",{"type":40,"tag":104,"props":1626,"children":1628},{"className":1627},[],[1629],{"type":45,"value":1119},{"type":45,"value":1631}," (labels, body fields, title prefix, package names). See also ",{"type":40,"tag":104,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":45,"value":546},{"type":45,"value":1638}," for workspace extraction from GitHub issues.",{"type":40,"tag":41,"props":1640,"children":1641},{},[1642,1658,1660,1665,1667,1672],{"type":40,"tag":241,"props":1643,"children":1644},{},[1645,1646,1651,1652,1657],{"type":45,"value":1097},{"type":40,"tag":104,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":45,"value":604},{"type":45,"value":606},{"type":40,"tag":104,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":45,"value":612},{"type":45,"value":1622},{"type":45,"value":1659},"\nThe target repo is NOT yet known. Map the Jira ",{"type":40,"tag":241,"props":1661,"children":1662},{},[1663],{"type":45,"value":1664},"Component",{"type":45,"value":1666}," field to a workspace directory using ",{"type":40,"tag":104,"props":1668,"children":1670},{"className":1669},[],[1671],{"type":45,"value":1119},{"type":45,"value":1673},". The workspace mapping determines which repo to target (rhdh-plugins vs community-plugins).",{"type":40,"tag":89,"props":1675,"children":1676},{},[1677],{"type":40,"tag":93,"props":1678,"children":1679},{},[1680],{"type":45,"value":1681},"If no component is set or the component is unknown: ask the user which workspace and repo to target.",{"type":40,"tag":706,"props":1683,"children":1685},{"id":1684},"navigate-and-discover",[1686],{"type":45,"value":1687},"Navigate and discover",{"type":40,"tag":158,"props":1689,"children":1690},{},[1691,1702,1772],{"type":40,"tag":93,"props":1692,"children":1693},{},[1694,1696],{"type":45,"value":1695},"Navigate to the workspace: ",{"type":40,"tag":104,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":45,"value":1701},"cd workspaces\u002F\u003Cworkspace-dir>",{"type":40,"tag":93,"props":1703,"children":1704},{},[1705,1710,1712],{"type":40,"tag":241,"props":1706,"children":1707},{},[1708],{"type":45,"value":1709},"Discover infrastructure dynamically",{"type":45,"value":1711},":\n",{"type":40,"tag":89,"props":1713,"children":1714},{},[1715,1735,1748,1760],{"type":40,"tag":93,"props":1716,"children":1717},{},[1718,1719,1725,1727,1733],{"type":45,"value":1113},{"type":40,"tag":104,"props":1720,"children":1722},{"className":1721},[],[1723],{"type":45,"value":1724},"playwright.config.ts",{"type":45,"value":1726}," (if present) for port configuration, locale list, start commands, and ",{"type":40,"tag":104,"props":1728,"children":1730},{"className":1729},[],[1731],{"type":45,"value":1732},"APP_MODE",{"type":45,"value":1734}," support.",{"type":40,"tag":93,"props":1736,"children":1737},{},[1738,1740,1746],{"type":45,"value":1739},"Scan ",{"type":40,"tag":104,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":45,"value":1745},"e2e-tests\u002Futils\u002F",{"type":45,"value":1747}," to discover available helper functions (translations, navigation, API mocking, accessibility).",{"type":40,"tag":93,"props":1749,"children":1750},{},[1751,1752,1758],{"type":45,"value":1113},{"type":40,"tag":104,"props":1753,"children":1755},{"className":1754},[],[1756],{"type":45,"value":1757},"plugins\u002F*\u002Fsrc\u002Ftranslations\u002Fref.ts",{"type":45,"value":1759}," for translation key structure (used for i18n-safe selectors).",{"type":40,"tag":93,"props":1761,"children":1762},{},[1763,1764,1770],{"type":45,"value":1113},{"type":40,"tag":104,"props":1765,"children":1767},{"className":1766},[],[1768],{"type":45,"value":1769},"plugins\u002F*\u002Fsrc\u002Fcomponents\u002F",{"type":45,"value":1771}," to build a component-to-source-file map.",{"type":40,"tag":93,"props":1773,"children":1774},{},[1775,1777,1783,1785,1791],{"type":45,"value":1776},"Run ",{"type":40,"tag":104,"props":1778,"children":1780},{"className":1779},[],[1781],{"type":45,"value":1782},"yarn install",{"type":45,"value":1784}," if ",{"type":40,"tag":104,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":45,"value":1790},"node_modules",{"type":45,"value":1792}," is missing or stale.",{"type":40,"tag":41,"props":1794,"children":1795},{},[1796,1797,1803],{"type":45,"value":1113},{"type":40,"tag":104,"props":1798,"children":1800},{"className":1799},[],[1801],{"type":45,"value":1802},"references\u002Fe2e-patterns.md",{"type":45,"value":1804}," for shared Playwright patterns.",{"type":40,"tag":706,"props":1806,"children":1808},{"id":1807},"step-25-determine-e2e-mode",[1809],{"type":45,"value":1810},"Step 2.5 — Determine e2e mode",{"type":40,"tag":41,"props":1812,"children":1813},{},[1814],{"type":45,"value":1815},"After discovering the workspace infrastructure, determine the execution mode:",{"type":40,"tag":89,"props":1817,"children":1818},{},[1819,1836],{"type":40,"tag":93,"props":1820,"children":1821},{},[1822,1827,1829,1834],{"type":40,"tag":241,"props":1823,"children":1824},{},[1825],{"type":45,"value":1826},"full-e2e mode",{"type":45,"value":1828}," — when the workspace has ",{"type":40,"tag":104,"props":1830,"children":1832},{"className":1831},[],[1833],{"type":45,"value":1724},{"type":45,"value":1835}," AND the bug involves a UI component.",{"type":40,"tag":93,"props":1837,"children":1838},{},[1839,1844,1846,1851],{"type":40,"tag":241,"props":1840,"children":1841},{},[1842],{"type":45,"value":1843},"no-e2e mode",{"type":45,"value":1845}," — when the workspace has NO ",{"type":40,"tag":104,"props":1847,"children":1849},{"className":1848},[],[1850],{"type":45,"value":1724},{"type":45,"value":1852},", OR the bug is backend-only (API, config, logic, data processing).",{"type":40,"tag":41,"props":1854,"children":1855},{},[1856,1861],{"type":40,"tag":241,"props":1857,"children":1858},{},[1859],{"type":45,"value":1860},"In full-e2e mode:",{"type":45,"value":1862}," Proceed with Steps 3–7 as defined (write repro test, capture before video, fix, capture after video, convert videos).",{"type":40,"tag":41,"props":1864,"children":1865},{},[1866,1871],{"type":40,"tag":241,"props":1867,"children":1868},{},[1869],{"type":45,"value":1870},"In no-e2e mode:",{"type":45,"value":1872}," Skip Steps 3, 4, 6, 7 entirely. The workflow becomes:",{"type":40,"tag":158,"props":1874,"children":1875},{},[1876,1894,1912,1922,1932,1956,1966],{"type":40,"tag":93,"props":1877,"children":1878},{},[1879,1884,1886,1892],{"type":40,"tag":241,"props":1880,"children":1881},{},[1882],{"type":45,"value":1883},"Check existing test coverage",{"type":45,"value":1885},": Run ",{"type":40,"tag":104,"props":1887,"children":1889},{"className":1888},[],[1890],{"type":45,"value":1891},"yarn test --watchAll=false",{"type":45,"value":1893}," and check if any existing test already fails on the bug. If yes, use that test as the repro confirmation — no need to write a new one.",{"type":40,"tag":93,"props":1895,"children":1896},{},[1897,1902,1904,1910],{"type":40,"tag":241,"props":1898,"children":1899},{},[1900],{"type":45,"value":1901},"If no existing test covers the bug",{"type":45,"value":1903},": Write a temporary repro unit test (",{"type":40,"tag":104,"props":1905,"children":1907},{"className":1906},[],[1908],{"type":45,"value":1909},"_repro-\u003CKEY>.test.ts",{"type":45,"value":1911},") that reproduces the bug. Run it — it should FAIL (bug confirmed).",{"type":40,"tag":93,"props":1913,"children":1914},{},[1915,1920],{"type":40,"tag":241,"props":1916,"children":1917},{},[1918],{"type":45,"value":1919},"Diagnose root cause",{"type":45,"value":1921},": No browser-based diagnostics (screenshots, DOM snapshots, computed styles) are available. Diagnosis relies on source code analysis, error logs\u002Fstack traces from the issue description, and test output.",{"type":40,"tag":93,"props":1923,"children":1924},{},[1925,1930],{"type":40,"tag":241,"props":1926,"children":1927},{},[1928],{"type":45,"value":1929},"Apply the fix",{"type":45,"value":1931}," in source code.",{"type":40,"tag":93,"props":1933,"children":1934},{},[1935,1940,1942,1948,1949,1954],{"type":40,"tag":241,"props":1936,"children":1937},{},[1938],{"type":45,"value":1939},"Verify",{"type":45,"value":1941},": ",{"type":40,"tag":104,"props":1943,"children":1945},{"className":1944},[],[1946],{"type":45,"value":1947},"yarn tsc:full",{"type":45,"value":907},{"type":40,"tag":104,"props":1950,"children":1952},{"className":1951},[],[1953],{"type":45,"value":1891},{"type":45,"value":1955}," — all tests must pass (including the repro test or the previously-failing existing test).",{"type":40,"tag":93,"props":1957,"children":1958},{},[1959,1964],{"type":40,"tag":241,"props":1960,"children":1961},{},[1962],{"type":45,"value":1963},"Delete repro test",{"type":45,"value":1965}," if one was written (same principle as full-e2e: the repro test is a diagnostic tool, not a deliverable).",{"type":40,"tag":93,"props":1967,"children":1968},{},[1969],{"type":45,"value":1970},"Proceed to Step 8 — but with NO recordings in caller context.",{"type":40,"tag":371,"props":1972,"children":1973},{},[],{"type":40,"tag":223,"props":1975,"children":1977},{"id":1976},"step-3-write-reproduction-test-with-video-recording-full-e2e-only",[1978,1980],{"type":45,"value":1979},"Step 3 — Write reproduction test with video recording ",{"type":40,"tag":1981,"props":1982,"children":1983},"span",{},[1984],{"type":45,"value":1985},"full-e2e only",{"type":40,"tag":41,"props":1987,"children":1988},{},[1989,1990,1995,1997,2003],{"type":45,"value":1113},{"type":40,"tag":104,"props":1991,"children":1993},{"className":1992},[],[1994],{"type":45,"value":1802},{"type":45,"value":1996}," for test patterns and ",{"type":40,"tag":104,"props":1998,"children":2000},{"className":1999},[],[2001],{"type":45,"value":2002},"references\u002Fvideo-recording.md",{"type":45,"value":2004}," for video configuration.",{"type":40,"tag":158,"props":2006,"children":2007},{},[2008,2060,2523,2556,2592],{"type":40,"tag":93,"props":2009,"children":2010},{},[2011,2013,2019,2021,2027,2029,2035,2036,2042,2044],{"type":45,"value":2012},"Create a temporary test file: ",{"type":40,"tag":104,"props":2014,"children":2016},{"className":2015},[],[2017],{"type":45,"value":2018},"e2e-tests\u002F_repro-\u003CKEY>.test.ts",{"type":45,"value":2020}," (where ",{"type":40,"tag":104,"props":2022,"children":2024},{"className":2023},[],[2025],{"type":45,"value":2026},"\u003CKEY>",{"type":45,"value":2028}," is the Jira key or GitHub issue number, e.g., ",{"type":40,"tag":104,"props":2030,"children":2032},{"className":2031},[],[2033],{"type":45,"value":2034},"_repro-RHDHBUGS-1934.test.ts",{"type":45,"value":333},{"type":40,"tag":104,"props":2037,"children":2039},{"className":2038},[],[2040],{"type":45,"value":2041},"_repro-607.test.ts",{"type":45,"value":2043},").\n",{"type":40,"tag":89,"props":2045,"children":2046},{},[2047],{"type":40,"tag":93,"props":2048,"children":2049},{},[2050,2052,2058],{"type":45,"value":2051},"The ",{"type":40,"tag":104,"props":2053,"children":2055},{"className":2054},[],[2056],{"type":45,"value":2057},"_",{"type":45,"value":2059}," prefix signals this file is temporary and should not be committed.",{"type":40,"tag":93,"props":2061,"children":2062},{},[2063,2065],{"type":45,"value":2064},"The test must:\n",{"type":40,"tag":89,"props":2066,"children":2067},{},[2068,2080,2085,2474,2506,2511],{"type":40,"tag":93,"props":2069,"children":2070},{},[2071,2073,2078],{"type":45,"value":2072},"Import workspace-specific helpers discovered in Step 2 ",{"type":40,"tag":241,"props":2074,"children":2075},{},[2076],{"type":45,"value":2077},"only for navigation\u002Fsetup",{"type":45,"value":2079}," (e.g., API mocking, translations).",{"type":40,"tag":93,"props":2081,"children":2082},{},[2083],{"type":45,"value":2084},"Use i18n-safe selectors (via translation keys) where available.",{"type":40,"tag":93,"props":2086,"children":2087},{},[2088,2093,2095,2101,2103,2472],{"type":40,"tag":241,"props":2089,"children":2090},{},[2091],{"type":45,"value":2092},"Always create its own browser context with video recording",{"type":45,"value":2094}," — do NOT rely on workspace bootstrap helpers for the context, as they may not enable video. Use the ",{"type":40,"tag":104,"props":2096,"children":2098},{"className":2097},[],[2099],{"type":45,"value":2100},"browser",{"type":45,"value":2102}," fixture directly:\n",{"type":40,"tag":695,"props":2104,"children":2108},{"className":2105,"code":2106,"language":2107,"meta":195,"style":195},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","test('repro', async ({ browser }) => {\n  const context = await browser.newContext({\n    recordVideo: { dir: 'test-results\u002F', size: { width: 1280, height: 720 } },\n  });\n  const page = await context.newPage();\n  \n  \u002F\u002F ... test steps using page ...\n  \n  await context.close(); \u002F\u002F finalizes the video file\n});\n","typescript",[2109],{"type":40,"tag":104,"props":2110,"children":2111},{"__ignoreMap":195},[2112,2182,2230,2331,2349,2392,2401,2411,2419,2455],{"type":40,"tag":1981,"props":2113,"children":2116},{"class":2114,"line":2115},"line",1,[2117,2123,2129,2135,2141,2145,2150,2156,2161,2167,2172,2177],{"type":40,"tag":1981,"props":2118,"children":2120},{"style":2119},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[2121],{"type":45,"value":2122},"test",{"type":40,"tag":1981,"props":2124,"children":2126},{"style":2125},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[2127],{"type":45,"value":2128},"(",{"type":40,"tag":1981,"props":2130,"children":2132},{"style":2131},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2133],{"type":45,"value":2134},"'",{"type":40,"tag":1981,"props":2136,"children":2138},{"style":2137},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[2139],{"type":45,"value":2140},"repro",{"type":40,"tag":1981,"props":2142,"children":2143},{"style":2131},[2144],{"type":45,"value":2134},{"type":40,"tag":1981,"props":2146,"children":2147},{"style":2131},[2148],{"type":45,"value":2149},",",{"type":40,"tag":1981,"props":2151,"children":2153},{"style":2152},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[2154],{"type":45,"value":2155}," async",{"type":40,"tag":1981,"props":2157,"children":2158},{"style":2131},[2159],{"type":45,"value":2160}," ({",{"type":40,"tag":1981,"props":2162,"children":2164},{"style":2163},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[2165],{"type":45,"value":2166}," browser",{"type":40,"tag":1981,"props":2168,"children":2169},{"style":2131},[2170],{"type":45,"value":2171}," })",{"type":40,"tag":1981,"props":2173,"children":2174},{"style":2152},[2175],{"type":45,"value":2176}," =>",{"type":40,"tag":1981,"props":2178,"children":2179},{"style":2131},[2180],{"type":45,"value":2181}," {\n",{"type":40,"tag":1981,"props":2183,"children":2185},{"class":2114,"line":2184},2,[2186,2191,2196,2201,2207,2211,2215,2220,2225],{"type":40,"tag":1981,"props":2187,"children":2188},{"style":2152},[2189],{"type":45,"value":2190},"  const",{"type":40,"tag":1981,"props":2192,"children":2193},{"style":2125},[2194],{"type":45,"value":2195}," context",{"type":40,"tag":1981,"props":2197,"children":2198},{"style":2131},[2199],{"type":45,"value":2200}," =",{"type":40,"tag":1981,"props":2202,"children":2204},{"style":2203},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[2205],{"type":45,"value":2206}," await",{"type":40,"tag":1981,"props":2208,"children":2209},{"style":2125},[2210],{"type":45,"value":2166},{"type":40,"tag":1981,"props":2212,"children":2213},{"style":2131},[2214],{"type":45,"value":399},{"type":40,"tag":1981,"props":2216,"children":2217},{"style":2119},[2218],{"type":45,"value":2219},"newContext",{"type":40,"tag":1981,"props":2221,"children":2223},{"style":2222},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[2224],{"type":45,"value":2128},{"type":40,"tag":1981,"props":2226,"children":2227},{"style":2131},[2228],{"type":45,"value":2229},"{\n",{"type":40,"tag":1981,"props":2231,"children":2233},{"class":2114,"line":2232},3,[2234,2239,2243,2248,2253,2257,2262,2267,2271,2275,2280,2284,2288,2293,2297,2303,2307,2312,2316,2321,2326],{"type":40,"tag":1981,"props":2235,"children":2236},{"style":2222},[2237],{"type":45,"value":2238},"    recordVideo",{"type":40,"tag":1981,"props":2240,"children":2241},{"style":2131},[2242],{"type":45,"value":1622},{"type":40,"tag":1981,"props":2244,"children":2245},{"style":2131},[2246],{"type":45,"value":2247}," {",{"type":40,"tag":1981,"props":2249,"children":2250},{"style":2222},[2251],{"type":45,"value":2252}," dir",{"type":40,"tag":1981,"props":2254,"children":2255},{"style":2131},[2256],{"type":45,"value":1622},{"type":40,"tag":1981,"props":2258,"children":2259},{"style":2131},[2260],{"type":45,"value":2261}," '",{"type":40,"tag":1981,"props":2263,"children":2264},{"style":2137},[2265],{"type":45,"value":2266},"test-results\u002F",{"type":40,"tag":1981,"props":2268,"children":2269},{"style":2131},[2270],{"type":45,"value":2134},{"type":40,"tag":1981,"props":2272,"children":2273},{"style":2131},[2274],{"type":45,"value":2149},{"type":40,"tag":1981,"props":2276,"children":2277},{"style":2222},[2278],{"type":45,"value":2279}," size",{"type":40,"tag":1981,"props":2281,"children":2282},{"style":2131},[2283],{"type":45,"value":1622},{"type":40,"tag":1981,"props":2285,"children":2286},{"style":2131},[2287],{"type":45,"value":2247},{"type":40,"tag":1981,"props":2289,"children":2290},{"style":2222},[2291],{"type":45,"value":2292}," width",{"type":40,"tag":1981,"props":2294,"children":2295},{"style":2131},[2296],{"type":45,"value":1622},{"type":40,"tag":1981,"props":2298,"children":2300},{"style":2299},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2301],{"type":45,"value":2302}," 1280",{"type":40,"tag":1981,"props":2304,"children":2305},{"style":2131},[2306],{"type":45,"value":2149},{"type":40,"tag":1981,"props":2308,"children":2309},{"style":2222},[2310],{"type":45,"value":2311}," height",{"type":40,"tag":1981,"props":2313,"children":2314},{"style":2131},[2315],{"type":45,"value":1622},{"type":40,"tag":1981,"props":2317,"children":2318},{"style":2299},[2319],{"type":45,"value":2320}," 720",{"type":40,"tag":1981,"props":2322,"children":2323},{"style":2131},[2324],{"type":45,"value":2325}," }",{"type":40,"tag":1981,"props":2327,"children":2328},{"style":2131},[2329],{"type":45,"value":2330}," },\n",{"type":40,"tag":1981,"props":2332,"children":2334},{"class":2114,"line":2333},4,[2335,2340,2344],{"type":40,"tag":1981,"props":2336,"children":2337},{"style":2131},[2338],{"type":45,"value":2339},"  }",{"type":40,"tag":1981,"props":2341,"children":2342},{"style":2222},[2343],{"type":45,"value":593},{"type":40,"tag":1981,"props":2345,"children":2346},{"style":2131},[2347],{"type":45,"value":2348},";\n",{"type":40,"tag":1981,"props":2350,"children":2352},{"class":2114,"line":2351},5,[2353,2357,2362,2366,2370,2374,2378,2383,2388],{"type":40,"tag":1981,"props":2354,"children":2355},{"style":2152},[2356],{"type":45,"value":2190},{"type":40,"tag":1981,"props":2358,"children":2359},{"style":2125},[2360],{"type":45,"value":2361}," page",{"type":40,"tag":1981,"props":2363,"children":2364},{"style":2131},[2365],{"type":45,"value":2200},{"type":40,"tag":1981,"props":2367,"children":2368},{"style":2203},[2369],{"type":45,"value":2206},{"type":40,"tag":1981,"props":2371,"children":2372},{"style":2125},[2373],{"type":45,"value":2195},{"type":40,"tag":1981,"props":2375,"children":2376},{"style":2131},[2377],{"type":45,"value":399},{"type":40,"tag":1981,"props":2379,"children":2380},{"style":2119},[2381],{"type":45,"value":2382},"newPage",{"type":40,"tag":1981,"props":2384,"children":2385},{"style":2222},[2386],{"type":45,"value":2387},"()",{"type":40,"tag":1981,"props":2389,"children":2390},{"style":2131},[2391],{"type":45,"value":2348},{"type":40,"tag":1981,"props":2393,"children":2395},{"class":2114,"line":2394},6,[2396],{"type":40,"tag":1981,"props":2397,"children":2398},{"style":2222},[2399],{"type":45,"value":2400},"  \n",{"type":40,"tag":1981,"props":2402,"children":2404},{"class":2114,"line":2403},7,[2405],{"type":40,"tag":1981,"props":2406,"children":2408},{"style":2407},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[2409],{"type":45,"value":2410},"  \u002F\u002F ... test steps using page ...\n",{"type":40,"tag":1981,"props":2412,"children":2414},{"class":2114,"line":2413},8,[2415],{"type":40,"tag":1981,"props":2416,"children":2417},{"style":2222},[2418],{"type":45,"value":2400},{"type":40,"tag":1981,"props":2420,"children":2422},{"class":2114,"line":2421},9,[2423,2428,2432,2436,2441,2445,2450],{"type":40,"tag":1981,"props":2424,"children":2425},{"style":2203},[2426],{"type":45,"value":2427},"  await",{"type":40,"tag":1981,"props":2429,"children":2430},{"style":2125},[2431],{"type":45,"value":2195},{"type":40,"tag":1981,"props":2433,"children":2434},{"style":2131},[2435],{"type":45,"value":399},{"type":40,"tag":1981,"props":2437,"children":2438},{"style":2119},[2439],{"type":45,"value":2440},"close",{"type":40,"tag":1981,"props":2442,"children":2443},{"style":2222},[2444],{"type":45,"value":2387},{"type":40,"tag":1981,"props":2446,"children":2447},{"style":2131},[2448],{"type":45,"value":2449},";",{"type":40,"tag":1981,"props":2451,"children":2452},{"style":2407},[2453],{"type":45,"value":2454}," \u002F\u002F finalizes the video file\n",{"type":40,"tag":1981,"props":2456,"children":2458},{"class":2114,"line":2457},10,[2459,2464,2468],{"type":40,"tag":1981,"props":2460,"children":2461},{"style":2131},[2462],{"type":45,"value":2463},"}",{"type":40,"tag":1981,"props":2465,"children":2466},{"style":2125},[2467],{"type":45,"value":593},{"type":40,"tag":1981,"props":2469,"children":2470},{"style":2131},[2471],{"type":45,"value":2348},{"type":45,"value":2473},"\nThis guarantees video recording regardless of how the workspace's own e2e infrastructure manages contexts.",{"type":40,"tag":93,"props":2475,"children":2476},{},[2477,2482,2484,2489,2490,2496,2498,2504],{"type":40,"tag":241,"props":2478,"children":2479},{},[2480],{"type":45,"value":2481},"CRITICAL",{"type":45,"value":2483},": Do NOT use workspace-provided bootstrap\u002Fsetup functions (like ",{"type":40,"tag":104,"props":2485,"children":2487},{"className":2486},[],[2488],{"type":45,"value":117},{"type":45,"value":1179},{"type":40,"tag":104,"props":2491,"children":2493},{"className":2492},[],[2494],{"type":45,"value":2495},"setupE2eTest",{"type":45,"value":2497},", etc.) as the browser context source. These helpers create contexts WITHOUT video recording. You MUST call ",{"type":40,"tag":104,"props":2499,"children":2501},{"className":2500},[],[2502],{"type":45,"value":2503},"browser.newContext({ recordVideo: ... })",{"type":45,"value":2505}," yourself and then replicate only the mock setup from those helpers (API mocking, route handlers) on your custom page. Copy the mock calls — not the context creation.",{"type":40,"tag":93,"props":2507,"children":2508},{},[2509],{"type":45,"value":2510},"Encode the \"steps to reproduce\" from the issue description as Playwright actions.",{"type":40,"tag":93,"props":2512,"children":2513},{},[2514,2516,2521],{"type":45,"value":2515},"Assert the ",{"type":40,"tag":241,"props":2517,"children":2518},{},[2519],{"type":45,"value":2520},"expected",{"type":45,"value":2522}," behavior (the assertion should fail when the bug is present).",{"type":40,"tag":93,"props":2524,"children":2525},{},[2526,2531,2533,2538,2539,2545,2547],{"type":40,"tag":241,"props":2527,"children":2528},{},[2529],{"type":45,"value":2530},"Pre-flight: kill stale dev server",{"type":45,"value":2532}," — before running the test, ensure the dev-server port (read from ",{"type":40,"tag":104,"props":2534,"children":2536},{"className":2535},[],[2537],{"type":45,"value":1724},{"type":45,"value":1493},{"type":40,"tag":104,"props":2540,"children":2542},{"className":2541},[],[2543],{"type":45,"value":2544},"webServer.url",{"type":45,"value":2546},") is free:\n",{"type":40,"tag":695,"props":2548,"children":2551},{"className":2549,"code":2550,"language":45},[698],"lsof -ti:\u003CPORT> | xargs kill -9 2>\u002Fdev\u002Fnull || true\n",[2552],{"type":40,"tag":104,"props":2553,"children":2554},{"__ignoreMap":195},[2555],{"type":45,"value":2550},{"type":40,"tag":93,"props":2557,"children":2558},{},[2559,2561,2567,2569,2573,2575,2581,2583],{"type":45,"value":2560},"Run the test against the ",{"type":40,"tag":104,"props":2562,"children":2564},{"className":2563},[],[2565],{"type":45,"value":2566},"en",{"type":45,"value":2568}," locale in legacy mode. ",{"type":40,"tag":241,"props":2570,"children":2571},{},[2572],{"type":45,"value":977},{"type":45,"value":2574}," prefix with ",{"type":40,"tag":104,"props":2576,"children":2578},{"className":2577},[],[2579],{"type":45,"value":2580},"ulimit -n 65536",{"type":45,"value":2582}," and ensure the command runs without sandbox restrictions:\n",{"type":40,"tag":695,"props":2584,"children":2587},{"className":2585,"code":2586,"language":45},[698],"ulimit -n 65536 && APP_MODE=legacy npx playwright test e2e-tests\u002F_repro-\u003CKEY>.test.ts --project=en\n",[2588],{"type":40,"tag":104,"props":2589,"children":2590},{"__ignoreMap":195},[2591],{"type":45,"value":2586},{"type":40,"tag":93,"props":2593,"children":2594},{},[2595,2597,2602],{"type":45,"value":2596},"The test should ",{"type":40,"tag":241,"props":2598,"children":2599},{},[2600],{"type":45,"value":2601},"fail",{"type":45,"value":2603}," — confirming the bug is reproduced.",{"type":40,"tag":41,"props":2605,"children":2606},{},[2607,2612],{"type":40,"tag":241,"props":2608,"children":2609},{},[2610],{"type":45,"value":2611},"If the test passes",{"type":45,"value":2613}," (bug not reproduced): re-read the issue description, adjust the test, and retry. If still not reproducible after 2 attempts, report findings and ask the user for guidance.",{"type":40,"tag":371,"props":2615,"children":2616},{},[],{"type":40,"tag":223,"props":2618,"children":2620},{"id":2619},"step-4-capture-before-recording-full-e2e-only",[2621,2623],{"type":45,"value":2622},"Step 4 — Capture \"before\" recording ",{"type":40,"tag":1981,"props":2624,"children":2625},{},[2626],{"type":45,"value":1985},{"type":40,"tag":158,"props":2628,"children":2629},{},[2630,2657,2671],{"type":40,"tag":93,"props":2631,"children":2632},{},[2633,2635,2640,2642],{"type":45,"value":2634},"After the failed test run (Step 3), locate the video file in ",{"type":40,"tag":104,"props":2636,"children":2638},{"className":2637},[],[2639],{"type":45,"value":2266},{"type":45,"value":2641},".\n",{"type":40,"tag":89,"props":2643,"children":2644},{},[2645],{"type":40,"tag":93,"props":2646,"children":2647},{},[2648,2650,2656],{"type":45,"value":2649},"Playwright saves videos at ",{"type":40,"tag":104,"props":2651,"children":2653},{"className":2652},[],[2654],{"type":45,"value":2655},"test-results\u002F\u003Ctest-title>\u002Fvideo.webm",{"type":45,"value":399},{"type":40,"tag":93,"props":2658,"children":2659},{},[2660,2662],{"type":45,"value":2661},"Copy the video to a stable path:\n",{"type":40,"tag":695,"props":2663,"children":2666},{"className":2664,"code":2665,"language":45},[698],"mkdir -p e2e-tests\u002F_repro-artifacts\ncp test-results\u002F*\u002Fvideo.webm e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.webm\n",[2667],{"type":40,"tag":104,"props":2668,"children":2669},{"__ignoreMap":195},[2670],{"type":45,"value":2665},{"type":40,"tag":93,"props":2672,"children":2673},{},[2674],{"type":45,"value":2675},"Store the path for later conversion (Step 7).",{"type":40,"tag":41,"props":2677,"children":2678},{},[2679,2689,2691,2696,2698,2703],{"type":40,"tag":241,"props":2680,"children":2681},{},[2682,2684],{"type":45,"value":2683},"If no video file is found in ",{"type":40,"tag":104,"props":2685,"children":2687},{"className":2686},[],[2688],{"type":45,"value":2266},{"type":45,"value":2690},": the test likely used a bootstrap helper instead of a custom ",{"type":40,"tag":104,"props":2692,"children":2694},{"className":2693},[],[2695],{"type":45,"value":109},{"type":45,"value":2697}," context. Rewrite the test to use ",{"type":40,"tag":104,"props":2699,"children":2701},{"className":2700},[],[2702],{"type":45,"value":2503},{"type":45,"value":2704}," directly, then re-run.",{"type":40,"tag":371,"props":2706,"children":2707},{},[],{"type":40,"tag":223,"props":2709,"children":2711},{"id":2710},"step-5-diagnose-and-fix",[2712],{"type":45,"value":2713},"Step 5 — Diagnose and fix",{"type":40,"tag":41,"props":2715,"children":2716},{},[2717,2721],{"type":40,"tag":241,"props":2718,"children":2719},{},[2720],{"type":45,"value":1870},{"type":45,"value":2722}," Skip sub-step 1 (browser diagnostics are not available). Start directly from sub-step 2 using source code analysis, error logs\u002Fstack traces from the issue description, and unit test output.",{"type":40,"tag":158,"props":2724,"children":2725},{},[2726,3207,3241,3250],{"type":40,"tag":93,"props":2727,"children":2728},{},[2729,2734,2735,2739,2741,2744,2746,2751,2753,2843,2846,2848,2853,2855,2983,2986,2988,2993,2995,3202,3205],{"type":40,"tag":241,"props":2730,"children":2731},{},[2732],{"type":45,"value":2733},"Capture diagnostic context",{"type":45,"value":1493},{"type":40,"tag":1981,"props":2736,"children":2737},{},[2738],{"type":45,"value":1985},{"type":45,"value":2740}," from the failing state (before applying any fix). Re-use the reproduction test or run a lightweight Playwright script to gather:",{"type":40,"tag":478,"props":2742,"children":2743},{},[],{"type":45,"value":2745},"a. ",{"type":40,"tag":241,"props":2747,"children":2748},{},[2749],{"type":45,"value":2750},"Screenshot",{"type":45,"value":2752}," of the buggy UI state:",{"type":40,"tag":695,"props":2754,"children":2756},{"className":2105,"code":2755,"language":2107,"meta":195,"style":195},"await page.screenshot({ path: 'e2e-tests\u002F_repro-artifacts\u002Fbug-state.png', fullPage: true });\n",[2757],{"type":40,"tag":104,"props":2758,"children":2759},{"__ignoreMap":195},[2760],{"type":40,"tag":1981,"props":2761,"children":2762},{"class":2114,"line":2115},[2763,2768,2772,2776,2781,2785,2790,2795,2799,2803,2808,2812,2816,2821,2825,2831,2835,2839],{"type":40,"tag":1981,"props":2764,"children":2765},{"style":2203},[2766],{"type":45,"value":2767},"await",{"type":40,"tag":1981,"props":2769,"children":2770},{"style":2125},[2771],{"type":45,"value":2361},{"type":40,"tag":1981,"props":2773,"children":2774},{"style":2131},[2775],{"type":45,"value":399},{"type":40,"tag":1981,"props":2777,"children":2778},{"style":2119},[2779],{"type":45,"value":2780},"screenshot",{"type":40,"tag":1981,"props":2782,"children":2783},{"style":2125},[2784],{"type":45,"value":2128},{"type":40,"tag":1981,"props":2786,"children":2787},{"style":2131},[2788],{"type":45,"value":2789},"{",{"type":40,"tag":1981,"props":2791,"children":2792},{"style":2222},[2793],{"type":45,"value":2794}," path",{"type":40,"tag":1981,"props":2796,"children":2797},{"style":2131},[2798],{"type":45,"value":1622},{"type":40,"tag":1981,"props":2800,"children":2801},{"style":2131},[2802],{"type":45,"value":2261},{"type":40,"tag":1981,"props":2804,"children":2805},{"style":2137},[2806],{"type":45,"value":2807},"e2e-tests\u002F_repro-artifacts\u002Fbug-state.png",{"type":40,"tag":1981,"props":2809,"children":2810},{"style":2131},[2811],{"type":45,"value":2134},{"type":40,"tag":1981,"props":2813,"children":2814},{"style":2131},[2815],{"type":45,"value":2149},{"type":40,"tag":1981,"props":2817,"children":2818},{"style":2222},[2819],{"type":45,"value":2820}," fullPage",{"type":40,"tag":1981,"props":2822,"children":2823},{"style":2131},[2824],{"type":45,"value":1622},{"type":40,"tag":1981,"props":2826,"children":2828},{"style":2827},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[2829],{"type":45,"value":2830}," true",{"type":40,"tag":1981,"props":2832,"children":2833},{"style":2131},[2834],{"type":45,"value":2325},{"type":40,"tag":1981,"props":2836,"children":2837},{"style":2125},[2838],{"type":45,"value":593},{"type":40,"tag":1981,"props":2840,"children":2841},{"style":2131},[2842],{"type":45,"value":2348},{"type":40,"tag":478,"props":2844,"children":2845},{},[],{"type":45,"value":2847},"b. ",{"type":40,"tag":241,"props":2849,"children":2850},{},[2851],{"type":45,"value":2852},"DOM snapshot",{"type":45,"value":2854}," of the target element:",{"type":40,"tag":695,"props":2856,"children":2858},{"className":2105,"code":2857,"language":2107,"meta":195,"style":195},"const targetEl = page.locator('\u003Cselector-under-test>');\nconst domSnapshot = await targetEl.evaluate(el => el.outerHTML);\n",[2859],{"type":40,"tag":104,"props":2860,"children":2861},{"__ignoreMap":195},[2862,2918],{"type":40,"tag":1981,"props":2863,"children":2864},{"class":2114,"line":2115},[2865,2870,2875,2880,2884,2888,2893,2897,2901,2906,2910,2914],{"type":40,"tag":1981,"props":2866,"children":2867},{"style":2152},[2868],{"type":45,"value":2869},"const",{"type":40,"tag":1981,"props":2871,"children":2872},{"style":2125},[2873],{"type":45,"value":2874}," targetEl ",{"type":40,"tag":1981,"props":2876,"children":2877},{"style":2131},[2878],{"type":45,"value":2879},"=",{"type":40,"tag":1981,"props":2881,"children":2882},{"style":2125},[2883],{"type":45,"value":2361},{"type":40,"tag":1981,"props":2885,"children":2886},{"style":2131},[2887],{"type":45,"value":399},{"type":40,"tag":1981,"props":2889,"children":2890},{"style":2119},[2891],{"type":45,"value":2892},"locator",{"type":40,"tag":1981,"props":2894,"children":2895},{"style":2125},[2896],{"type":45,"value":2128},{"type":40,"tag":1981,"props":2898,"children":2899},{"style":2131},[2900],{"type":45,"value":2134},{"type":40,"tag":1981,"props":2902,"children":2903},{"style":2137},[2904],{"type":45,"value":2905},"\u003Cselector-under-test>",{"type":40,"tag":1981,"props":2907,"children":2908},{"style":2131},[2909],{"type":45,"value":2134},{"type":40,"tag":1981,"props":2911,"children":2912},{"style":2125},[2913],{"type":45,"value":593},{"type":40,"tag":1981,"props":2915,"children":2916},{"style":2131},[2917],{"type":45,"value":2348},{"type":40,"tag":1981,"props":2919,"children":2920},{"class":2114,"line":2184},[2921,2925,2930,2934,2938,2943,2947,2952,2956,2961,2965,2970,2974,2979],{"type":40,"tag":1981,"props":2922,"children":2923},{"style":2152},[2924],{"type":45,"value":2869},{"type":40,"tag":1981,"props":2926,"children":2927},{"style":2125},[2928],{"type":45,"value":2929}," domSnapshot ",{"type":40,"tag":1981,"props":2931,"children":2932},{"style":2131},[2933],{"type":45,"value":2879},{"type":40,"tag":1981,"props":2935,"children":2936},{"style":2203},[2937],{"type":45,"value":2206},{"type":40,"tag":1981,"props":2939,"children":2940},{"style":2125},[2941],{"type":45,"value":2942}," targetEl",{"type":40,"tag":1981,"props":2944,"children":2945},{"style":2131},[2946],{"type":45,"value":399},{"type":40,"tag":1981,"props":2948,"children":2949},{"style":2119},[2950],{"type":45,"value":2951},"evaluate",{"type":40,"tag":1981,"props":2953,"children":2954},{"style":2125},[2955],{"type":45,"value":2128},{"type":40,"tag":1981,"props":2957,"children":2958},{"style":2163},[2959],{"type":45,"value":2960},"el",{"type":40,"tag":1981,"props":2962,"children":2963},{"style":2152},[2964],{"type":45,"value":2176},{"type":40,"tag":1981,"props":2966,"children":2967},{"style":2125},[2968],{"type":45,"value":2969}," el",{"type":40,"tag":1981,"props":2971,"children":2972},{"style":2131},[2973],{"type":45,"value":399},{"type":40,"tag":1981,"props":2975,"children":2976},{"style":2125},[2977],{"type":45,"value":2978},"outerHTML)",{"type":40,"tag":1981,"props":2980,"children":2981},{"style":2131},[2982],{"type":45,"value":2348},{"type":40,"tag":478,"props":2984,"children":2985},{},[],{"type":45,"value":2987},"c. ",{"type":40,"tag":241,"props":2989,"children":2990},{},[2991],{"type":45,"value":2992},"Computed styles",{"type":45,"value":2994}," of the target element (capture properties relevant to the bug):",{"type":40,"tag":695,"props":2996,"children":2998},{"className":2105,"code":2997,"language":2107,"meta":195,"style":195},"const styles = await targetEl.evaluate(el => {\n  const cs = window.getComputedStyle(el);\n  return { display: cs.display, overflow: cs.overflow, scrollbarWidth: cs.scrollbarWidth };\n});\n",[2999],{"type":40,"tag":104,"props":3000,"children":3001},{"__ignoreMap":195},[3002,3050,3096,3187],{"type":40,"tag":1981,"props":3003,"children":3004},{"class":2114,"line":2115},[3005,3009,3014,3018,3022,3026,3030,3034,3038,3042,3046],{"type":40,"tag":1981,"props":3006,"children":3007},{"style":2152},[3008],{"type":45,"value":2869},{"type":40,"tag":1981,"props":3010,"children":3011},{"style":2125},[3012],{"type":45,"value":3013}," styles ",{"type":40,"tag":1981,"props":3015,"children":3016},{"style":2131},[3017],{"type":45,"value":2879},{"type":40,"tag":1981,"props":3019,"children":3020},{"style":2203},[3021],{"type":45,"value":2206},{"type":40,"tag":1981,"props":3023,"children":3024},{"style":2125},[3025],{"type":45,"value":2942},{"type":40,"tag":1981,"props":3027,"children":3028},{"style":2131},[3029],{"type":45,"value":399},{"type":40,"tag":1981,"props":3031,"children":3032},{"style":2119},[3033],{"type":45,"value":2951},{"type":40,"tag":1981,"props":3035,"children":3036},{"style":2125},[3037],{"type":45,"value":2128},{"type":40,"tag":1981,"props":3039,"children":3040},{"style":2163},[3041],{"type":45,"value":2960},{"type":40,"tag":1981,"props":3043,"children":3044},{"style":2152},[3045],{"type":45,"value":2176},{"type":40,"tag":1981,"props":3047,"children":3048},{"style":2131},[3049],{"type":45,"value":2181},{"type":40,"tag":1981,"props":3051,"children":3052},{"class":2114,"line":2184},[3053,3057,3062,3066,3071,3075,3080,3084,3088,3092],{"type":40,"tag":1981,"props":3054,"children":3055},{"style":2152},[3056],{"type":45,"value":2190},{"type":40,"tag":1981,"props":3058,"children":3059},{"style":2125},[3060],{"type":45,"value":3061}," cs",{"type":40,"tag":1981,"props":3063,"children":3064},{"style":2131},[3065],{"type":45,"value":2200},{"type":40,"tag":1981,"props":3067,"children":3068},{"style":2125},[3069],{"type":45,"value":3070}," window",{"type":40,"tag":1981,"props":3072,"children":3073},{"style":2131},[3074],{"type":45,"value":399},{"type":40,"tag":1981,"props":3076,"children":3077},{"style":2119},[3078],{"type":45,"value":3079},"getComputedStyle",{"type":40,"tag":1981,"props":3081,"children":3082},{"style":2222},[3083],{"type":45,"value":2128},{"type":40,"tag":1981,"props":3085,"children":3086},{"style":2125},[3087],{"type":45,"value":2960},{"type":40,"tag":1981,"props":3089,"children":3090},{"style":2222},[3091],{"type":45,"value":593},{"type":40,"tag":1981,"props":3093,"children":3094},{"style":2131},[3095],{"type":45,"value":2348},{"type":40,"tag":1981,"props":3097,"children":3098},{"class":2114,"line":2232},[3099,3104,3108,3113,3117,3121,3125,3130,3134,3139,3143,3147,3151,3156,3160,3165,3169,3173,3177,3182],{"type":40,"tag":1981,"props":3100,"children":3101},{"style":2203},[3102],{"type":45,"value":3103},"  return",{"type":40,"tag":1981,"props":3105,"children":3106},{"style":2131},[3107],{"type":45,"value":2247},{"type":40,"tag":1981,"props":3109,"children":3110},{"style":2222},[3111],{"type":45,"value":3112}," display",{"type":40,"tag":1981,"props":3114,"children":3115},{"style":2131},[3116],{"type":45,"value":1622},{"type":40,"tag":1981,"props":3118,"children":3119},{"style":2125},[3120],{"type":45,"value":3061},{"type":40,"tag":1981,"props":3122,"children":3123},{"style":2131},[3124],{"type":45,"value":399},{"type":40,"tag":1981,"props":3126,"children":3127},{"style":2125},[3128],{"type":45,"value":3129},"display",{"type":40,"tag":1981,"props":3131,"children":3132},{"style":2131},[3133],{"type":45,"value":2149},{"type":40,"tag":1981,"props":3135,"children":3136},{"style":2222},[3137],{"type":45,"value":3138}," overflow",{"type":40,"tag":1981,"props":3140,"children":3141},{"style":2131},[3142],{"type":45,"value":1622},{"type":40,"tag":1981,"props":3144,"children":3145},{"style":2125},[3146],{"type":45,"value":3061},{"type":40,"tag":1981,"props":3148,"children":3149},{"style":2131},[3150],{"type":45,"value":399},{"type":40,"tag":1981,"props":3152,"children":3153},{"style":2125},[3154],{"type":45,"value":3155},"overflow",{"type":40,"tag":1981,"props":3157,"children":3158},{"style":2131},[3159],{"type":45,"value":2149},{"type":40,"tag":1981,"props":3161,"children":3162},{"style":2222},[3163],{"type":45,"value":3164}," scrollbarWidth",{"type":40,"tag":1981,"props":3166,"children":3167},{"style":2131},[3168],{"type":45,"value":1622},{"type":40,"tag":1981,"props":3170,"children":3171},{"style":2125},[3172],{"type":45,"value":3061},{"type":40,"tag":1981,"props":3174,"children":3175},{"style":2131},[3176],{"type":45,"value":399},{"type":40,"tag":1981,"props":3178,"children":3179},{"style":2125},[3180],{"type":45,"value":3181},"scrollbarWidth",{"type":40,"tag":1981,"props":3183,"children":3184},{"style":2131},[3185],{"type":45,"value":3186}," };\n",{"type":40,"tag":1981,"props":3188,"children":3189},{"class":2114,"line":2333},[3190,3194,3198],{"type":40,"tag":1981,"props":3191,"children":3192},{"style":2131},[3193],{"type":45,"value":2463},{"type":40,"tag":1981,"props":3195,"children":3196},{"style":2125},[3197],{"type":45,"value":593},{"type":40,"tag":1981,"props":3199,"children":3200},{"style":2131},[3201],{"type":45,"value":2348},{"type":40,"tag":478,"props":3203,"children":3204},{},[],{"type":45,"value":3206},"Use the screenshot (read it as an image), DOM structure, and computed styles to identify the exact root cause before modifying any source files. This provides concrete runtime evidence rather than guessing from source alone.",{"type":40,"tag":93,"props":3208,"children":3209},{},[3210,3215,3217],{"type":40,"tag":241,"props":3211,"children":3212},{},[3213],{"type":45,"value":3214},"Diagnose",{"type":45,"value":3216},": trace from the failing Playwright selector back to the source:",{"type":40,"tag":89,"props":3218,"children":3219},{},[3220,3225,3236],{"type":40,"tag":93,"props":3221,"children":3222},{},[3223],{"type":45,"value":3224},"Identify which React component renders the UI element under test.",{"type":40,"tag":93,"props":3226,"children":3227},{},[3228,3230,3235],{"type":45,"value":3229},"Read the component source code (",{"type":40,"tag":104,"props":3231,"children":3233},{"className":3232},[],[3234],{"type":45,"value":1769},{"type":45,"value":1469},{"type":40,"tag":93,"props":3237,"children":3238},{},[3239],{"type":45,"value":3240},"Cross-reference the captured DOM\u002Fstyles with the component's render logic to pinpoint the root cause (e.g., MUI prop misconfiguration, missing state update, CSS issue, accessibility gap, i18n key mismatch).",{"type":40,"tag":93,"props":3242,"children":3243},{},[3244,3248],{"type":40,"tag":241,"props":3245,"children":3246},{},[3247],{"type":45,"value":1929},{"type":45,"value":3249}," in the source code.",{"type":40,"tag":93,"props":3251,"children":3252},{},[3253,3258,3259],{"type":40,"tag":241,"props":3254,"children":3255},{},[3256],{"type":45,"value":3257},"Validate",{"type":45,"value":1622},{"type":40,"tag":89,"props":3260,"children":3261},{},[3262,3272],{"type":40,"tag":93,"props":3263,"children":3264},{},[3265,3270],{"type":40,"tag":104,"props":3266,"children":3268},{"className":3267},[],[3269],{"type":45,"value":1947},{"type":45,"value":3271}," — type check passes.",{"type":40,"tag":93,"props":3273,"children":3274},{},[3275,3280],{"type":40,"tag":104,"props":3276,"children":3278},{"className":3277},[],[3279],{"type":45,"value":1891},{"type":45,"value":3281}," — unit tests pass.",{"type":40,"tag":41,"props":3283,"children":3284},{},[3285,3290],{"type":40,"tag":241,"props":3286,"children":3287},{},[3288],{"type":45,"value":3289},"Confidence gates",{"type":45,"value":3291}," — ask the user before proceeding if:",{"type":40,"tag":89,"props":3293,"children":3294},{},[3295,3300,3305],{"type":40,"tag":93,"props":3296,"children":3297},{},[3298],{"type":45,"value":3299},"Multiple possible root causes exist — present options and let the user choose.",{"type":40,"tag":93,"props":3301,"children":3302},{},[3303],{"type":45,"value":3304},"The fix touches more than 3 files — show the plan and get approval.",{"type":40,"tag":93,"props":3306,"children":3307},{},[3308],{"type":45,"value":3309},"The fix changes API surface or public types — this may need a minor version bump.",{"type":40,"tag":371,"props":3311,"children":3312},{},[],{"type":40,"tag":223,"props":3314,"children":3316},{"id":3315},"step-6-capture-after-recording-full-e2e-only",[3317,3319],{"type":45,"value":3318},"Step 6 — Capture \"after\" recording ",{"type":40,"tag":1981,"props":3320,"children":3321},{},[3322],{"type":45,"value":1985},{"type":40,"tag":158,"props":3324,"children":3325},{},[3326,3347,3358,3372],{"type":40,"tag":93,"props":3327,"children":3328},{},[3329,3331,3337,3339],{"type":45,"value":3330},"Re-run the reproduction test (with ",{"type":40,"tag":104,"props":3332,"children":3334},{"className":3333},[],[3335],{"type":45,"value":3336},"ulimit",{"type":45,"value":3338}," and without sandbox restrictions):\n",{"type":40,"tag":695,"props":3340,"children":3342},{"className":3341,"code":2586,"language":45},[698],[3343],{"type":40,"tag":104,"props":3344,"children":3345},{"__ignoreMap":195},[3346],{"type":45,"value":2586},{"type":40,"tag":93,"props":3348,"children":3349},{},[3350,3351,3356],{"type":45,"value":2596},{"type":40,"tag":241,"props":3352,"children":3353},{},[3354],{"type":45,"value":3355},"pass",{"type":45,"value":3357}," — confirming the fix works.",{"type":40,"tag":93,"props":3359,"children":3360},{},[3361,3363],{"type":45,"value":3362},"Copy the video:\n",{"type":40,"tag":695,"props":3364,"children":3367},{"className":3365,"code":3366,"language":45},[698],"cp test-results\u002F*\u002Fvideo.webm e2e-tests\u002F_repro-artifacts\u002Fafter-fix.webm\n",[3368],{"type":40,"tag":104,"props":3369,"children":3370},{"__ignoreMap":195},[3371],{"type":45,"value":3366},{"type":40,"tag":93,"props":3373,"children":3374},{},[3375,3377],{"type":45,"value":3376},"Optionally run in NFS mode as well to check for mode-specific regressions:\n",{"type":40,"tag":695,"props":3378,"children":3381},{"className":3379,"code":3380,"language":45},[698],"APP_MODE=nfs npx playwright test e2e-tests\u002F_repro-\u003CKEY>.test.ts --project=en\n",[3382],{"type":40,"tag":104,"props":3383,"children":3384},{"__ignoreMap":195},[3385],{"type":45,"value":3380},{"type":40,"tag":41,"props":3387,"children":3388},{},[3389,3394],{"type":40,"tag":241,"props":3390,"children":3391},{},[3392],{"type":45,"value":3393},"If the test still fails after the fix",{"type":45,"value":3395},": re-examine the diagnosis and iterate.",{"type":40,"tag":371,"props":3397,"children":3398},{},[],{"type":40,"tag":223,"props":3400,"children":3402},{"id":3401},"step-7-convert-videos-for-pr-embedding-full-e2e-only",[3403,3405],{"type":45,"value":3404},"Step 7 — Convert videos for PR embedding ",{"type":40,"tag":1981,"props":3406,"children":3407},{},[3408],{"type":45,"value":1985},{"type":40,"tag":41,"props":3410,"children":3411},{},[3412,3413,3418],{"type":45,"value":1113},{"type":40,"tag":104,"props":3414,"children":3416},{"className":3415},[],[3417],{"type":45,"value":2002},{"type":45,"value":3419}," for conversion details.",{"type":40,"tag":158,"props":3421,"children":3422},{},[3423,3435,3468],{"type":40,"tag":93,"props":3424,"children":3425},{},[3426,3428,3433],{"type":45,"value":3427},"Check if ",{"type":40,"tag":104,"props":3429,"children":3431},{"className":3430},[],[3432],{"type":45,"value":359},{"type":45,"value":3434}," is available on PATH.",{"type":40,"tag":93,"props":3436,"children":3437},{},[3438,3443,3445,3450,3452,3458,3459],{"type":40,"tag":241,"props":3439,"children":3440},{},[3441],{"type":45,"value":3442},"If available",{"type":45,"value":3444},": convert ",{"type":40,"tag":104,"props":3446,"children":3448},{"className":3447},[],[3449],{"type":45,"value":367},{"type":45,"value":3451}," to ",{"type":40,"tag":104,"props":3453,"children":3455},{"className":3454},[],[3456],{"type":45,"value":3457},".gif",{"type":45,"value":1711},{"type":40,"tag":695,"props":3460,"children":3463},{"className":3461,"code":3462,"language":45},[698],"ffmpeg -i e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.webm -vf \"fps=10,scale=800:-1\" -loop 0 e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.gif\nffmpeg -i e2e-tests\u002F_repro-artifacts\u002Fafter-fix.webm -vf \"fps=10,scale=800:-1\" -loop 0 e2e-tests\u002F_repro-artifacts\u002Fafter-fix.gif\n",[3464],{"type":40,"tag":104,"props":3465,"children":3466},{"__ignoreMap":195},[3467],{"type":45,"value":3462},{"type":40,"tag":93,"props":3469,"children":3470},{},[3471,3482,3484,3489],{"type":40,"tag":241,"props":3472,"children":3473},{},[3474,3475,3480],{"type":45,"value":1097},{"type":40,"tag":104,"props":3476,"children":3478},{"className":3477},[],[3479],{"type":45,"value":359},{"type":45,"value":3481}," is not available",{"type":45,"value":3483},": keep the ",{"type":40,"tag":104,"props":3485,"children":3487},{"className":3486},[],[3488],{"type":45,"value":367},{"type":45,"value":3490}," files and note that they will be uploaded as PR comment attachments instead of inline GIFs.",{"type":40,"tag":371,"props":3492,"children":3493},{},[],{"type":40,"tag":223,"props":3495,"children":3497},{"id":3496},"step-8-clean-up-and-create-pr",[3498],{"type":45,"value":3499},"Step 8 — Clean up and create PR",{"type":40,"tag":706,"props":3501,"children":3503},{"id":3502},"_80-validate-recordings-exist-hard-gate-full-e2e-only",[3504,3506],{"type":45,"value":3505},"8.0 — Validate recordings exist ",{"type":40,"tag":1981,"props":3507,"children":3508},{},[3509],{"type":45,"value":3510},"HARD GATE — full-e2e only",{"type":40,"tag":41,"props":3512,"children":3513},{},[3514,3518],{"type":40,"tag":241,"props":3515,"children":3516},{},[3517],{"type":45,"value":1870},{"type":45,"value":3519}," Skip this sub-step entirely — there are no recordings to validate.",{"type":40,"tag":41,"props":3521,"children":3522},{},[3523,3527],{"type":40,"tag":241,"props":3524,"children":3525},{},[3526],{"type":45,"value":1860},{"type":45,"value":3528}," Before proceeding with cleanup or PR creation, verify both recording files exist:",{"type":40,"tag":695,"props":3530,"children":3533},{"className":3531,"code":3532,"language":45},[698],"test -f e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.webm || { echo \"ERROR: before-fix.webm missing — go back to Step 4\"; exit 1; }\ntest -f e2e-tests\u002F_repro-artifacts\u002Fafter-fix.webm || { echo \"ERROR: after-fix.webm missing — go back to Step 6\"; exit 1; }\n",[3534],{"type":40,"tag":104,"props":3535,"children":3536},{"__ignoreMap":195},[3537],{"type":45,"value":3532},{"type":40,"tag":41,"props":3539,"children":3540},{},[3541],{"type":45,"value":3542},"If either file is missing, DO NOT proceed. Return to the relevant step (4 or 6) and capture the recording. This gate ensures the PR will always have visual evidence.",{"type":40,"tag":706,"props":3544,"children":3546},{"id":3545},"_81-delete-temporary-files",[3547],{"type":45,"value":3548},"8.1 — Delete temporary files",{"type":40,"tag":41,"props":3550,"children":3551},{},[3552],{"type":45,"value":3553},"Remove the reproduction test and artifacts — these must not appear in the PR:",{"type":40,"tag":41,"props":3555,"children":3556},{},[3557],{"type":40,"tag":241,"props":3558,"children":3559},{},[3560],{"type":45,"value":1860},{"type":40,"tag":695,"props":3562,"children":3565},{"className":3563,"code":3564,"language":45},[698],"rm e2e-tests\u002F_repro-\u003CKEY>.test.ts\nrm -rf test-results\u002F\n",[3566],{"type":40,"tag":104,"props":3567,"children":3568},{"__ignoreMap":195},[3569],{"type":45,"value":3564},{"type":40,"tag":41,"props":3571,"children":3572},{},[3573,3575,3580],{"type":45,"value":3574},"Keep ",{"type":40,"tag":104,"props":3576,"children":3578},{"className":3577},[],[3579],{"type":45,"value":130},{"type":45,"value":3581}," temporarily (needed for PR image upload).",{"type":40,"tag":41,"props":3583,"children":3584},{},[3585],{"type":40,"tag":241,"props":3586,"children":3587},{},[3588],{"type":45,"value":1870},{"type":40,"tag":695,"props":3590,"children":3593},{"className":3591,"code":3592,"language":45},[698],"rm _repro-\u003CKEY>.test.ts    # if a temporary repro unit test was written\nrm -rf test-results\u002F\n",[3594],{"type":40,"tag":104,"props":3595,"children":3596},{"__ignoreMap":195},[3597],{"type":45,"value":3592},{"type":40,"tag":706,"props":3599,"children":3601},{"id":3600},"_82-stage-fix-files",[3602],{"type":45,"value":3603},"8.2 — Stage fix files",{"type":40,"tag":41,"props":3605,"children":3606},{},[3607],{"type":45,"value":3608},"Stage only the code fix (not the repro test or artifacts):",{"type":40,"tag":695,"props":3610,"children":3613},{"className":3611,"code":3612,"language":45},[698],"git add \u003Cfixed-source-files>\n",[3614],{"type":40,"tag":104,"props":3615,"children":3616},{"__ignoreMap":195},[3617],{"type":45,"value":3612},{"type":40,"tag":706,"props":3619,"children":3621},{"id":3620},"_83-prepare-caller-context",[3622],{"type":45,"value":3623},"8.3 — Prepare caller context",{"type":40,"tag":41,"props":3625,"children":3626},{},[3627,3629,3634,3636,3641],{"type":45,"value":3628},"Assemble the caller context that will be passed to ",{"type":40,"tag":104,"props":3630,"children":3632},{"className":3631},[],[3633],{"type":45,"value":446},{"type":45,"value":3635},". This is prepared regardless of verify mode. Include only the fields relevant to the ",{"type":40,"tag":104,"props":3637,"children":3639},{"className":3638},[],[3640],{"type":45,"value":604},{"type":45,"value":399},{"type":40,"tag":713,"props":3643,"children":3644},{},[3645,3665],{"type":40,"tag":717,"props":3646,"children":3647},{},[3648],{"type":40,"tag":721,"props":3649,"children":3650},{},[3651,3656,3661],{"type":40,"tag":725,"props":3652,"children":3653},{},[3654],{"type":45,"value":3655},"Field",{"type":40,"tag":725,"props":3657,"children":3658},{},[3659],{"type":45,"value":3660},"Value",{"type":40,"tag":725,"props":3662,"children":3663},{},[3664],{"type":45,"value":875},{"type":40,"tag":741,"props":3666,"children":3667},{},[3668,3697,3718,3742,3762,3783,3803,3836,3856,3890,3915],{"type":40,"tag":721,"props":3669,"children":3670},{},[3671,3679,3693],{"type":40,"tag":748,"props":3672,"children":3673},{},[3674],{"type":40,"tag":104,"props":3675,"children":3677},{"className":3676},[],[3678],{"type":45,"value":604},{"type":40,"tag":748,"props":3680,"children":3681},{},[3682,3687,3688],{"type":40,"tag":104,"props":3683,"children":3685},{"className":3684},[],[3686],{"type":45,"value":612},{"type":45,"value":333},{"type":40,"tag":104,"props":3689,"children":3691},{"className":3690},[],[3692],{"type":45,"value":619},{"type":40,"tag":748,"props":3694,"children":3695},{},[3696],{"type":45,"value":977},{"type":40,"tag":721,"props":3698,"children":3699},{},[3700,3708,3713],{"type":40,"tag":748,"props":3701,"children":3702},{},[3703],{"type":40,"tag":104,"props":3704,"children":3706},{"className":3705},[],[3707],{"type":45,"value":655},{"type":40,"tag":748,"props":3709,"children":3710},{},[3711],{"type":45,"value":3712},"The resolved Jira key from Step 1",{"type":40,"tag":748,"props":3714,"children":3715},{},[3716],{"type":45,"value":3717},"Jira only",{"type":40,"tag":721,"props":3719,"children":3720},{},[3721,3729,3738],{"type":40,"tag":748,"props":3722,"children":3723},{},[3724],{"type":40,"tag":104,"props":3725,"children":3727},{"className":3726},[],[3728],{"type":45,"value":1185},{"type":40,"tag":748,"props":3730,"children":3731},{},[3732],{"type":40,"tag":104,"props":3733,"children":3735},{"className":3734},[],[3736],{"type":45,"value":3737},"https:\u002F\u002Fredhat.atlassian.net\u002Fbrowse\u002F\u003Cjira_key>",{"type":40,"tag":748,"props":3739,"children":3740},{},[3741],{"type":45,"value":3717},{"type":40,"tag":721,"props":3743,"children":3744},{},[3745,3753,3758],{"type":40,"tag":748,"props":3746,"children":3747},{},[3748],{"type":40,"tag":104,"props":3749,"children":3751},{"className":3750},[],[3752],{"type":45,"value":1192},{"type":40,"tag":748,"props":3754,"children":3755},{},[3756],{"type":45,"value":3757},"Issue summary from Step 1",{"type":40,"tag":748,"props":3759,"children":3760},{},[3761],{"type":45,"value":3717},{"type":40,"tag":721,"props":3763,"children":3764},{},[3765,3773,3778],{"type":40,"tag":748,"props":3766,"children":3767},{},[3768],{"type":40,"tag":104,"props":3769,"children":3771},{"className":3770},[],[3772],{"type":45,"value":642},{"type":40,"tag":748,"props":3774,"children":3775},{},[3776],{"type":45,"value":3777},"Issue number from Step 0",{"type":40,"tag":748,"props":3779,"children":3780},{},[3781],{"type":45,"value":3782},"GitHub only",{"type":40,"tag":721,"props":3784,"children":3785},{},[3786,3794,3799],{"type":40,"tag":748,"props":3787,"children":3788},{},[3789],{"type":40,"tag":104,"props":3790,"children":3792},{"className":3791},[],[3793],{"type":45,"value":1280},{"type":40,"tag":748,"props":3795,"children":3796},{},[3797],{"type":45,"value":3798},"Full GitHub issue URL",{"type":40,"tag":748,"props":3800,"children":3801},{},[3802],{"type":45,"value":3782},{"type":40,"tag":721,"props":3804,"children":3805},{},[3806,3814,3832],{"type":40,"tag":748,"props":3807,"children":3808},{},[3809],{"type":40,"tag":104,"props":3810,"children":3812},{"className":3811},[],[3813],{"type":45,"value":634},{"type":40,"tag":748,"props":3815,"children":3816},{},[3817,3823,3825,3831],{"type":40,"tag":104,"props":3818,"children":3820},{"className":3819},[],[3821],{"type":45,"value":3822},"owner\u002Frepo",{"type":45,"value":3824}," (e.g., ",{"type":40,"tag":104,"props":3826,"children":3828},{"className":3827},[],[3829],{"type":45,"value":3830},"redhat-developer\u002Frhdh-plugins",{"type":45,"value":593},{"type":40,"tag":748,"props":3833,"children":3834},{},[3835],{"type":45,"value":3782},{"type":40,"tag":721,"props":3837,"children":3838},{},[3839,3847,3852],{"type":40,"tag":748,"props":3840,"children":3841},{},[3842],{"type":40,"tag":104,"props":3843,"children":3845},{"className":3844},[],[3846],{"type":45,"value":1293},{"type":40,"tag":748,"props":3848,"children":3849},{},[3850],{"type":45,"value":3851},"Issue title from Step 1",{"type":40,"tag":748,"props":3853,"children":3854},{},[3855],{"type":45,"value":3782},{"type":40,"tag":721,"props":3857,"children":3858},{},[3859,3868,3877],{"type":40,"tag":748,"props":3860,"children":3861},{},[3862],{"type":40,"tag":104,"props":3863,"children":3865},{"className":3864},[],[3866],{"type":45,"value":3867},"recordings",{"type":40,"tag":748,"props":3869,"children":3870},{},[3871],{"type":40,"tag":104,"props":3872,"children":3874},{"className":3873},[],[3875],{"type":45,"value":3876},"{ before: \"e2e-tests\u002F_repro-artifacts\u002Fbefore-fix.gif\", after: \"e2e-tests\u002F_repro-artifacts\u002Fafter-fix.gif\" }",{"type":40,"tag":748,"props":3878,"children":3879},{},[3880,3882,3888],{"type":45,"value":3881},"full-e2e only; ",{"type":40,"tag":104,"props":3883,"children":3885},{"className":3884},[],[3886],{"type":45,"value":3887},"null",{"type":45,"value":3889}," in no-e2e mode",{"type":40,"tag":721,"props":3891,"children":3892},{},[3893,3902,3911],{"type":40,"tag":748,"props":3894,"children":3895},{},[3896],{"type":40,"tag":104,"props":3897,"children":3899},{"className":3898},[],[3900],{"type":45,"value":3901},"pr_description_extra",{"type":40,"tag":748,"props":3903,"children":3904},{},[3905],{"type":40,"tag":104,"props":3906,"children":3908},{"className":3907},[],[3909],{"type":45,"value":3910},"### Root cause\\n\u003Cdiagnosis from Step 5>",{"type":40,"tag":748,"props":3912,"children":3913},{},[3914],{"type":45,"value":977},{"type":40,"tag":721,"props":3916,"children":3917},{},[3918,3927,3932],{"type":40,"tag":748,"props":3919,"children":3920},{},[3921],{"type":40,"tag":104,"props":3922,"children":3924},{"className":3923},[],[3925],{"type":45,"value":3926},"test_plan",{"type":40,"tag":748,"props":3928,"children":3929},{},[3930],{"type":45,"value":3931},"Auto-generated markdown checklist (see below)",{"type":40,"tag":748,"props":3933,"children":3934},{},[3935],{"type":45,"value":977},{"type":40,"tag":41,"props":3937,"children":3938},{},[3939],{"type":40,"tag":241,"props":3940,"children":3941},{},[3942,3944,3949],{"type":45,"value":3943},"Generating the ",{"type":40,"tag":104,"props":3945,"children":3947},{"className":3946},[],[3948],{"type":45,"value":3926},{"type":45,"value":1622},{"type":40,"tag":41,"props":3951,"children":3952},{},[3953],{"type":45,"value":3954},"Build a markdown checklist of verification steps for the reviewer. Derive them from:",{"type":40,"tag":158,"props":3956,"children":3957},{},[3958,3973,3988],{"type":40,"tag":93,"props":3959,"children":3960},{},[3961,3966,3968,3971],{"type":40,"tag":241,"props":3962,"children":3963},{},[3964],{"type":45,"value":3965},"Steps-to-reproduce",{"type":45,"value":3967}," — convert each step into a positive verification action (e.g., \"Click Help menu\" becomes \"- ",{"type":40,"tag":1981,"props":3969,"children":3970},{},[],{"type":45,"value":3972}," Open the Help menu\").",{"type":40,"tag":93,"props":3974,"children":3975},{},[3976,3981,3983,3986],{"type":40,"tag":241,"props":3977,"children":3978},{},[3979],{"type":45,"value":3980},"Expected behavior after fix",{"type":45,"value":3982}," — add steps verifying the fix works (e.g., \"- ",{"type":40,"tag":1981,"props":3984,"children":3985},{},[],{"type":45,"value":3987}," Verify scrollbar appears on hover\").",{"type":40,"tag":93,"props":3989,"children":3990},{},[3991,3996,3998,4001],{"type":40,"tag":241,"props":3992,"children":3993},{},[3994],{"type":45,"value":3995},"Regression check",{"type":45,"value":3997}," — add at least one step confirming nothing else broke (e.g., \"- ",{"type":40,"tag":1981,"props":3999,"children":4000},{},[],{"type":45,"value":4002}," Verify other menus\u002Fdisplay modes are unchanged\").",{"type":40,"tag":41,"props":4004,"children":4005},{},[4006],{"type":45,"value":4007},"Example output:",{"type":40,"tag":695,"props":4009,"children":4012},{"className":4010,"code":4011,"language":45},[698],"- [ ] Open the dropdown menu with many items\n- [ ] Verify scrollbar is hidden by default\n- [ ] Hover over the menu content area\n- [ ] Verify scrollbar becomes visible on hover\n- [ ] Verify other dropdown menus are unaffected\n",[4013],{"type":40,"tag":104,"props":4014,"children":4015},{"__ignoreMap":195},[4016],{"type":45,"value":4011},{"type":40,"tag":706,"props":4018,"children":4020},{"id":4019},"_84-verification-gate-mode-dependent",[4021,4023],{"type":45,"value":4022},"8.4 — Verification gate ",{"type":40,"tag":1981,"props":4024,"children":4025},{},[4026],{"type":45,"value":4027},"MODE-DEPENDENT",{"type":40,"tag":41,"props":4029,"children":4030},{},[4031,4041,4043,4048],{"type":40,"tag":241,"props":4032,"children":4033},{},[4034,4035,4040],{"type":45,"value":1097},{"type":40,"tag":104,"props":4036,"children":4038},{"className":4037},[],[4039],{"type":45,"value":385},{"type":45,"value":1622},{"type":45,"value":4042}," Chain into ",{"type":40,"tag":104,"props":4044,"children":4046},{"className":4045},[],[4047],{"type":45,"value":423},{"type":45,"value":4049}," immediately with the caller context from Step 8.3. Skip to Step 8.5 after PR creation.",{"type":40,"tag":41,"props":4051,"children":4052},{},[4053,4058,4060,4066,4068,4074,4075,4081,4083,4088],{"type":40,"tag":104,"props":4054,"children":4056},{"className":4055},[],[4057],{"type":45,"value":446},{"type":45,"value":4059}," handles: repo detection, build, changeset, commit (with ",{"type":40,"tag":104,"props":4061,"children":4063},{"className":4062},[],[4064],{"type":45,"value":4065},"Fixes:",{"type":45,"value":4067}," trailer), push, PR creation (with ",{"type":40,"tag":104,"props":4069,"children":4071},{"className":4070},[],[4072],{"type":45,"value":4073},"## UI before\u002Fafter changes",{"type":45,"value":636},{"type":40,"tag":104,"props":4076,"children":4078},{"className":4077},[],[4079],{"type":45,"value":4080},"## Test Plan",{"type":45,"value":4082},"), and post-PR updates (Jira comment\u002Ftransition or GitHub issue comment\u002Flabel depending on ",{"type":40,"tag":104,"props":4084,"children":4086},{"className":4085},[],[4087],{"type":45,"value":604},{"type":45,"value":1469},{"type":40,"tag":4090,"props":4091,"children":4092},"blockquote",{},[4093],{"type":40,"tag":41,"props":4094,"children":4095},{},[4096,4101,4103,4109],{"type":40,"tag":104,"props":4097,"children":4099},{"className":4098},[],[4100],{"type":45,"value":446},{"type":45,"value":4102}," uploads the GIF files to the branch via GitHub Contents API and embeds the resulting ",{"type":40,"tag":104,"props":4104,"children":4106},{"className":4105},[],[4107],{"type":45,"value":4108},"raw.githubusercontent.com",{"type":45,"value":4110}," URLs directly in the PR description. No manual image upload or separate PR comment is needed.",{"type":40,"tag":41,"props":4112,"children":4113},{},[4114,4119],{"type":40,"tag":241,"props":4115,"children":4116},{},[4117],{"type":45,"value":4118},"If default (no flag):",{"type":45,"value":4120}," STOP and present a verification summary to the user:",{"type":40,"tag":158,"props":4122,"children":4123},{},[4124,4134,4144,4154,4164],{"type":40,"tag":93,"props":4125,"children":4126},{},[4127,4132],{"type":40,"tag":241,"props":4128,"children":4129},{},[4130],{"type":45,"value":4131},"Modified files",{"type":45,"value":4133}," — list all source files changed by the fix.",{"type":40,"tag":93,"props":4135,"children":4136},{},[4137,4142],{"type":40,"tag":241,"props":4138,"children":4139},{},[4140],{"type":45,"value":4141},"Root cause",{"type":45,"value":4143}," — the diagnosis from Step 5.",{"type":40,"tag":93,"props":4145,"children":4146},{},[4147,4152],{"type":40,"tag":241,"props":4148,"children":4149},{},[4150],{"type":45,"value":4151},"Recordings",{"type":45,"value":4153}," — paths to before\u002Fafter GIF files.",{"type":40,"tag":93,"props":4155,"children":4156},{},[4157,4162],{"type":40,"tag":241,"props":4158,"children":4159},{},[4160],{"type":45,"value":4161},"Caller context",{"type":45,"value":4163}," — print the assembled caller context table (from Step 8.3) so the user can confirm everything is ready.",{"type":40,"tag":93,"props":4165,"children":4166},{},[4167,4172],{"type":40,"tag":241,"props":4168,"children":4169},{},[4170],{"type":45,"value":4171},"Next steps",{"type":45,"value":4173}," — instruct the user:",{"type":40,"tag":695,"props":4175,"children":4178},{"className":4176,"code":4177,"language":45},[698],"Fix complete. Verify the changes locally, then create the PR:\n  raise-pr              — interactive mode (approval gates at branch, staging, commit)\n  raise-pr --a          — auto-approve mode (skip all gates)\n",[4179],{"type":40,"tag":104,"props":4180,"children":4181},{"__ignoreMap":195},[4182],{"type":45,"value":4177},{"type":40,"tag":41,"props":4184,"children":4185},{},[4186,4188,4193,4194,4199,4201,4206],{"type":45,"value":4187},"The agent retains the caller context in the conversation. When the user invokes ",{"type":40,"tag":104,"props":4189,"children":4191},{"className":4190},[],[4192],{"type":45,"value":446},{"type":45,"value":333},{"type":40,"tag":104,"props":4195,"children":4197},{"className":4196},[],[4198],{"type":45,"value":423},{"type":45,"value":4200},", pass the full caller context from Step 8.3 so that ",{"type":40,"tag":104,"props":4202,"children":4204},{"className":4203},[],[4205],{"type":45,"value":446},{"type":45,"value":4207}," includes the Jira link, recordings, root cause, and test plan in the PR.",{"type":40,"tag":706,"props":4209,"children":4211},{"id":4210},"_85-final-cleanup",[4212],{"type":45,"value":4213},"8.5 — Final cleanup",{"type":40,"tag":41,"props":4215,"children":4216},{},[4217],{"type":45,"value":4218},"After the PR is created, delete the artifacts directory:",{"type":40,"tag":695,"props":4220,"children":4223},{"className":4221,"code":4222,"language":45},[698],"rm -rf e2e-tests\u002F_repro-artifacts\u002F\n",[4224],{"type":40,"tag":104,"props":4225,"children":4226},{"__ignoreMap":195},[4227],{"type":45,"value":4222},{"type":40,"tag":371,"props":4229,"children":4230},{},[],{"type":40,"tag":223,"props":4232,"children":4234},{"id":4233},"when-not-to-use",[4235],{"type":45,"value":4236},"When NOT to Use",{"type":40,"tag":89,"props":4238,"children":4239},{},[4240,4250,4267],{"type":40,"tag":93,"props":4241,"children":4242},{},[4243,4248],{"type":40,"tag":241,"props":4244,"children":4245},{},[4246],{"type":45,"value":4247},"Bugs requiring live backend data",{"type":45,"value":4249}," — if reproduction depends on real API responses that cannot be mocked via the workspace's e2e test infrastructure.",{"type":40,"tag":93,"props":4251,"children":4252},{},[4253,4258,4260,4265],{"type":40,"tag":241,"props":4254,"children":4255},{},[4256],{"type":45,"value":4257},"Cross-workspace bugs",{"type":45,"value":4259}," — if the fix requires changes across multiple workspaces, handle each workspace separately or use ",{"type":40,"tag":104,"props":4261,"children":4263},{"className":4262},[],[4264],{"type":45,"value":446},{"type":45,"value":4266}," directly.",{"type":40,"tag":93,"props":4268,"children":4269},{},[4270,4275],{"type":40,"tag":241,"props":4271,"children":4272},{},[4273],{"type":45,"value":4274},"Unsupported issue trackers",{"type":45,"value":4276}," — this skill supports Jira (RHIDP, RHDHBUGS, RHDHPLAN, RHDHSUPP projects) and GitHub issues (rhdh-plugins, community-plugins). Other trackers or repos are not supported.",{"type":40,"tag":41,"props":4278,"children":4279},{},[4280],{"type":45,"value":4281},"\u003Creference_index>",{"type":40,"tag":223,"props":4283,"children":4285},{"id":4284},"reference-index",[4286],{"type":45,"value":4287},"Reference Index",{"type":40,"tag":713,"props":4289,"children":4290},{},[4291,4307],{"type":40,"tag":717,"props":4292,"children":4293},{},[4294],{"type":40,"tag":721,"props":4295,"children":4296},{},[4297,4302],{"type":40,"tag":725,"props":4298,"children":4299},{},[4300],{"type":45,"value":4301},"Reference",{"type":40,"tag":725,"props":4303,"children":4304},{},[4305],{"type":45,"value":4306},"Load when...",{"type":40,"tag":741,"props":4308,"children":4309},{},[4310,4326,4355,4371,4387,4415],{"type":40,"tag":721,"props":4311,"children":4312},{},[4313,4321],{"type":40,"tag":748,"props":4314,"children":4315},{},[4316],{"type":40,"tag":104,"props":4317,"children":4319},{"className":4318},[],[4320],{"type":45,"value":1119},{"type":40,"tag":748,"props":4322,"children":4323},{},[4324],{"type":45,"value":4325},"Always — at the start of every invocation (Steps 0-2)",{"type":40,"tag":721,"props":4327,"children":4328},{},[4329,4337],{"type":40,"tag":748,"props":4330,"children":4331},{},[4332],{"type":40,"tag":104,"props":4333,"children":4335},{"className":4334},[],[4336],{"type":45,"value":546},{"type":40,"tag":748,"props":4338,"children":4339},{},[4340,4342,4347,4348,4353],{"type":45,"value":4341},"When ",{"type":40,"tag":104,"props":4343,"children":4345},{"className":4344},[],[4346],{"type":45,"value":604},{"type":45,"value":606},{"type":40,"tag":104,"props":4349,"children":4351},{"className":4350},[],[4352],{"type":45,"value":619},{"type":45,"value":4354}," (Steps 0, 1)",{"type":40,"tag":721,"props":4356,"children":4357},{},[4358,4366],{"type":40,"tag":748,"props":4359,"children":4360},{},[4361],{"type":40,"tag":104,"props":4362,"children":4364},{"className":4363},[],[4365],{"type":45,"value":1802},{"type":40,"tag":748,"props":4367,"children":4368},{},[4369],{"type":45,"value":4370},"When writing the reproduction test — full-e2e mode only (Step 3)",{"type":40,"tag":721,"props":4372,"children":4373},{},[4374,4382],{"type":40,"tag":748,"props":4375,"children":4376},{},[4377],{"type":40,"tag":104,"props":4378,"children":4380},{"className":4379},[],[4381],{"type":45,"value":2002},{"type":40,"tag":748,"props":4383,"children":4384},{},[4385],{"type":45,"value":4386},"When configuring video capture — full-e2e mode only (Steps 3, 7)",{"type":40,"tag":721,"props":4388,"children":4389},{},[4390,4398],{"type":40,"tag":748,"props":4391,"children":4392},{},[4393],{"type":40,"tag":104,"props":4394,"children":4396},{"className":4395},[],[4397],{"type":45,"value":493},{"type":40,"tag":748,"props":4399,"children":4400},{},[4401,4402,4407,4408,4413],{"type":45,"value":4341},{"type":40,"tag":104,"props":4403,"children":4405},{"className":4404},[],[4406],{"type":45,"value":604},{"type":45,"value":606},{"type":40,"tag":104,"props":4409,"children":4411},{"className":4410},[],[4412],{"type":45,"value":612},{"type":45,"value":4414}," (Step 0) — shared with raise-pr",{"type":40,"tag":721,"props":4416,"children":4417},{},[4418,4427],{"type":40,"tag":748,"props":4419,"children":4420},{},[4421],{"type":40,"tag":104,"props":4422,"children":4424},{"className":4423},[],[4425],{"type":45,"value":4426},"raise-pr\u002Freferences\u002Frepo-profiles.md",{"type":40,"tag":748,"props":4428,"children":4429},{},[4430],{"type":45,"value":4431},"Loaded by raise-pr during Step 8 chain",{"type":40,"tag":41,"props":4433,"children":4434},{},[4435],{"type":45,"value":4436},"\u003C\u002Freference_index>",{"type":40,"tag":4438,"props":4439,"children":4440},"style",{},[4441],{"type":45,"value":4442},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":4444,"total":4546},[4445,4461,4475,4494,4500,4517,4528],{"slug":4446,"name":4446,"fn":4447,"description":4448,"org":4449,"tags":4450,"stars":23,"repoUrl":24,"updatedAt":4460},"agent-ready","assess repository readiness for AI agents","Assesses a git repository's readiness for use by AI coding agents using the agentready CLI, then walks through and addresses each gap. RHDH-aware: detects RHDH repositories and uses rhdh-repos.md context to pre-fill AGENTS.md and skip inapplicable findings. Use when asked to \"assess agent readiness\", \"run agentready\", \"check how agent-ready this repo is\", \"make this repo agent-ready\", \"improve agent readiness score\", \"assess all RHDH repos\", \"batch agent readiness\", or \"onboard this repo for agents\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4451,4454,4457],{"name":4452,"slug":4453,"type":16},"Agents","agents",{"name":4455,"slug":4456,"type":16},"Code Analysis","code-analysis",{"name":4458,"slug":4459,"type":16},"Engineering","engineering","2026-07-16T06:03:24.758348",{"slug":4462,"name":4462,"fn":4463,"description":4464,"org":4465,"tags":4466,"stars":23,"repoUrl":24,"updatedAt":4474},"backstage-upgrade","upgrade Backstage dependencies","Upgrade @backstage\u002F* dependencies in a plugin or app to a target version. Use when asked to \"upgrade backstage\", \"bump backstage\", \"update @backstage\", \"align backstage deps\", \"backstage version bump\", \"upgrade dependencies\", \"backstage-cli versions:bump\", \"update to latest backstage\", \"fix version mismatch\", \"backstage version alignment\", \"upgrade before migration\", or any request to update Backstage package versions in a project.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4467,4468,4471],{"name":4458,"slug":4459,"type":16},{"name":4469,"slug":4470,"type":16},"Maintenance","maintenance",{"name":4472,"slug":4473,"type":16},"Migration","migration","2026-07-16T06:03:24.067361",{"slug":4476,"name":4476,"fn":4477,"description":4478,"org":4479,"tags":4480,"stars":23,"repoUrl":24,"updatedAt":4493},"base-images-and-rpms","update base images and lockfiles","Updates base images with updateBaseImages.sh and regenerates rpms.lock.yaml with rpm-lockfile-prototype in redhat-developer\u002Frhdh, rhdh-must-gather, and rhdh-operator. Use --analyze for read-only Containerfile\u002FDockerfile scan (current vs latest tags, UBI skew). Use for weekly upstream maintenance, UBI\u002FRHEL base image bumps, RPM lockfile refresh, base-images-and-rpms, main, release-*, or analyzing base images before updating.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4481,4484,4487,4490],{"name":4482,"slug":4483,"type":16},"Automation","automation",{"name":4485,"slug":4486,"type":16},"Configuration","configuration",{"name":4488,"slug":4489,"type":16},"Containers","containers",{"name":4491,"slug":4492,"type":16},"Deployment","deployment","2026-07-16T06:03:27.784453",{"slug":4,"name":4,"fn":5,"description":6,"org":4495,"tags":4496,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4497,4498,4499],{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"slug":4501,"name":4501,"fn":4502,"description":4503,"org":4504,"tags":4505,"stars":23,"repoUrl":24,"updatedAt":4516},"compute-plugin-package-overlay-cve-list","generate CVE management reports","Builds an RHDH CVE Management CSV from GA plugin workspace changes in rhdh-plugin-export-overlays since a version tag (patches, source.json, plugins-list). One row per CVE × plugins-list package (multi-workspace CVEs expand). Use for \"CVE CSV\", \"workspace CVEs since tag\", \"collect overlay CVEs\", \"CVE management CSV\", orchestrator\u002Flightspeed CVE review, or plugin package overlay CVE list.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4506,4509,4510,4513],{"name":4507,"slug":4508,"type":16},"Compliance","compliance",{"name":4458,"slug":4459,"type":16},{"name":4511,"slug":4512,"type":16},"Reporting","reporting",{"name":4514,"slug":4515,"type":16},"Security","security","2026-08-01T05:41:57.852801",{"slug":4518,"name":4518,"fn":4519,"description":4520,"org":4521,"tags":4522,"stars":23,"repoUrl":24,"updatedAt":4527},"create-plugin","scaffold and package RHDH dynamic plugins","Full lifecycle for RHDH dynamic plugins — scaffold, implement, export, package, and configure. Use when asked to \"create RHDH plugin\", \"bootstrap dynamic plugin\", \"create backend plugin\", \"create frontend plugin\", \"export dynamic plugin\", \"package plugin as OCI\", \"generate frontend wiring\", \"create plugin container image\", \"configure mount points\", \"create dynamic route\", \"add entity card\", \"scaffold RHDH plugin\", \"publish plugin to registry\", \"create tgz archive\", or mentions creating, exporting, packaging, or wiring a Backstage plugin for Red Hat Developer Hub. Also use when asked to \"build a plugin from scratch\", \"dynamic plugin tutorial\", \"RHDH plugin from scratch\", or \"build Backstage plugin for RHDH\". Covers backend plugins (APIs, scaffolder actions, processors), frontend plugins (pages, cards, themes), export\u002Fpackaging (OCI, tgz, npm), and frontend wiring configuration (mount points, routes, entity tabs, themes).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4523,4524],{"name":4491,"slug":4492,"type":16},{"name":4525,"slug":4526,"type":16},"Plugin Development","plugin-development","2026-07-16T06:02:28.983498",{"slug":4529,"name":4529,"fn":4530,"description":4531,"org":4532,"tags":4533,"stars":23,"repoUrl":24,"updatedAt":4545},"cursor-mcp-auth","authenticate Atlassian MCP for Jira","Ensures Cursor Atlassian MCP (plugin-atlassian-atlassian → mcp.atlassian.com) is authenticated for redhat.atlassian.net via OAuth. Use for \"authenticate Jira\", \"Atlassian MCP\", \"jira auth failed\", \"mcp_auth Atlassian\", \"cursor MCP auth\", or when another skill needs working Jira access through Cursor MCP.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4534,4537,4539,4542],{"name":4535,"slug":4536,"type":16},"Auth","auth",{"name":4538,"slug":612,"type":16},"Jira",{"name":4540,"slug":4541,"type":16},"MCP","mcp",{"name":4543,"slug":4544,"type":16},"OAuth","oauth","2026-07-29T06:00:33.525179",24,{"items":4548,"total":4546},[4549,4555,4561,4568,4574,4581,4586,4593,4605,4618,4630,4642],{"slug":4446,"name":4446,"fn":4447,"description":4448,"org":4550,"tags":4551,"stars":23,"repoUrl":24,"updatedAt":4460},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4552,4553,4554],{"name":4452,"slug":4453,"type":16},{"name":4455,"slug":4456,"type":16},{"name":4458,"slug":4459,"type":16},{"slug":4462,"name":4462,"fn":4463,"description":4464,"org":4556,"tags":4557,"stars":23,"repoUrl":24,"updatedAt":4474},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4558,4559,4560],{"name":4458,"slug":4459,"type":16},{"name":4469,"slug":4470,"type":16},{"name":4472,"slug":4473,"type":16},{"slug":4476,"name":4476,"fn":4477,"description":4478,"org":4562,"tags":4563,"stars":23,"repoUrl":24,"updatedAt":4493},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4564,4565,4566,4567],{"name":4482,"slug":4483,"type":16},{"name":4485,"slug":4486,"type":16},{"name":4488,"slug":4489,"type":16},{"name":4491,"slug":4492,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":4569,"tags":4570,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4571,4572,4573],{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"slug":4501,"name":4501,"fn":4502,"description":4503,"org":4575,"tags":4576,"stars":23,"repoUrl":24,"updatedAt":4516},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4577,4578,4579,4580],{"name":4507,"slug":4508,"type":16},{"name":4458,"slug":4459,"type":16},{"name":4511,"slug":4512,"type":16},{"name":4514,"slug":4515,"type":16},{"slug":4518,"name":4518,"fn":4519,"description":4520,"org":4582,"tags":4583,"stars":23,"repoUrl":24,"updatedAt":4527},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4584,4585],{"name":4491,"slug":4492,"type":16},{"name":4525,"slug":4526,"type":16},{"slug":4529,"name":4529,"fn":4530,"description":4531,"org":4587,"tags":4588,"stars":23,"repoUrl":24,"updatedAt":4545},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4589,4590,4591,4592],{"name":4535,"slug":4536,"type":16},{"name":4538,"slug":612,"type":16},{"name":4540,"slug":4541,"type":16},{"name":4543,"slug":4544,"type":16},{"slug":4594,"name":4594,"fn":4595,"description":4596,"org":4597,"tags":4598,"stars":23,"repoUrl":24,"updatedAt":4604},"konflux-release-data-rpa","update release tags in konflux-release-data","Bumps RHDH ReleasePlanAdmission tag versions in konflux-release-data for a stream release (e.g. 1.9.7), opens a GitLab merge request, and launches it in the browser. Use when updating RPA tags, konflux-release-data, ReleasePlanAdmission, rhdh-1-9-*.yaml, rhdh-plugin-catalog-1-9-*.yaml, or preparing an RHDH patch release.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4599,4600,4601],{"name":4482,"slug":4483,"type":16},{"name":4491,"slug":4492,"type":16},{"name":4602,"slug":4603,"type":16},"GitLab","gitlab","2026-07-16T06:00:19.516231",{"slug":4606,"name":4606,"fn":4607,"description":4608,"org":4609,"tags":4610,"stars":23,"repoUrl":24,"updatedAt":4617},"konflux-tekton-updates","update Konflux Tekton task digests","Bumps Konflux Tekton task digests with .tekton\u002FupdateDigests.sh --minor --no-push, applies konflux-ci\u002Fbuild-definitions MIGRATION.md pipeline fixes, and regenerates PipelineRuns. Use for rhdh-plugin-catalog, RHDH midstream (4-rhdh), Konflux task minor bumps, prefetch-dependencies-oci-ta, build-image-index, or updateDigests.sh.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4611,4612,4615,4616],{"name":4482,"slug":4483,"type":16},{"name":4613,"slug":4614,"type":16},"CI\u002FCD","ci-cd",{"name":4491,"slug":4492,"type":16},{"name":4458,"slug":4459,"type":16},"2026-07-16T06:03:28.123118",{"slug":4619,"name":4619,"fn":4620,"description":4621,"org":4622,"tags":4623,"stars":23,"repoUrl":24,"updatedAt":4629},"lifecycle","check Red Hat product lifecycle status","Check version lifecycle and support status for platforms and integrations used by RHDH. Covers OCP, AKS, EKS, GKE, RHDH releases, RHBK, Quay, PostgreSQL, and any Red Hat product via the Product Life Cycles API. Use when asking about version support, EOL dates, GA dates, support phases, or planning version upgrades. Also use for \"is X still supported\", \"what versions should we test\", or \"when does X reach EOL\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4624,4625,4626],{"name":4507,"slug":4508,"type":16},{"name":4469,"slug":4470,"type":16},{"name":4627,"slug":4628,"type":16},"Operations","operations","2026-07-16T06:03:19.344038",{"slug":4631,"name":4631,"fn":4632,"description":4633,"org":4634,"tags":4635,"stars":23,"repoUrl":24,"updatedAt":4641},"nfs-migration","migrate plugins to New Frontend System","Migrate Backstage frontend plugins from the legacy system to the New Frontend System (NFS). Use when asked to \"migrate to NFS\", \"new frontend system\", \"convert plugin to NFS\", \"createFrontendPlugin\", \"PageBlueprint\", \"ApiBlueprint\", \"SubPageBlueprint\", \"alpha to GA\", \"legacy to NFS\", \"frontend migration\", \"extension blueprints\", \"migrate frontend plugin\", \"NFS support\", \"graduate alpha\", or mentions migrating a Backstage plugin to the new frontend system for RHDH.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4636,4637,4640],{"name":4458,"slug":4459,"type":16},{"name":4638,"slug":4639,"type":16},"Frontend","frontend",{"name":4472,"slug":4473,"type":16},"2026-07-16T06:03:27.078987",{"slug":4643,"name":4643,"fn":4644,"description":4645,"org":4646,"tags":4647,"stars":23,"repoUrl":24,"updatedAt":4654},"overlay","manage RHDH plugin export overlays","Manages the rhdh-plugin-export-overlays repository — onboards plugins to the Extensions Catalog, updates plugin versions, fixes overlay build failures, triages and analyzes PRs, triggers publishes, and manages plugin workspaces. Use when working with overlays, importing plugins, debugging CI, checking PRs, bumping versions, or mentions \"Extensions Catalog\", \"overlay build failed\", \"plugin registry\", \"overlay PR\", \"overlay doctor\", \"plugin import\", \"add plugin to catalog\", \"onboard plugin\", or \"plugin workspace\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4648,4649,4652,4653],{"name":4482,"slug":4483,"type":16},{"name":4650,"slug":4651,"type":16},"Code Review","code-review",{"name":4491,"slug":4492,"type":16},{"name":4458,"slug":4459,"type":16},"2026-07-16T06:03:20.380044"]