从 Garry Tan 的 AI 工程工作流中,提炼 Skill 开发策略与最佳实践
gstack 是 Y Combinator CEO Garry Tan 构建的一个 AI 工程团队操作系统。它不是简单的 prompt 集合,而是一个完整的、多角色、多引擎的软件开发生命周期自动化框架。
将一个完整的工程团队 (CEO, Eng Manager, Designer, QA Lead, Security Officer, Release Engineer, SRE) 的职责,映射为一组可组合、可测试、跨引擎的 AI Skills。
Human + gstack = Engineering Team
| 维度 | 数据 |
|---|---|
| Skills 数量 | 27+ 个独立 skill |
| 文件总数 | ~180 (不含 .git) |
| 测试体系 | 3 层金字塔 (静态/E2E/LLM Judge) |
| E2E 成本 | ~$3.85/次完整运行 |
| 支持引擎 | 3 (Claude, Codex, Gemini) |
gstack 的核心设计思想是 Conway's Law 的逆向应用:先设计理想的工程团队结构,再将每个角色实现为 Skill。
| 阶段 | 角色 | Skill | 职责 |
|---|---|---|---|
| THINK | Product/Founder | /office-hours | 重新定义问题,挑战前提,生成设计文档 |
| PLAN | CEO/Founder | /plan-ceo-review | 4 种范围模式 (扩展/选择性扩展/保持/收缩) |
| Eng Manager | /plan-eng-review | 锁定架构、数据流、边界条件、测试计划 | |
| Senior Designer | /plan-design-review | 0-10 评分 + 交互式修复 | |
| BUILD | Engineer | (直接实现) | 编写代码 + 原子提交 |
| REVIEW | Staff Engineer | /review | Pre-landing 审查 + 自动修复 |
| Debugger | /investigate | 根因分析,最多 3 次失败修复 | |
| Security Officer | /cso | OWASP Top 10 + STRIDE 威胁模型 | |
| Cross-Model | /codex | 独立 Codex 代码审查 (第二意见) | |
| TEST | QA Lead | /qa | 真实浏览器测试 + Bug 修复 + 回归 |
| Design QA | /design-review | 视觉审计 + 原子修复循环 | |
| SHIP | Release Eng | /ship | 完全自动化:合并→测试→版本→PR |
| Release Eng | /land-and-deploy | 合并 PR → 部署 → 金丝雀验证 | |
| SRE | /canary | 部署后持续监控 | |
| REFLECT | Eng Manager | /retro | 跨项目周回顾 |
| Skill | 机制 | 功能 |
|---|---|---|
/careful | PreToolUse Hook | 拦截危险命令 (rm -rf, DROP TABLE, force-push) |
/freeze | PreToolUse Hook | 锁定编辑范围到指定目录 |
/guard | 组合 | careful + freeze 联合防护 |
/unfreeze | Reset | 解除编辑限制 |
用户显式调用每个 skill。每个 skill 独立运行,但会读取前置 skill 的输出(如果存在)。
/autoplan)自动运行 CEO Review → Design Review → Eng Review 的完整规划管线。
benefits-from)# plan-ceo-review/SKILL.md.tmpl YAML frontmatter
benefits-from: [office-hours]
这是软依赖——不强制,但 skill 会优雅降级(跳过缺失的上游输出)。
/ship 检查 review dashboard,如有 ASK 项则阻塞/plan-ceo-review 提供 4 种模式供用户选择同一套 .tmpl 源文件,通过构建时代码生成支持 3 个 AI 引擎:
# Claude Code 输出
bun run gen:skill-docs → SKILL.md (Claude 原生)
# Codex 输出
bun run gen:skill-docs --host codex → .agents/skills/gstack-*/SKILL.md
+ agents/openai.yaml
转换规则包括路径替换、Hook 转内联建议文本、YAML 配置适配等。
不是检查清单,而是思维模式注入:
配合 4 种范围模式 (Expansion / Selective / Hold / Reduction) 让用户选择策略方向。
/review 生成一个统一的审查仪表盘,包含:
这个 dashboard 被 /ship 消费,作为发布的质量门控。
不是模拟测试,而是打开真正的 Chromium 浏览器:
评估体系:用植入已知 Bug 的测试页面来量化 QA skill 的检测率。
/ship 是最长的 skill (~1504 行),执行完整发布流程:
合并 base → 运行测试 → 检查覆盖率(自动补全) → 版本号 →
CHANGELOG → Review Gate → 原子提交 → Push → 创建 PR(嵌入所有仪表盘)
设计哲学:"/ship 意味着执行,不要再问"。只有 MINOR/MAJOR 版本跳升需要确认。
.tmpl 文件 + 源代码元数据
↓
gen-skill-docs.ts (解析 {{PLACEHOLDER}})
↓
resolvers/ (45+ 个解析器)
↓
输出: SKILL.md (Claude) + .agents/skills/ (Codex)
| 占位符 | 来源 | 用途 |
|---|---|---|
{{PREAMBLE}} | preamble.ts | 会话跟踪、遥测、更新检查、"Boil the Lake" 教程 |
{{COMMAND_REFERENCE}} | browse/src/commands.ts | 浏览器命令文档 (从源码自动生成) |
{{SNAPSHOT_FLAGS}} | browse/src/snapshot.ts | 截图选项文档 |
{{BASE_BRANCH_DETECT}} | utility.ts | 自动检测 main/master 分支 |
{{QA_METHODOLOGY}} | testing.ts | QA 方法论 (共享给 qa, qa-only) |
{{REVIEW_DASHBOARD}} | review.ts | Review 仪表盘逻辑 (共享给 review, ship) |
{{TEST_BOOTSTRAP}} | testing.ts | 自动检测测试框架 |
| Tier | 内容 | 适用 Skill |
|---|---|---|
| 1 | 更新检查 + 会话跟踪 | browse, root |
| 2 | + 仓库模式检测 + 测试分诊 | investigate, retro, canary |
| 3 | + 决策框架 + "Search Before Building" | autoplan, reviews, codex |
| 4 | + 完整自治指导 + 全量遥测 | ship, land-and-deploy |
| 层级 | 成本 | 时间 | 内容 |
|---|---|---|---|
| Tier 1 — 静态验证 | 免费 | <2s | 解析 $B 命令 → 与命令注册表对比;SKILL.md 新鲜度检查;Frontmatter 验证 |
| Tier 2 — E2E | ~$3.85 | ~20min | Spawn claude -p 子进程 → NDJSON 流式输出 → 解析工具调用 → 错误检测 |
| Tier 3 — LLM Judge | ~$0.15 | ~30s | Claude Sonnet 对生成文档评分: Clarity / Completeness / Actionability (≥4/5) |
// touchfiles.ts
E2E_TOUCHFILES = {
'browse-basic': ['browse/src/**'],
'qa-b6-static': ['qa/**', 'browse/src/**', 'test/fixtures/qa-eval.html'],
'journey-*': ['*/SKILL.md.tmpl', 'scripts/gen-skill-docs.ts'],
}
// 只运行受影响的测试
git diff main...HEAD --name-only → match against touchfiles → run selected tests
提供包含已知 Bug 的测试页面 + Ground Truth JSON:
{
"total_bugs": 8,
"minimum_detection": 5,
"max_false_positives": 2,
"bugs": [{"id": "b1", "category": "layout", "severity": "high", ...}]
}
LLM Judge 对比 QA 报告 vs Ground Truth,输出: detection_rate, false_positives, evidence_quality
_partial-e2e.json (原子写入, 可中断恢复){version}-{branch}-{tier}-{timestamp}.jsonbun run eval:compare 自动比较两次运行,输出自然语言评论bun run eval:watch 心跳文件 + 过期告警GitHub Actions: PR 触发 → 12 并行 job → 聚合结果 → PR Comment 汇总表
从 gstack 27+ skills 中提炼出的可复用范式:
---
name: skill-name
preamble-tier: 1-4 # 认知负载等级
version: 1.0.0
description: One-line desc
allowed-tools: # 工具白名单
- Bash
- Read
- Edit
- Agent
benefits-from: [office-hours] # 软依赖 (可选)
hooks: # 安全守卫 (可选)
pre-tool-use:
- type: regex
pattern: "rm -rf"
action: block
---
// Bad: 检查清单
- [ ] 检查 SQL 注入
- [ ] 检查 XSS
- [ ] 检查权限
// Good: 角色注入
You are the Chief Security Officer. Your job is to find vulnerabilities
that would make the front page of Hacker News. Every finding must include
a concrete exploit scenario. You have 17 false-positive exclusion rules
and an 8/10 confidence threshold. Zero noise.
Step 3: Check review gate
Read the review dashboard:
```bash
cat ~/.gstack/projects/$SLUG/review-dashboard.json
```
If the review status is CLEAR, proceed to Step 4.
If the review has ASK items, use AskUserQuestion to present each item.
Step 4: Run tests
Re-read the test framework detection from Step 1 output:
```bash
# Self-contained: re-detect, don't rely on bash variables from Step 1
if [ -f package.json ]; then ... fi
```
原则:每个 bash 块不依赖其他块的变量。中间的散文重新陈述上下文。这样 Agent 中断后可以从任意步骤恢复。
// 不是 if/else 嵌套:
if (testsPass && reviewClear && !hasAskItems) { ... }
// 而是散文式决策:
"If tests pass, proceed to version bump.
If tests fail, triage:
- Pre-existing failure (existed before this branch): note in PR, don't block.
- Regression (introduced by this branch): fix before shipping.
- Environmental (CI-specific): retry once, then note.
- Flaky (intermittent): retry once, note if still fails."
End every skill invocation with one of:
DONE — Skill completed successfully
DONE_WITH_CONCERNS — Completed but flagged issues
BLOCKED — Cannot proceed, needs user input
NEEDS_CONTEXT — Insufficient information to proceed
| 场景 | Claude Code | Codex/Gemini |
|---|---|---|
| 危险命令拦截 | PreToolUse Hook (硬拦截) | 内联建议文本 (软提醒) |
| 编辑范围锁定 | /freeze Hook 拦截 Edit/Write | 散文说明"不要编辑此目录之外" |
// 不是: "确保 100% 覆盖率否则失败"
// 而是:
"Step 3: Check test coverage.
If coverage is below threshold, auto-generate tests for uncovered paths.
Commit the new tests as a separate atomic commit.
If auto-generation fails, note the gap in the PR body."
"Boil the Lake" — AI 辅助开发使完整性的边际成本趋近于零。如果完整实现比走捷径多 70 行代码,那就做完整实现。
"Search Before Building" — 三层知识:已验证的标准模式 → 当前最佳实践 → 第一性原理。在接受常规做法前先质疑。
以下是从 gstack 实践中沉淀的完整 Skill 开发策略框架:
不要想"我需要一个代码审查 skill",要想"我需要一个 Staff Engineer 角色"。
角色包含:决策标准 (什么该 block, 什么可以放过)、优先级排序 (安全 > 正确 > 性能)、沟通风格 (直接、有证据)、自我限制 (最多 3 次修复尝试)。
How to apply: 写 Skill 的第一步是定义 persona,而非列 checklist。问自己:"如果我雇一个真人做这件事,他的 title 是什么?他会怎么判断优先级?"
一个事实应该只有一个来源。
Browse 命令定义在 commands.ts,所有引用浏览器命令的 skill 通过 {{COMMAND_REFERENCE}} 自动获取。这消除了跨 skill 的文档腐化。
How to apply:
QA_METHODOLOGY, DESIGN_METHODOLOGY).tmpl + 构建时生成替代手工维护不是所有 skill 都需要同样的上下文量。
轻量级工具 (如 browse) 只需 50 行 preamble。高度自治的 skill (如 ship) 需要 350 行完整指导。过多上下文会稀释关键指令。
How to apply: 定义 3-4 个 tier,每个 tier 增量添加内容。Skill 声明自己的 tier,构建系统自动组装对应的 preamble。
假设 Agent 会在任意步骤中断。
每个 bash 块自包含 (不依赖前面块的变量)。每个步骤前的散文重新陈述所需上下文。状态持久化到文件 (不是内存)。
How to apply:
~/.gstack/projects/$SLUG/)benefits-from 而非 requires。
如果 /plan-ceo-review 的输出存在,/plan-eng-review 会消费它。如果不存在,跳过相关部分继续工作。这让用户可以从任意环节进入,而非必须从头开始。
How to apply: 每个 skill 开头检测上游输出是否存在,不存在时提供默认行为。永远不要因为缺少可选输入而失败。
Skill 是代码,代码需要测试。
gstack 的三层测试金字塔:静态验证 (文档一致性) → E2E (真实 Agent 执行) → LLM Judge (质量评分)。配合 diff-based 选择避免浪费。
How to apply:
不同平台需要不同的安全机制。
Claude Code 支持 PreToolUse Hook (程序化拦截)。其他平台只能用内联文本建议。跨平台 skill 需要两套安全策略:硬拦截 (支持 Hook 的平台) 和软建议 (纯文本平台)。
Skill 的默认行为应是执行,不是询问。
gstack 的 /ship 哲学:"调用 /ship 意味着你已经决定要发布。不要再问确认。" 只在真正需要人类判断的决策点 (如 MAJOR 版本跳升) 才暂停。
How to apply: 明确区分"需要人类判断的决策点"和"可以自动化的执行步骤"。后者不应该有确认弹窗。用 AskUserQuestion 只问真正无法自动判断的问题。
每次修改 Skill 都要有评估数据支撑。
gstack 的 eval:compare 工具让每次 skill 修改都可以量化对比:成本变化、耗时变化、成功率变化。这将 skill 开发从"凭感觉调 prompt"变为"数据驱动的优化"。
How to apply:
eval:compare 对比最有效的 Skill 不仅仅传递指令,还传递价值观。
gstack 通过 preamble 注入两个核心理念:
这些理念影响 Agent 的所有决策,比任何具体指令都更有力。
allowed-tools)benefits-from)AskUserQuestion)