diff --git a/skills/scd-quickdev/SKILL.md b/skills/scd-quickdev/SKILL.md index d827358..6a0dd93 100644 --- a/skills/scd-quickdev/SKILL.md +++ b/skills/scd-quickdev/SKILL.md @@ -28,7 +28,7 @@ Issue 标题和正文都必须使用中文,代码标识、命令、路径、 2. 缺陷先复现、检查因果根因、添加或找出会失败的回归测试,再作最小修复。原因进入框架或依赖时,在认定应用代码有错前查其官方 Issue 跟踪器;无法证实则保持 `Unconfirmed`。只改任务范围,证据使范围扩大时重新路由。 3. 运行直接练习变更的可行最强检查与仓库要求的构建/相关测试,把每个验收项映射到已观察证据、`UNVERIFIED` 或具名阻塞。失败先区分当前回归与无关基线,不伪造完成,不无界重试。 4. 实际差异影响页面、路由、组件交互、可见样式或响应式行为时,无论是否调用过 UIUX,都必须执行页面验收门:真实浏览器操作及视觉证据,缺失则 `BLOCKED`。触发时读取页面参考,不以测试/API绿色替代。 -5. 工程完成后读取发布契约,审计整个 Issue 的验收闭合、实施账目闭合和交付状态闭合。把最终验收交给独立的新上下文子 Agent;它必须亲读 Issue/差异并直接验证,不得只依赖实施 Agent 摘要。创建拉取请求并等待必需 CI;只有 `PASS` 才能合并到 `main`;`FAIL` 修复后重验,`BLOCKED` 保持开放。 +5. 工程完成后读取发布契约,审计整个 Issue 的验收闭合、实施账目闭合和交付状态闭合。必须实际调用独立的新上下文子 Agent(子智能体)进行最终验收,调用前明确告知用户;它必须亲读 Issue/差异并直接验证,不得只依赖实施 Agent 摘要。页面任务必须由该子智能体直接复核交互与视觉需求;记录调用标识、目标版本、证据和返回结论,无法调用或未返回必需证据则 `BLOCKED`,不得由实施者自检替代。创建拉取请求并等待必需 CI;只有 `PASS` 才能合并到 `main`;`FAIL` 修复后重验,`BLOCKED` 保持开放。 6. 合并前保留高风险人工门:身份验证/授权、支付、破坏性数据、密钥/隐私/合规、生产或不可逆动作;自动部署生产的合并也属生产操作。不得弱化仓库保护。合并后读取远端默认分支和合并提交,确认 `main` 包含的任务差异就是独立验证过的版本,完成精确资源清理,再重新读取 Issue,确认完成审计三本账仍闭合后显式关闭;PR 只用 `Refs`,不自动关闭 Issue。 其他技能委派实施时,以其更窄交付边界为准;`scd-evolve` 试验不授权提交、推送、拉取请求或合并。直接 QuickDev 清理自己创建的资源;父 Execute 创建的通道资源由父清理,通道返回精确资源清单,清理未闭合不得关闭 Issue。 @@ -49,4 +49,4 @@ Issue 标题和正文都必须使用中文,代码标识、命令、路径、 GitHub Issue 始终是持久事实来源;确需恢复才使用 [current-task.md](assets/current-task.md) 创建 `.scd/tasks/current.md`,只保存恢复增量和一个下一行动,停止/压缩前更新,不暂存提交;合并后按清理所有权删除。 -自然交接只报告已合并结果/PR、直接验证、独立结论/Issue 状态及剩余未验证边界,不宣读流程。 +自然交接只报告已合并结果/PR、直接验证、独立结论/Issue 状态及剩余未验证边界,不宣读流程。必须明确说明独立验收子智能体是否实际调用、返回结论及证据引用;页面任务同时说明交互与视觉需求的验证结果,不得把工程测试通过写成 UI 验收通过。 diff --git a/skills/scd-quickdev/references/page-acceptance.md b/skills/scd-quickdev/references/page-acceptance.md index 6e33902..fc77cb6 100644 --- a/skills/scd-quickdev/references/page-acceptance.md +++ b/skills/scd-quickdev/references/page-acceptance.md @@ -25,6 +25,10 @@ 只打开应用、只观察首页、只运行组件测试或只生成截图都不能证明交互旅程完成。必需浏览器、运行环境、状态或视觉证据不可用时,记录具体缺口并返回 `BLOCKED`。 +页面自检结束后,必须实际调用独立的新上下文子智能体,按 [独立验收](release-contract.md#独立验收) 复核。调用前明确告知用户:“现在调用独立验收子智能体,通过真实浏览器对照需求验证页面交互和视觉结果。”子智能体必须亲读 Issue、精确差异及适用 UX/视觉参考,直接操作页面并逐项对照需求;实施者自检、已有截图或另一 Agent 的摘要不能替代它的浏览器复核。没有设计稿时,仍须对照 Issue 的可见结果,不得据此宣称未定义的视觉偏好已满足。 + +在同一 Issue 记录子智能体的实际调用标识、验收目标版本、各验收项的交互与视觉证据和 `PASS`、`FAIL` 或 `BLOCKED` 结论;交付报告明确说明实际调用及结果,并引用证据。无法调用子智能体、未收到返回结果或必需证据不足时,页面验收为 `BLOCKED`,不得合并或宣称 UI 已通过。 + UX 契约标记需要实现后最终视觉确认时,在独立验收前把设计视觉和实际页面按视觉 ID、状态和视口并排展示给用户。用户确认是该验收项的直接证据;普通页面任务不自动增加人工确认。 存在就绪 UX 交接时,同时依据三类权威实施和验证:UX 契约负责行为、状态与响应式规则,视觉 ID 对应的项目内视觉产物负责已标记视口的布局、层级、密度与外观,共享机器契约负责数据、操作、权限和错误语义。实现后把实际页面证据与视觉 ID 逐项比较,并记录允许差异。页面验收门由真实差异触发,不属于可选的“适用时”判断。 diff --git a/skills/scd-quickdev/references/release-contract.md b/skills/scd-quickdev/references/release-contract.md index edf55f3..f9c64c9 100644 --- a/skills/scd-quickdev/references/release-contract.md +++ b/skills/scd-quickdev/references/release-contract.md @@ -62,7 +62,11 @@ Agent 负责工程验收: ## 独立验收 -实施和工程检查后,启动一个独立的新上下文子 Agent 作为验收者。向它提供作为依据的 Issue、仓库位置和精确验收目标:已提交变更提供基准与目标引用,未提交变更提供提交前工作区状态。不要提供实施 Agent 的结论。验收者必须: +实施和工程检查后,启动一个独立的新上下文子 Agent 作为验收者。向它提供作为依据的 Issue、仓库位置和精确验收目标:已提交变更提供基准与目标引用,未提交变更提供提交前工作区状态。不要提供实施 Agent 的结论。 + +必须实际调用可用的子智能体工具,并在调用前向用户明确说明正在调用独立验收子智能体及其验证范围;不得只在计划或交付报告中声称委派。平台支持时使用不继承实施对话的新上下文模式。把实际调用标识、目标版本、返回结论和逐项证据引用写入同一 Issue;交付报告明确说明是否实际调用及其结果。无法调用、未收到结果或缺少必需证据时返回 `BLOCKED`,不得以父 Agent 或实施者自检代替独立验收,也不得合并。 + +验收者必须: 1. 阅读 Issue 验收项和适用仓库说明; 2. 检查真实 Issue 专属差异; diff --git a/tests/quickdev-contract.test.mjs b/tests/quickdev-contract.test.mjs index 8bce159..3565a81 100644 --- a/tests/quickdev-contract.test.mjs +++ b/tests/quickdev-contract.test.mjs @@ -293,6 +293,24 @@ test("quickdev makes browser acceptance mandatory for every real page change", ( assert.match(skill, /页面验收门由真实差异触发,不属于可选的“适用时”判断/); }); +test("quickdev requires an actual visible independent subagent invocation for page acceptance", () => { + const skill = read("skills/scd-quickdev/SKILL.md"); + const page = read("skills/scd-quickdev/references/page-acceptance.md"); + const release = read("skills/scd-quickdev/references/release-contract.md"); + + assert.match(skill, /必须实际调用独立的新上下文子 Agent/); + assert.match(skill, /调用前明确告知用户/); + assert.match(skill, /页面任务必须由该子智能体直接复核交互与视觉需求/); + assert.match(page, /必须实际调用独立的新上下文子智能体/); + assert.match(page, /实际调用标识、验收目标版本/); + assert.match(page, /交互与视觉证据/); + assert.match(page, /无法调用子智能体、未收到返回结果或必需证据不足[\s\S]*`BLOCKED`,不得合并/); + assert.match(release, /必须实际调用可用的子智能体工具/); + assert.match(release, /不继承实施对话的新上下文模式/); + assert.match(release, /不得以父 Agent 或实施者自检代替独立验收/); + assert.match(skill, /必须明确说明独立验收子智能体是否实际调用、返回结论及证据引用/); +}); + test("quickdev confirms the accepted merge on main before closing the Issue", () => { const skill = composeGuidance("skills/scd-quickdev/SKILL.md"); const issueContract = composeGuidance(