SuperAPI AI 工具集

dev-prompt-canary

测试与质量

查看项目

更新于 10-31 09:48

技能介绍

用途

dev-prompt-canary 是一套经验性验证(empirical canary)工作流,用于在修改 gd dev 的编写与评分提示词后,验证 LLM 实际生成的 task.md 和 grader.ts 文件是否遵守 project-evals 中的规则。

src/authoring/dev-prompts.test.ts 中的单元测试只能验证提示词模板中是否包含特定子串,无法捕捉 LLM 实际生成内容中的行为回归。因此,每当修改以下文件时,应运行此快速经验性 canary 工作流:

  • src/authoring/dev-prompts.ts
  • src/authoring/dev.ts
  • src/grading/generate-grader.ts
  • src/grading/template.grader.ts

主要能力

增量再生成机制(总计约 4 分钟)

从头运行 gd dev <guide> 每个指南约需 25 分钟,因为它会生成 3 个黄金解补丁、一个 zero-passrate.patch、task.md、grader.ts,并运行完整评估。

替代方案是利用 dev.ts 的增量文件存在性检查,在一次性 worktree 中运行:

  • 仅 task.md(8 个目标约 45 秒):保持现有补丁和 grader 不变。调用 extractGuideDescription + buildTargetTaskPrompt + runAgent 编写小型运行脚本,或仅删除 targets/<app>/task.md 后运行 devGuide(dir, { test: false, targets: [app] })。
  • 仅 grader.ts(每个目标约 2–3 分钟):保持 targets/<app>/patches/*-solution.patch、zero-passrate.patch 和 task.md 不变。仅删除 targets/<app>/grader.ts,然后运行 devGuide(dir, { test: false, targets: [app] }) 以再生成并校准 grader.ts。

使用方式

步骤 1:创建隔离的临时 worktree

切勿在活跃的功能 worktree 中修改 guides/。从候选提交创建临时 worktree:

git worktree add -B exp/canary-eval .worktrees/canary-eval HEAD
ln -s ../../node_modules .worktrees/canary-eval/node_modules
ln -s ../../.env .worktrees/canary-eval/.env

步骤 2:运行并行 canary 子代理(模型:"flash")

在 .worktrees/canary-eval 中启动 3 个并行子代理,覆盖以下 canary 目标。

实验 A:task.md 再生成矩阵(4 个指南 × 2 个应用)

在 daily-grind 和 devtools-times 上再生成 task.md,并将新旧版本与 project-evals 中的 task.md 规则进行 diff:

  • guides/ui-behaviors/directional-navigation-transitions — 测试次要 expectations.md 需求(prefers-reduced-motion)不会泄漏。
  • guides/built-in-ai/translator — 测试 guide.md frontmatter 描述中的设备端能力边界被保留,且不点名 window.Translator。
  • guides/html/html — 纪律指南 canary;测试特定 expectations.md 检查项(autofill、srcset、fetchpriority)不会泄漏。
  • guides/security/passkey-management — 测试 WebAuthn Signal API 方法名(signalAllAcceptedCredentials、signalUnknownCredential)不会被指定。

实验 B1:grader.ts 再生成 + 留出第四解压力测试

Canary:guides/security/passkey-management(devtools-times)

通过校准只能证明 grader.ts 通过了 3 个黄金补丁(claude、codex、jetski),而这些补丁在编写测试时对 grader 代理是可见的。为证明其能泛化到未见过的代理实现:

  1. 删除 guides/security/passkey-management/targets/devtools-times/grader.ts,运行 devGuide('guides/security/passkey-management', { test: false, targets: ['devtools-times'] })。
  2. 确认校准通过(claude=100%、codex=100%、jetski=100%、zero-passrate=0%)且静态 AST linting(src/core/grader-lint.ts)报告 0 违规。
  3. 使用新生成的 grader.ts 对 devtools-times 上的留出第四解补丁运行 runPlaywright,该补丁满足所有 expectations.md 需求,但使用 3 个黄金补丁中不存在的结构性变体:
    • 未见的辅助/处理函数名(reconcilePasskeyVault、revokePasskeyItem)
    • 通过局部变量传递选项并使用 TypeScript 类型断言(payload as any、satisfies)
    • 跨文件辅助包装函数(Component.tsx -> passkey-client.ts -> webauthn-signals.ts)
    • 使用 Promise .catch() 错误处理而非 try/catch
  4. 要求留出第四解补丁达到 100% 通过率。

实验 B2:空泛守卫与条件期望 canary

删除 targets/devtools-times/grader.ts,对以下指南运行 devGuide(dir, { test: false, targets: ['devtools-times'] }):

  • guides/built-in-ai/translator(devtools-times)— 验证消除 if (files.length === 0) { expect(false).toBe(true); return; }。
  • guides/security/local-network-access(devtools-times)— 存在条件 <iframe> 期望,其中 codex-solution.patch 有 0 个 iframe(totalIframes === 0);验证 grader 省略不可测试的条件检查,而非编写空泛的 items.length === 0 || ... 守卫。

步骤 3:清理临时 worktree

git worktree remove --force .worktrees/canary-eval
git branch -D exp/canary-eval

适用场景

适用于修改 gd dev 编写与评分提示词相关文件后的回归验证,尤其是需要确认 LLM 生成的 task.md 和 grader.ts 是否遵守 project-evals 规则、是否泛化到未见过的代理实现、以及是否避免空泛守卫和条件期望的场景。

限制

  • 该工作流依赖 gd dev、devGuide、runPlaywright、src/core/grader-lint.ts 等内部工具与脚本,具体可用性取决于项目环境。
  • 增量再生成机制的具体耗时(如 task.md 约 45 秒、grader.ts 约 2–3 分钟)为资料中给出的参考值,实际可能因环境而异。
  • 留出第四解补丁需要自行准备,资料中未提供其具体内容。
  • 资料未提供该工作流的收费、价格、平台支持范围等信息。