diff --git a/.claude/skills/checklist-test/SKILL.md b/.claude/skills/checklist-test/SKILL.md index 4c8b2e9fc0..a860c80ed0 100644 --- a/.claude/skills/checklist-test/SKILL.md +++ b/.claude/skills/checklist-test/SKILL.md @@ -88,7 +88,7 @@ node scripts/checklist-select.mjs --json 运行发现该项的 `steps` 写错了(路由搬家、键改名、过期路径还需要清 localStorage)—— 这是清单在起作用。那是一次清单**编辑**:在 **worktree** 里做(PD#11):修订该项、递 增 `revision`、追加一条 `history`、保持 `node scripts/check-platform-checklist.mjs` -绿,落在任务分支上。运行中发现的产品缺陷进 `FOLLOW-UPS.md`(或立成 issue),作为 +绿,落在任务分支上。运行中发现的产品缺陷按 §4 收束抽取成独立卡;条款侧可记 expected-fail 探针 —— 永不在真实缺陷上把条款打成绿。 ## 4. 结果 issue —— 一次运行一张 GitHub issue,纯文本 @@ -103,8 +103,8 @@ expected-fail 探针 —— 永不在真实缺陷上把条款打成绿。 用 `issue_write`(github MCP)立单: - **标题** —— `QA run · · · ` -- **标签** —— 恒带 `qa-run`;任何条款失败就加 `bug`(P0/P1 再加 `regression`),让 - 真实缺陷直接从运行 issue 可分诊,不必再立第二张。 +- **标签** —— 只带 `qa-run`,⛔ 不挂 `bug`/priority 等工作标签:run 记录是协议载体、 + 不入分诊 sweep,⛔ 不是可派发单元;工作标签随抽取出的缺陷卡走(RUNNER 抽取义务条款)。 - **正文**,按此顺序: - **环境指纹** —— framework sha、`.objectui-sha`、端口、db、seed、时间戳。 - **范围** —— 选择器 + 每项所对的 `revision`。 @@ -114,6 +114,10 @@ expected-fail 探针 —— 永不在真实缺陷上把条款打成绿。 body)/ ref 定位的 selector 路径,足以在全新启动上重新命中,外加 oracle 的 expected-vs-actual。足够让人或全新 agent 不靠你的截图复现。 - 派生的整项判定 + fixture 缺口清单(如有)。 +- **收束抽取(RUNNER 抽取义务条款)** —— 运行中发现的每个产品缺陷,收束报告时逐个抽 + 取为独立 issue:标题自含、复现与机制条目化、指回本 run issue 取全量证据;缺陷卡不 + 挂 `qa-run`,正常进分诊首触。清单准确性发现与 fixture 缺口归波次锚卡(sweep 跟踪 + issue)收口,⛔ 不抽取;环境阻塞记录在案即可。 同一份逐条款表 + 环境准备与测试的耗时之比,回报给维护者(chat),并链接已立的 issue。 diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index a1b096367f..d66d365f4e 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -255,7 +255,7 @@ of record)。**读侧闭环(维护者 2026-08-12 批准):接管与巡检只读 仓没有车道标签,这形状是它们队列卡的常态);③ 有 `domain:*` 无 pm-state。②③ 只取 `updated_at` 早于 ~2 分钟的卡且不是可选项 —— 半标注卡是协议自己按设计生产的(一次标签写入即把老卡打成半标 注),只带路由或状态机其一的卡对两个视图同时不可见。排除:`tracking`、`status:parked`(其正常形 -状恰是「带域标签无 pm-state」)、全部 `pm:seat` 贴;存量大时每轮限量、优先最新。**紧急卡直接分诊** +状恰是「带域标签无 pm-state」)、全部 `pm:seat` 贴、`qa-run` 记录(协议载体非工作);存量大时每轮限量、优先最新。**紧急卡直接分诊** (维护者 2026-08-13):维护者点名或 p0 嫌疑 ⇒ 立即起 `claude-fable-5` 分诊子代理,不等 Routine 班 次;授权面 = 分诊本身(定级/路由/标签/既有评论格式),⛔ 不写码不认领;产出落卡,与 Routine 分诊同格式同效力(细则见 `references/dispatch-runbook.md`)。 **跨仓 pin 链的窗口级兜底也在本 sweep**(联动单第一产者仍是接受座位;⛔ 只立单不执行 bump): diff --git a/docs/qa/platform-checklist/README.md b/docs/qa/platform-checklist/README.md index 7185c6297e..aaa48a4682 100644 --- a/docs/qa/platform-checklist/README.md +++ b/docs/qa/platform-checklist/README.md @@ -281,7 +281,8 @@ smoke) ∪ any item whose `source` cites a PR in the release. The tracking issue sweep links here and hosts discussion; results stay OUT of the repo — every run files one `qa-run` GitHub issue as its record (text only: the verdict table + a reproduction rule per failure, never screenshots; `runs/` is git-ignored), and a run that finds a real -regression carries the `bug` label so it triages straight from that issue. Item text, +regression extracts it into its own standalone card at close-out (RUNNER.md, extraction +obligation — the run issue itself stays `qa-run`-only, excluded from triage). Item text, fixtures learned, and new traps discovered flow **back into the ledger** as revisions — that is the accumulation the one-off checklists never had. diff --git a/docs/qa/platform-checklist/RUNNER.md b/docs/qa/platform-checklist/RUNNER.md index a24378e360..51a558e812 100644 --- a/docs/qa/platform-checklist/RUNNER.md +++ b/docs/qa/platform-checklist/RUNNER.md @@ -52,9 +52,9 @@ test-run output the clause's `evidence` field names. — the vendored `/_console` bundle may be stale (skill §2); - then capture the **reproduction rule** — ordered steps / API calls (method · path · body) / the ref-targeted selector path + expected-vs-actual — into the run's result - issue, which is labeled `bug`. A `fail` with no reproduction rule in its issue is not - a completed verdict. (The screenshot that convinced you is a live judgment aid, not - report content — describe what it showed in one line; never attach it.) + issue. A `fail` with no reproduction rule in its issue is not a completed verdict. + (The screenshot that convinced you is a live judgment aid, not report content — + describe what it showed in one line; never attach it.) 3. **Classify blockers honestly.** Missing seed/persona/fixture → `blocked(fixture)`, and *record the gap on the item* (`fixtures.knownGaps` or `blocked`) so the next sweep doesn't rediscover it. A defect in the fixture itself (seed silently failing, @@ -114,8 +114,8 @@ contradicts it, and correct it here when it does. ## Run records — the GitHub issue is the report Every completed run — **pass or fail alike** — files **one GitHub issue** as its durable -record, labeled `qa-run` (plus `bug` when any clause failed). **Nothing lands in the -repo** — not the JSON, not screenshots; `runs/` is git-ignored except its README. +record, labeled `qa-run` and nothing else (extraction obligation below). **Nothing lands +in the repo** — not the JSON, not screenshots; `runs/` is git-ignored except its README. **The issue is text only.** Screenshots and DOM dumps are oracles you consult *live* to reach a verdict — never report artifacts. What the report carries for a defect is the @@ -158,3 +158,21 @@ per-clause verdict table (text oracle evidence) · a reproduction rule per `fail derived item verdicts + fixture gaps. The durable, version-controlled truth is still the checklist under `areas/`; a run is a dated assertion about one build, and it lives in its issue, not the tree. + +### Extraction obligation — the run record is a protocol carrier, not work + +Run issues are excluded from the PM's backlog sweep, same class as the `pm:seat` post +(maintainer ruling, 2026-08-17: 「把 qa-run 加进 sweep 排除清单 —— run 记录和 pm:seat +贴同类:协议载体,不是工作」). Nobody fishes a run record for dispatchable work — so +closing out the report includes the extraction, owed by the runner: + +- **The run issue carries run evidence only.** It is ⛔ not a dispatchable unit, and it + ⛔ never carries work labels (`bug`, priority, …) — work labels ride the extracted + cards. +- **Product defects found during the run**: at close-out, extract each one into its own + standalone issue — self-contained title, reproduction and mechanism itemized in the + card, a pointer back to the run record for the full evidence chain. A defect card does + not carry `qa-run`; it enters triage first-touch normally. +- **Checklist-accuracy findings and fixture gaps** close out through the wave's anchor + card (the sweep's tracking issue) — ⛔ not extracted. +- **Environment blockers**: recorded in the run record is enough. diff --git a/docs/qa/platform-checklist/runs/README.md b/docs/qa/platform-checklist/runs/README.md index f90d15c24c..25ef38eb7f 100644 --- a/docs/qa/platform-checklist/runs/README.md +++ b/docs/qa/platform-checklist/runs/README.md @@ -14,9 +14,10 @@ durable, **text-only** report (pass or fail alike): - the issue **body** hosts the per-clause verdict table (pass / partial / fail / blocked) and the scope — the selector that chose the items + the `revision` each ran against; - **every `fail` carries a reproduction rule** in that same issue — ordered steps / API - calls (method · path · body) / the ref-targeted selector path + expected-vs-actual — - and the issue gains the `bug` label (a real regression may additionally get its own - linked issue) so it triages straight from the run; + calls (method · path · body) / the ref-targeted selector path + expected-vs-actual; + the run issue itself stays `qa-run`-only (protocol carrier, excluded from the triage + sweep) — at close-out each product defect is extracted into its own standalone card + (RUNNER.md, extraction obligation), and that card is what triages; - **screenshots are never part of the report** — they are live judgment aids that die with the run environment, described in one line of text, never attached or linked.