gstack 深度分析报告

从 Garry Tan 的 AI 工程工作流中,提炼 Skill 开发策略与最佳实践

Source: github.com/garrytan/gstack  |  分析日期: 2026-03-24  |  27+ Skills  |  3 AI Engines

1项目概述与定位

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)

2团队组织架构

gstack 的核心设计思想是 Conway's Law 的逆向应用:先设计理想的工程团队结构,再将每个角色实现为 Skill。

角色矩阵

阶段角色Skill职责
THINKProduct/Founder/office-hours重新定义问题,挑战前提,生成设计文档
PLANCEO/Founder/plan-ceo-review4 种范围模式 (扩展/选择性扩展/保持/收缩)
Eng Manager/plan-eng-review锁定架构、数据流、边界条件、测试计划
Senior Designer/plan-design-review0-10 评分 + 交互式修复
BUILDEngineer(直接实现)编写代码 + 原子提交
REVIEWStaff Engineer/reviewPre-landing 审查 + 自动修复
Debugger/investigate根因分析,最多 3 次失败修复
Security Officer/csoOWASP Top 10 + STRIDE 威胁模型
Cross-Model/codex独立 Codex 代码审查 (第二意见)
TESTQA Lead/qa真实浏览器测试 + Bug 修复 + 回归
Design QA/design-review视觉审计 + 原子修复循环
SHIPRelease Eng/ship完全自动化:合并→测试→版本→PR
Release Eng/land-and-deploy合并 PR → 部署 → 金丝雀验证
SRE/canary部署后持续监控
REFLECTEng Manager/retro跨项目周回顾

安全守卫 (正交于主流程)

Skill机制功能
/carefulPreToolUse Hook拦截危险命令 (rm -rf, DROP TABLE, force-push)
/freezePreToolUse Hook锁定编辑范围到指定目录
/guard组合careful + freeze 联合防护
/unfreezeReset解除编辑限制
组织设计的关键洞察:每个 Skill 对应一个人类角色而非技术功能。这不是 "git skill" + "test skill",而是 "CEO Review" + "QA Lead"。角色隐含了决策标准、优先级判断、沟通风格。这比功能划分更有效,因为 LLM 对"扮演角色"的响应远优于"执行检查清单"。

3工作流 Pipeline 设计

Think
/office-hours
Plan
/plan-*-review
Build
Claude Code
Review
/review /cso
Test
/qa
Ship
/ship
Reflect
/retro

编排模式

A. 手动调用 (主模式)

用户显式调用每个 skill。每个 skill 独立运行,但会读取前置 skill 的输出(如果存在)。

B. 自动编排 (/autoplan)

自动运行 CEO Review → Design Review → Eng Review 的完整规划管线。

C. 依赖声明 (benefits-from)

# plan-ceo-review/SKILL.md.tmpl YAML frontmatter
benefits-from: [office-hours]

这是软依赖——不强制,但 skill 会优雅降级(跳过缺失的上游输出)。

D. 决策门 (Decision Gates)

关键门控点
  • Review Gate: /ship 检查 review dashboard,如有 ASK 项则阻塞
  • Version Bump: MICRO/PATCH 自动选择,MINOR/MAJOR 需用户确认
  • Scope Mode: /plan-ceo-review 提供 4 种模式供用户选择
  • Test Triage: 测试失败≠阻塞,区分 pre-existing / regression / environmental / flaky

多引擎策略

同一套 .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 配置适配等。

4Skill 亮点分析

4.1 Plan-CEO-Review: 认知模式驱动

15 条 CEO 认知直觉 (Prime Directives)

不是检查清单,而是思维模式注入

  • "Zero silent failures — 每个失败模式都可见"
  • "每个错误有名字和可捕获异常"
  • "数据流追踪: happy path + 3 shadow paths"
  • "可观测性是范围,不是善后"
  • "图表是强制的 (ASCII art)"
  • "推迟的工作写入 TODOS.md"

配合 4 种范围模式 (Expansion / Selective / Hold / Reduction) 让用户选择策略方向。

4.2 Review: 结构化审查仪表盘

Pre-Landing Review Dashboard

/review 生成一个统一的审查仪表盘,包含:

  • 范围偏移检测 (文件变更 vs. 声明意图)
  • SQL 安全性、LLM 信任边界、条件副作用、错误路径
  • 自动修复明显问题 (死代码, N+1 查询, 过时注释)
  • 新鲜度检测 (过期则标记为 stale)

这个 dashboard 被 /ship 消费,作为发布的质量门控。

4.3 QA: 真实浏览器 + 植入 Bug 评估

Browser-in-the-Loop QA

