ワンクリックで
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.