Test & Report
A skill that packages the full flow: "Feishu test doc → browser evidence capture → dual-track submission (Bitable + GitHub issue)" so every piece of feedback includes environment info, screenshots, dedup conclusion, and priority, tracked in two systems.
Trigger Boundaries (when to use / when not to use)
Use this skill:
- User sends a Feishu test doc URL (usually contains test scope + code repo + Bitable link)
- User says "start testing / help me test / experience staging / collab on bugs / collect feedback"
- User describes a UX / functional issue and wants it tracked in both Bitable + GitHub
- User sends a known test Bitable URL (e.g.
IJQPbTzZhaObMQsuL5OcbaoBnag / AdeDbC9VgaNkrEsXtk5cTMarn2e) with feedback
Do NOT use this skill:
- User asks you to write product code / open a PR → use normal dev flow
- User asks you to review an existing PR → use
gh-pr-review skill
- CI / build failure debugging → use normal debugging
- User asks "how do I use this product / where do I download" → general answer
Prerequisites (check before executing)
| Capability |
Check Method |
If Missing |
| claude-in-chrome extension |
mcp__claude-in-chrome__tabs_context_mcp returns tab list |
Guide user to install from claude.com/chrome and click Connect, wait for "done" |
| lark-cli logged in |
lark-cli contact +get-user --jq .data.user.name |
Jump to lark-shared skill for auth |
| gh CLI has repo write access |
gh api repos/<OWNER>/<REPO> --jq .permissions shows push: true |
Ask user to grant triage/write to current GitHub account |
| R2 image hosting available |
which upload-img returns ~/.local/bin/upload-img |
Manual fallback: ask user to drag screenshot into GitHub issue editor |
Workflow Overview
Phase 1 Parse test doc (Feishu doc → config)
Phase 2 Browser setup (claude-in-chrome)
Phase 3 Accompany testing: user operates, agent observes
Phase 4 Per-bug submission (dedup → priority → upload screenshot → Bitable + GitHub dual-track)
Phase 5 Return to Phase 3 until user says "done"
Phase 1: Parse Test Document
User provides a Feishu document URL. Use lark-cli docs +fetch --doc <URL> --format pretty to pull full text, then extract:
| Config Item |
Usually Found In |
| Test topic / scope |
Title + opening paragraphs |
| Code repository (GitHub URL) |
"Reference repo" / "Code repository" section, or GitHub link in body |
| Staging URL |
"Test environment" / "Access URL" section |
| Issue collection Bitable |
"Issue collection" / "Bug list" section with mcnnox2fhjfq.feishu.cn/wiki/...?table=tbl... or /base/...?table=tbl... |
If user only gives a Bitable URL without a document: identify the product (see auto-detection rules below), use the config from references/bitable-bases.md, and ask user for the staging URL if not found in the Bitable first record.
Auto-detect Current Product
Use these signals to determine which product, and therefore which repo + Bitable to use:
| Signal |
Product |
Repository |
Bitable |
URL contains cse-admin-staging.cherry-ai.com / enterprise-api / "SaaS" / "Enterprise" |
Enterprise / SaaS |
<ENTERPRISE_REPO> |
IJQPbTzZhaObMQsuL5OcbaoBnag / tbl20SIk4B78Ydpg |
| Mentions "client" / "desktop" / Electron |
Desktop Client |
<DESKTOP_REPO> |
AdeDbC9VgaNkrEsXtk5cTMarn2e / tbl7eUvrbfM7XFqg |
| Neither clear |
Ask user |
— |
— |
Known config details (field IDs, enum values, view shortcuts) are in references/bitable-bases.md.
Phase 2: Browser Setup
tabs_context_mcp { createIfEmpty: true } to check connection
- If not connected → guide user to install claude-in-chrome extension (claude.com/chrome), click Connect, retry
- Once connected,
navigate to staging URL
- Do a baseline capture before any bug is reported:
read_page --filter interactive for main interactive elements
read_console_messages / read_network_requests start recording
- (Optional) note core script sources (third-party captcha / CDN / analytics)
Tool pitfalls:
javascript_tool may throw Cannot access a chrome-extension:// URL of different extension when page loads cross-extension iframes (e.g. Geetest). Fall back to read_page + reading source.
read_console_messages / read_network_requests need to be listening from page load — refresh once before reading.
- Don't use
chrome-devtools MCP debug features simultaneously — they'll conflict with claude-in-chrome for Debugger protocol access.
Phase 3: Accompany Testing Loop
User operates manually. Agent does two things:
- Passive observation: don't drive the user, don't click randomly
- On-demand support: when user says "there's a problem / can't click / error / looks wrong", immediately collect evidence
Evidence package (collect for every bug):
| Dimension |
Tool |
Key Points |
| Phenomenon description |
User's own words |
One sentence + reproduction trigger |
| DOM state |
read_page, javascript_tool |
Check disabled / pointerEvents / opacity / event listeners |
| Console errors |
read_console_messages --pattern 'error|warn|Error' |
Keep only error/warn, not everything |
| Network anomalies |
read_network_requests --urlPattern '<api-prefix>' |
Look for 4xx/5xx/pending |
| Screenshots |
Ask user cmd+shift+4 to .context/attachments/, or mcp__chrome-devtools__take_screenshot |
Required for error scenes; for UX issues, "current vs expected" is better |
| Code root cause |
gh api / local grep |
If source is available, find button enable conditions / API paths / props gates |
Once evidence is complete, proceed to Phase 4.
Phase 4: Per-Bug Submission
Detailed procedure in references/submit-bug-sop.md. High-level steps (don't skip):
Dedup (mandatory, see SOP Section 2)
- Search Bitable + GitHub issues (including closed) + GitHub PRs (including merged)
- On hit, apply 5-category disposition: identical / fixed regression / in-progress PR / related but different / unrelated
- Show comparison table to user, wait for instruction — confirm even when no hit
Assign priority (see SOP Section 3)
- If inferable from symptoms → fill directly + brief rationale
- If not inferable →
AskUserQuestion with P0/P1/P2 options
- Never default to P1 or guess randomly
Upload screenshot to R2 (see SOP Section 4)
upload-img <local-path>
# Returns https://pub-a9416c5573a34388b8d9465d8bef4257.r2.dev/YYYYMMDD/filename
Write to Feishu Bitable
+record-upsert required: issue title / description / category / priority / status (=pending confirmation) / submitter
+record-upload-attachment attach screenshot to the "Example image" field (do not stuff into upsert)
Create GitHub issue
- Title:
[Bug]: <one sentence> or [Feature]: <one sentence> (based on category)
- Body follows generic issue format: English body first (with translation disclaimer), Chinese original collapsed in
<details>, screenshots embedded as <img src="..."> with R2 URLs
- Labels: category = Bug →
type: bug; = UX improvement → type: feature
Report back: give user record_id, issue URL, and Bitable URL together, plus a summary: "title / category / priority / status"
Phase 5: Return to Phase 3
User continues testing. Every bug report goes through Phase 4.
When user says "done / finished / pause for today / stop" → output session summary: how many records created, how many issues filed, which regressions / in-progress PRs were identified, total time spent.
Reference Files
references/bitable-bases.md — Known Base tokens / table IDs / field IDs / enum values, cross-base field naming conventions
references/submit-bug-sop.md — Detailed submission protocol (5 dedup categories, priority rules, value formats, R2 upload, issue template)
1---2name: test-and-report3description: Manual testing + bug filing for Enterprise / SaaS products. Parses a Feishu test doc (scope + repo + bitable URL), observes staging via claude-in-chrome, captures DOM/console/network/screenshot evidence, then dual-tracks each finding — Feishu Bitable record (with attachments) + GitHub issue (<REPO>#<ISSUE_NUMBER> format — English-primary, Chinese collapsed, R2-hosted screenshots, matching type label). Enforces dedup across bitable + GitHub issues + PRs, and mandatory P0/P1/P2 priority prompt when unclear. Trigger whenever the user says "test and report", "test and report side-by-side", "start system testing", "experience staging", "collaborate on bug filing", "collect feedback", a shared Feishu testing doc, a bitable URL + finding, or any UX/bug needing both bitable + GitHub tracking. Do NOT use for writing product code, PR review, CI debugging, or general "how do I use this product" questions — those go to normal dev / PR-review / support flows.4---56# Test & Report78A skill that packages the full flow: "Feishu test doc → browser evidence capture → dual-track submission (Bitable + GitHub issue)" so every piece of feedback includes environment info, screenshots, dedup conclusion, and priority, tracked in two systems.910## Trigger Boundaries (when to use / when not to use)1112**Use this skill:**13- User sends a Feishu test doc URL (usually contains test scope + code repo + Bitable link)14- User says "start testing / help me test / experience staging / collab on bugs / collect feedback"15- User describes a UX / functional issue and wants it tracked in both Bitable + GitHub16- User sends a known test Bitable URL (e.g. `IJQPbTzZhaObMQsuL5OcbaoBnag` / `AdeDbC9VgaNkrEsXtk5cTMarn2e`) with feedback1718**Do NOT use this skill:**19- User asks you to write product code / open a PR → use normal dev flow20- User asks you to review an existing PR → use `gh-pr-review` skill21- CI / build failure debugging → use normal debugging22- User asks "how do I use this product / where do I download" → general answer2324---2526## Prerequisites (check before executing)2728| Capability | Check Method | If Missing |29|------------|-------------|------------|30| claude-in-chrome extension | `mcp__claude-in-chrome__tabs_context_mcp` returns tab list | Guide user to install from claude.com/chrome and click Connect, wait for "done" |31| lark-cli logged in | `lark-cli contact +get-user --jq .data.user.name` | Jump to `lark-shared` skill for auth |32| gh CLI has repo write access | `gh api repos/<OWNER>/<REPO> --jq .permissions` shows `push: true` | Ask user to grant triage/write to current GitHub account |33| R2 image hosting available | `which upload-img` returns `~/.local/bin/upload-img` | Manual fallback: ask user to drag screenshot into GitHub issue editor |3435## Workflow Overview3637```38Phase 1 Parse test doc (Feishu doc → config)39Phase 2 Browser setup (claude-in-chrome)40Phase 3 Accompany testing: user operates, agent observes41Phase 4 Per-bug submission (dedup → priority → upload screenshot → Bitable + GitHub dual-track)42Phase 5 Return to Phase 3 until user says "done"43```4445---4647## Phase 1: Parse Test Document4849User provides a Feishu document URL. Use `lark-cli docs +fetch --doc <URL> --format pretty` to pull full text, then extract:5051| Config Item | Usually Found In |52|-------------|-----------------|53| **Test topic / scope** | Title + opening paragraphs |54| **Code repository** (GitHub URL) | "Reference repo" / "Code repository" section, or GitHub link in body |55| **Staging URL** | "Test environment" / "Access URL" section |56| **Issue collection Bitable** | "Issue collection" / "Bug list" section with `mcnnox2fhjfq.feishu.cn/wiki/...?table=tbl...` or `/base/...?table=tbl...` |5758**If user only gives a Bitable URL without a document**: identify the product (see auto-detection rules below), use the config from `references/bitable-bases.md`, and ask user for the staging URL if not found in the Bitable first record.5960### Auto-detect Current Product6162Use these signals to determine which product, and therefore which repo + Bitable to use:6364| Signal | Product | Repository | Bitable |65|--------|---------|------------|---------|66| URL contains `cse-admin-staging.cherry-ai.com` / `enterprise-api` / "SaaS" / "Enterprise" | **Enterprise / SaaS** | `<ENTERPRISE_REPO>` | `IJQPbTzZhaObMQsuL5OcbaoBnag` / `tbl20SIk4B78Ydpg` |67| Mentions "client" / "desktop" / Electron | **Desktop Client** | `<DESKTOP_REPO>` | `AdeDbC9VgaNkrEsXtk5cTMarn2e` / `tbl7eUvrbfM7XFqg` |68| Neither clear | Ask user | — | — |6970Known config details (field IDs, enum values, view shortcuts) are in `references/bitable-bases.md`.7172---7374## Phase 2: Browser Setup75761. `tabs_context_mcp { createIfEmpty: true }` to check connection772. If not connected → guide user to install claude-in-chrome extension (claude.com/chrome), click Connect, retry783. Once connected, `navigate` to staging URL794. Do a baseline capture before any bug is reported:80 - `read_page --filter interactive` for main interactive elements81 - `read_console_messages` / `read_network_requests` start recording82 - (Optional) note core script sources (third-party captcha / CDN / analytics)8384**Tool pitfalls:**85- `javascript_tool` may throw `Cannot access a chrome-extension:// URL of different extension` when page loads cross-extension iframes (e.g. Geetest). Fall back to `read_page` + reading source.86- `read_console_messages` / `read_network_requests` need to be listening from page load — refresh once before reading.87- Don't use `chrome-devtools` MCP debug features simultaneously — they'll conflict with claude-in-chrome for Debugger protocol access.8889---9091## Phase 3: Accompany Testing Loop9293User operates manually. Agent does two things:94951. **Passive observation**: don't drive the user, don't click randomly962. **On-demand support**: when user says "there's a problem / can't click / error / looks wrong", immediately collect evidence9798**Evidence package** (collect for every bug):99100| Dimension | Tool | Key Points |101|-----------|------|------------|102| Phenomenon description | User's own words | One sentence + reproduction trigger |103| DOM state | `read_page`, `javascript_tool` | Check disabled / pointerEvents / opacity / event listeners |104| Console errors | `read_console_messages --pattern 'error\|warn\|Error'` | Keep only error/warn, not everything |105| Network anomalies | `read_network_requests --urlPattern '<api-prefix>'` | Look for 4xx/5xx/pending |106| Screenshots | Ask user cmd+shift+4 to `.context/attachments/`, or `mcp__chrome-devtools__take_screenshot` | Required for error scenes; for UX issues, "current vs expected" is better |107| Code root cause | `gh api` / local grep | If source is available, find button enable conditions / API paths / props gates |108109Once evidence is complete, proceed to Phase 4.110111---112113## Phase 4: Per-Bug Submission114115Detailed procedure in `references/submit-bug-sop.md`. **High-level steps** (don't skip):1161171. **Dedup** (mandatory, see SOP Section 2)118 - Search Bitable + GitHub issues (including closed) + GitHub PRs (including merged)119 - On hit, apply 5-category disposition: identical / fixed regression / in-progress PR / related but different / unrelated120 - Show comparison table to user, wait for instruction — **confirm even when no hit**1211222. **Assign priority** (see SOP Section 3)123 - If inferable from symptoms → fill directly + brief rationale124 - If not inferable → `AskUserQuestion` with P0/P1/P2 options125 - **Never** default to P1 or guess randomly1261273. **Upload screenshot to R2** (see SOP Section 4)128 ```129 upload-img <local-path>130 # Returns https://pub-a9416c5573a34388b8d9465d8bef4257.r2.dev/YYYYMMDD/filename131 ```1321334. **Write to Feishu Bitable**134 - `+record-upsert` required: issue title / description / category / priority / status (=pending confirmation) / submitter135 - `+record-upload-attachment` attach screenshot to the "Example image" field (**do not** stuff into upsert)1361375. **Create GitHub issue**138 - Title: `[Bug]: <one sentence>` or `[Feature]: <one sentence>` (based on category)139 - Body follows generic issue format: English body first (with translation disclaimer), Chinese original collapsed in `<details>`, screenshots embedded as `<img src="...">` with R2 URLs140 - Labels: category = Bug → `type: bug`; = UX improvement → `type: feature`1411426. **Report back**: give user record_id, issue URL, and Bitable URL together, plus a summary: "title / category / priority / status"143144---145146## Phase 5: Return to Phase 3147148User continues testing. Every bug report goes through Phase 4.149150When user says "done / finished / pause for today / stop" → output session summary: how many records created, how many issues filed, which regressions / in-progress PRs were identified, total time spent.151152---153154## Reference Files155156- `references/bitable-bases.md` — Known Base tokens / table IDs / field IDs / enum values, cross-base field naming conventions157- `references/submit-bug-sop.md` — Detailed submission protocol (5 dedup categories, priority rules, value formats, R2 upload, issue template)