不是模拟测试,而是打开真正的 Chromium 浏览器:

  • 持久化浏览器守护进程 (~100ms/命令,首次 ~3s)
  • Cookie 持久化、标签页保持、30 分钟空闲超时
  • diff-aware 模式:从 git diff 自动检测需要测试的页面
  • 找到 bug → 原子修复 → 生成回归测试 → 重新验证

评估体系:用植入已知 Bug 的测试页面来量化 QA skill 的检测率。

4.4 CSO (Security Officer): 零噪声安全审计

高信噪比安全审计
  • OWASP Top 10 + STRIDE 威胁模型
  • 17 条假阳性排除规则 (去噪)
  • 8/10+ 置信度门槛
  • 每个发现必须包含具体的利用场景

4.5 Ship: "Do It, Don't Ask"

完全自动化的一键发布

/ship 是最长的 skill (~1504 行),执行完整发布流程:

合并 base → 运行测试 → 检查覆盖率(自动补全) → 版本号 →
CHANGELOG → Review Gate → 原子提交 → Push → 创建 PR(嵌入所有仪表盘)

设计哲学:"/ship 意味着执行,不要再问"。只有 MINOR/MAJOR 版本跳升需要确认。

4.6 Investigate: 受限调试

根因优先,限制修复
  • 自动 scope-lock 到受影响的目录 (使用 freeze 机制)
  • 必须先调查再修复,最多 3 次失败修复尝试
  • "trace data flow, test hypotheses" 而非盲目修改

5模板系统与代码生成

为什么需要模板?

手工维护 SKILL.md 会腐化。Browse 命令更新了,但 QA skill 里的命令参考还是旧的。模板系统让所有 skill 共享同一个真实来源,构建时自动生成最终的 SKILL.md。

生成管线

.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.tsQA 方法论 (共享给 qa, qa-only)
{{REVIEW_DASHBOARD}}review.tsReview 仪表盘逻辑 (共享给 review, ship)
{{TEST_BOOTSTRAP}}testing.ts自动检测测试框架

Preamble 分层系统

Tier内容适用 Skill
1更新检查 + 会话跟踪browse, root
2+ 仓库模式检测 + 测试分诊investigate, retro, canary
3+ 决策框架 + "Search Before Building"autoplan, reviews, codex
4+ 完整自治指导 + 全量遥测ship, land-and-deploy
Preamble Tier 是认知负载管理。轻量级的 browse skill 不需要加载 350 行的上下文。而 ship 这种高度自治的 skill 需要最完整的指导。按需加载,避免 token 浪费。

6测试与评估体系

三层测试金字塔

层级成本时间内容
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)

智能测试选择 (Diff-Based)

// 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 评估 (Outcome Eval)

QA Skill 的量化评估

提供包含已知 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

评估结果持久化与对比

CI/CD 集成

GitHub Actions: PR 触发 → 12 并行 job → 聚合结果 → PR Comment 汇总表

7Skill 书写范式总结

从 gstack 27+ skills 中提炼出的可复用范式

范式 1: YAML Frontmatter 标准结构

---
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
---

范式 2: 角色 Persona 而非检查清单

Bad vs Good
// 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.

范式 3: 自包含 Bash 块

每个代码块可独立重放
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 中断后可以从任意步骤恢复。

范式 4: 自然语言决策树

// 不是 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."

范式 5: 完成状态协议

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

范式 6: 安全边界 — Hook vs 内联建议

场景Claude CodeCodex/Gemini
危险命令拦截PreToolUse Hook (硬拦截)内联建议文本 (软提醒)
编辑范围锁定/freeze Hook 拦截 Edit/Write散文说明"不要编辑此目录之外"

范式 7: 渐进式升级而非全有全无

// 不是: "确保 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."

范式 8: 遥测即文化

首次运行时注入的理念

"Boil the Lake" — AI 辅助开发使完整性的边际成本趋近于零。如果完整实现比走捷径多 70 行代码,那就做完整实现。

"Search Before Building" — 三层知识:已验证的标准模式 → 当前最佳实践 → 第一性原理。在接受常规做法前先质疑。

8Skill 开发策略提炼

以下是从 gstack 实践中沉淀的完整 Skill 开发策略框架

策略 1: 角色优先,功能其次

不要想"我需要一个代码审查 skill",要想"我需要一个 Staff Engineer 角色"。

角色包含:决策标准 (什么该 block, 什么可以放过)、优先级排序 (安全 > 正确 > 性能)、沟通风格 (直接、有证据)、自我限制 (最多 3 次修复尝试)。

How to apply: 写 Skill 的第一步是定义 persona,而非列 checklist。问自己:"如果我雇一个真人做这件事,他的 title 是什么?他会怎么判断优先级?"

策略 2: 模板化一切共享知识

一个事实应该只有一个来源。

Browse 命令定义在 commands.ts,所有引用浏览器命令的 skill 通过 {{COMMAND_REFERENCE}} 自动获取。这消除了跨 skill 的文档腐化。

