一键导入
qa-pr
Automated QA testing for Prose PRs using Circuit Electron. Use when testing pull requests before merge.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Automated QA testing for Prose PRs using Circuit Electron. Use when testing pull requests before merge.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Validate all LLM-accelerated GitHub issues through systematic QA testing via Circuit Electron.
Human-in-the-loop QA loop for verifying a large feature or refactor against the locally-running app before merge/release. Use when automated tests (e2e, web-e2e) don't cover the behavioral/UX surface and you need a structured, interactive "you drive / I observe" verification pass with in-session bug fixes. Complements qa-pr (automated, Circuit) and qa-web (Playwright).
Implement one solo-ist/prose GitHub issue end-to-end and open a PR ready for review. Use when an Oz child agent is assigned exactly one issue to fix or build in this repo.
Reference and checklist for building and maintaining CI/CD workflows, inter-workflow communication, dispatch scripts, and cloud agent infrastructure. Use when modifying any workflow YAML, dispatch script, or sentinel-based communication.
Merge scorer and PE signals to route PRs. Applies routing matrix (hitl-light / hitl-full) based on score thresholds and risk levels.
Principal Engineer architectural risk analysis for PRs. Assesses blast radius, hidden coupling, and privilege boundary concerns. Outputs LOW-CRITICAL risk rating.
| name | qa-pr |
| description | Automated QA testing for Prose PRs using Circuit Electron. Use when testing pull requests before merge. |
Automated QA testing for Prose PRs using Circuit Electron.
/qa-pr <pr-number>
Use the GitHub MCP to get PR information:
mcp__github__pull_request_read (method: "get", owner: "solo-ist", repo: "prose", pullNumber: <pr-number>)
Then fetch comments to find QA instructions:
mcp__github__pull_request_read (method: "get_comments", owner: "solo-ist", repo: "prose", pullNumber: <pr-number>)
Look for a comment containing "## QA Instructions" or similar test plan.
CRITICAL: Always checkout the PR branch before testing to ensure you're testing the correct code:
git fetch origin <branch-name>
git checkout <branch-name>
The branch name is in the PR details under head.ref.
CRITICAL: Kill any existing Electron/Vite processes to ensure a fresh build. Stale processes can use cached preload scripts and miss PR changes:
pkill -f "electron" 2>/dev/null
pkill -f "vite" 2>/dev/null
# Reap Circuit Electron MCP servers leaked by exited sessions (safe: kills only
# dead-client orphans, never a live server). See CLAUDE.md › Orphaned Circuit Server Cleanup.
node scripts/reap-circuit.mjs 2>/dev/null || true
This is especially important when:
src/preload/)src/main/)Launch in development mode (rebuilds all code fresh):
mcp__circuit-electron__app_launch (app: "/Users/angelmarino/Code/prose", mode: "development", startScript: "dev", includeSnapshots: false)
Note: Use includeSnapshots: false to avoid snapshot-related errors with keyboard tools.
Save the returned sessionId for subsequent commands.
For each test in the QA instructions:
Use evaluate for DOM interactions (more reliable than click/type):
mcp__circuit-electron__evaluate (sessionId: <id>, script: "...")
Use text_content to verify state:
mcp__circuit-electron__text_content (sessionId: <id>)
Use close and app_launch to test persistence across app restarts
Click a button by aria-label:
const btn = document.querySelector('[aria-label="Button Name"]');
btn?.click();
Click a button by text:
const btn = Array.from(document.querySelectorAll('button')).find(b => b.innerText === 'Text');
btn?.click();
Get editor content:
document.querySelector('.ProseMirror')?.innerText
Set editor content:
const editor = document.querySelector('.ProseMirror');
editor.innerHTML = '<p>New content</p>';
editor.dispatchEvent(new Event('input', { bubbles: true }));
Open settings (Cmd+,):
document.dispatchEvent(new KeyboardEvent('keydown', { key: ',', metaKey: true, bubbles: true }));
Some things cannot be automated:
For these, use a collaborative workflow:
Setup (Claude does this):
Handoff (User does this):
Verify (Claude does this):
text_content to check result**Your turn - Manual Step:**
The app should show:
- Title: "Untitled *"
- Content: "Test content" with timestamp `2025-12-27T17:23:13.351Z`
**Do this now:**
1. Press **Cmd+O**
2. Select **CLAUDE.md** from the project root
Let me know when done.
When testing app restart persistence:
mcp__circuit-electron__closemcp__circuit-electron__app_launchUse GitHub MCP to comment:
mcp__github__add_issue_comment (owner: "solo-ist", repo: "prose", issue_number: <pr-number>, body: "...")
## QA Test Results - Automated Testing
### ✅ Test Name - PASSED
- What was tested
- Verification details
### ❌ Test Name - FAILED
- What was tested
- What went wrong
- Steps to reproduce
### ⚠️ Test Name - PARTIAL
- What was automated
- What needs manual verification
---
## Manual Testing Required
### Test Name (Manual Steps)
**Setup:** [prerequisites]
1. Step one
2. Step two
**Verify:**
- [ ] Checkbox item
- [ ] Another checkbox
**Why manual:** [explanation]
---
## Summary
| Test | Status | Notes |
|------|--------|-------|
| Test 1 | ✅ PASSED | Details |
| Test 2 | ❌ FAILED | Details |
**Recommendation:** [merge/fix/needs work]
includeSnapshots: false when launching, use evaluate with text_content instead of snapshotkey, keyboard_press, and keyboard_type tools often fail with "Cannot read properties of undefined (reading 'snapshot')". Use type tool with selector instead, or evaluate to dispatch KeyboardEventsevaluate to click via JavaScriptmode: "development" with startScript: "dev"Keyboard shortcuts in Electron are tricky to test:
src/main/menu.ts) intercept keys before they reach the renderermetaKey is often strippedWorkaround: For keyboard shortcut testing, use collaborative manual testing where the user presses the keys and Claude verifies the results.