用途
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.tssrc/authoring/dev.tssrc/grading/generate-grader.tssrc/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 代理是可见的。为证明其能泛化到未见过的代理实现:
- 删除
guides/security/passkey-management/targets/devtools-times/grader.ts,运行devGuide('guides/security/passkey-management', { test: false, targets: ['devtools-times'] })。 - 确认校准通过(claude=100%、codex=100%、jetski=100%、zero-passrate=0%)且静态 AST linting(
src/core/grader-lint.ts)报告 0 违规。 - 使用新生成的 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
- 要求留出第四解补丁达到 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 分钟)为资料中给出的参考值,实际可能因环境而异。
- 留出第四解补丁需要自行准备,资料中未提供其具体内容。
- 资料未提供该工作流的收费、价格、平台支持范围等信息。