How to apply:

  • 将共享方法论抽取为 resolver (如 QA_METHODOLOGY, DESIGN_METHODOLOGY)
  • 将工具文档从源码自动生成 (如从 TS 类型定义到 Markdown 表格)
  • .tmpl + 构建时生成替代手工维护

策略 3: 按认知负载分层 (Preamble Tiers)

不是所有 skill 都需要同样的上下文量。

轻量级工具 (如 browse) 只需 50 行 preamble。高度自治的 skill (如 ship) 需要 350 行完整指导。过多上下文会稀释关键指令。

How to apply: 定义 3-4 个 tier,每个 tier 增量添加内容。Skill 声明自己的 tier,构建系统自动组装对应的 preamble。

策略 4: 可恢复的步骤设计

假设 Agent 会在任意步骤中断。

每个 bash 块自包含 (不依赖前面块的变量)。每个步骤前的散文重新陈述所需上下文。状态持久化到文件 (不是内存)。

How to apply:

  • 步骤之间通过文件传递状态 (如 ~/.gstack/projects/$SLUG/)
  • 每个代码块可以独立运行
  • 关键状态使用原子写入 (write .tmp → rename)

策略 5: 软依赖与优雅降级

benefits-from 而非 requires

如果 /plan-ceo-review 的输出存在,/plan-eng-review 会消费它。如果不存在,跳过相关部分继续工作。这让用户可以从任意环节进入,而非必须从头开始。

How to apply: 每个 skill 开头检测上游输出是否存在,不存在时提供默认行为。永远不要因为缺少可选输入而失败。

策略 6: 用测试衡量 Skill 质量

Skill 是代码,代码需要测试。

gstack 的三层测试金字塔:静态验证 (文档一致性) → E2E (真实 Agent 执行) → LLM Judge (质量评分)。配合 diff-based 选择避免浪费。

How to apply:

  • 为每个 skill 编写至少一个 E2E 测试场景
  • 用 LLM-as-Judge 评估 skill 输出的 clarity/completeness/actionability
  • 对 QA 类 skill 使用植入 bug 的 ground truth 评估
  • 跟踪每次运行的成本、耗时、token 用量

策略 7: 安全边界的平台适配

不同平台需要不同的安全机制。

Claude Code 支持 PreToolUse Hook (程序化拦截)。其他平台只能用内联文本建议。跨平台 skill 需要两套安全策略:硬拦截 (支持 Hook 的平台) 和软建议 (纯文本平台)。

策略 8: "Do It, Don't Ask" 原则

Skill 的默认行为应是执行,不是询问。

gstack 的 /ship 哲学:"调用 /ship 意味着你已经决定要发布。不要再问确认。" 只在真正需要人类判断的决策点 (如 MAJOR 版本跳升) 才暂停。

How to apply: 明确区分"需要人类判断的决策点"和"可以自动化的执行步骤"。后者不应该有确认弹窗。用 AskUserQuestion 只问真正无法自动判断的问题。

策略 9: 评估驱动的迭代

每次修改 Skill 都要有评估数据支撑。

gstack 的 eval:compare 工具让每次 skill 修改都可以量化对比:成本变化、耗时变化、成功率变化。这将 skill 开发从"凭感觉调 prompt"变为"数据驱动的优化"。

How to apply:

  • 在修改 skill 前运行一次 baseline eval
  • 修改后再运行一次,使用 eval:compare 对比
  • 关注: 成功率 ≥ baseline, 成本 ≤ 120% baseline, 无新的超时

策略 10: 文化注入 (Ethos)

最有效的 Skill 不仅仅传递指令,还传递价值观。

gstack 通过 preamble 注入两个核心理念:

  • Boil the Lake: AI 辅助下,完整实现的边际成本极低。不要走捷径。
  • Search Before Building: 三层知识 (标准模式 → 最佳实践 → 第一性原理)。质疑"显然正确"的做法。

这些理念影响 Agent 的所有决策,比任何具体指令都更有力。


Quick Reference: Skill 开发 Checklist

  1. 定义角色 Persona (title, 决策标准, 优先级, 自我限制)
  2. 选择 Preamble Tier (1-4,匹配认知负载)
  3. 声明工具白名单 (allowed-tools)
  4. 声明软依赖 (benefits-from)
  5. 编写步骤 (自包含 bash 块 + 散文上下文重述)
  6. 定义决策点 (哪些步骤需要 AskUserQuestion)
  7. 定义完成状态 (DONE / DONE_WITH_CONCERNS / BLOCKED / NEEDS_CONTEXT)
  8. 抽取共享知识为模板占位符
  9. 适配安全边界 (Hook 平台 vs 纯文本平台)
  10. 编写 E2E 测试 + 定义 touchfiles
  11. 运行 eval baseline → 修改 → eval compare