一只阿木木

AI Sprint 管理:我如何用 Obsidian + LLM 实现自动化复盘

副标题:工程团队每年花500小时在站会上——我用一套系统把这个数字砍掉了一半,同时让复盘质量提高了三倍

引子

工程团队每年在站会上花费 500 多个小时。

我第一次看到这个数字时,觉得夸张。

然后我自己算了一下:

8人团队 × 每天15分钟站会 × 每年250个工作日 = 500小时/年。

这还没算每两周一次的 Sprint Planning(2小时)、Sprint Review(1小时)、Retrospective(1.5小时)。

加上这些:每年接近700小时,团队在 Scrum 仪式上消耗掉了。

对于一个 AI 系统部署团队来说,这是巨大的浪费——不是因为这些仪式没有价值,而是因为大部分时间花在了「汇报」而不是「思考」上。

汇报是信息搬运,思考才是价值创造。

这篇文章,是我花了三个月把这两件事彻底拆开之后的方法论记录。

一、先诊断:传统 Scrum 的三个结构性缺陷

在讲解决方案之前,我要先说清楚我们在解决什么问题。

走进2026年任何一个项目管理会议,演讲主题看起来大同小异:AI 项目助手的 Demo、声称 PM 工作将在2030年前大部分自动化的数字,以及关于项目经理是否还会存在的圆桌讨论。浏览 PM 软件厂商的网站,首页的主角几乎永远是「AI 驱动的」某某功能。然后你周一回到自己的桌子前,你还是有一份状态报告要写、一个利益相关方要在午饭前要一页纸摘要,以及三个昨晚升级的风险。会议上的 AI Demo 似乎一件都帮不了你。这种落差,才是真正值得讨论的故事。

在我实际操作 AI Sprint 管理的过程中,我识别出了三个传统 Scrum 的结构性缺陷:

缺陷1:信息收集耗尽会议时间

每天的站会:「昨天做了什么、今天做什么、有没有 blocker」——三个问题,8个人,每人2分钟,15分钟过去了。

但这15分钟里,真正有价值的对话不超过3分钟——通常是某个 blocker 的讨论。其余时间是纯信息广播,不是协作思考。

缺陷2:复盘模式不被记忆,历史重复

跨 Sprint 的模式检测是更有价值的应用。 但传统复盘是这样的:大家写便利贴,贴到「好的/可以改进的/行动项」三列,讨论一小时,结束。

行动项写在某个 Confluence 页面上,两周后没有人记得检查。

下个 Sprint,同样的问题再次出现。

缺陷3:估点依赖记忆,不依赖数据

完全自动化的估点——由 AI 在没有团队输入的情况下分配故事点——仍然产生不可靠的结果。软件估算依赖于难以在 ticket 描述中捕获的上下文:团队对代码库的熟悉程度、即将到来的假期、特定区域的技术债。AI 无法考虑所有这些。

但是,AI 可以提供数据基础,让估点讨论更有依据:这类任务上次花了多少时间?历史上哪种 ticket 类型最容易被低估?

这三个缺陷指向同一个解决思路:让 AI 承担信息收集和模式识别,把人类的时间留给真正需要判断的决策。

二、架构设计:「AI 助理 + 人类判官」系统

AI 处理数据:总结、模式匹配、标记异常。Scrum Master 处理人:辅导、引导、解除组织障碍。这是不同的技能集合。

这句话是我整套系统的设计基础。

text

数据层(AI 全权负责)            判断层(人类全权负责)
│                               │
▼                               ▼
┌──────────────────┐          ┌──────────────────┐
│ 每日进展汇总      │          │ Blocker 解决方案  │
│ Ticket 状态追踪  │          │ 优先级调整决策    │
│ 跨 Sprint 模式   │    →     │ 技术债取舍判断    │
│ 速度趋势分析      │          │ 团队健康度感知    │
│ 风险信号检测      │          │ 利益相关方沟通    │
└──────────────────┘          └──────────────────┘
LLM 完成                    人类不可替代

具体落地,我的系统由四个模块组成:

text

Obsidian Vault(知识中枢)
│
├── Sprint Notes/        ← Sprint 档案库
│   ├── sprint-XX/
│   │   ├── planning.md
│   │   ├── daily-YYYY-MM-DD.md(每日站会记录)
│   │   ├── retrospective.md
│   │   └── velocity.md
│   └── sprint-patterns.md  ← 跨 Sprint 模式库
│
├── Templates/
│   ├── daily-standup.md
│   ├── sprint-planning.md
│   └── retrospective.md
│
└── AI-sessions/          ← AI 执行日志

三、模块一:自动化每日站会

传统做法是每天8:30开15分钟站会,每人口头汇报。

我的做法是:站会前5分钟,AI 自动生成「昨日进展摘要」;站会缩短到5分钟,只讨论 blockers。

第一步:Jira + GitHub 数据拉取

Python

# daily_standup_prep.py
# 每天早上8:25自动运行(cron: 25 8 * * 1-5)
import subprocess
from datetime import datetime, timedelta
from anthropic import Anthropic
client = Anthropic()
def fetch_jira_activity(project_key: str, since_hours: int = 24) -> str:
"""
从 Jira 拉取过去24小时的 ticket 变更
生产环境用真实的 Jira API,这里用 CLI 模拟
"""
result = subprocess.run(
[
"jira", "issue", "list",
"--project", project_key,
"--updated", f"-{since_hours}h",
"--output", "json"
],
capture_output=True, text=True
)
return result.stdout
def fetch_github_prs(repo: str, since_hours: int = 24) -> str:
"""拉取过去24小时的 PR 活动"""
result = subprocess.run(
[
"gh", "pr", "list",
"--repo", repo,
"--state", "all",
"--json", "title,state,author,updatedAt,url",
"--limit", "20"
],
capture_output=True, text=True
)
return result.stdout
def generate_standup_brief(
jira_data: str,
github_data: str,
sprint_context: str,
vault_path: str
) -> str:
"""
用 LLM 生成站会简报
关键:喂入 Sprint 上下文(来自 Obsidian Vault)
"""
# 读取当前 Sprint 目标和上下文(File over App!)
with open(f"{vault_path}/Sprint Notes/current-sprint.md", "r") as f:
sprint_goals = f.read()
# 读取昨天的站会记录(连续性上下文)
yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
try:
with open(
f"{vault_path}/Sprint Notes/"
f"sprint-current/daily-{yesterday}.md", "r"
) as f:
yesterday_log = f.read()
except FileNotFoundError:
yesterday_log = "无昨日记录"
response = client.messages.create(
model="claude-haiku-4-5",   # 每日任务用小模型节省成本
max_tokens=1500,
system="""你是一个 Scrum 团队的 AI 助理。
你的任务:从数据中提取关键信息,生成简洁的站会简报。
格式要求:
- 按团队成员分组(从 ticket 的 assignee 推断)
- 用一句话描述每人的进展
- 标记出所有 blockers(用 🚨 符号)
- 标记出即将 delay 的 tickets(用 ⚠️ 符号)
- 总字数不超过400字
不要:写废话、写不必要的背景、重复显而易见的信息""",
messages=[{
"role": "user",
"content": f"""Sprint 目标:
{sprint_goals[:1000]}
昨日站会记录:
{yesterday_log[:800]}
过去24小时 Jira 活动:
{jira_data[:2000]}
过去24小时 GitHub PR 活动:
{github_data[:1000]}
请生成今天的站会简报。"""
}]
)
return response.content[0].text
def save_to_vault(brief: str, vault_path: str):
"""把简报保存到 Obsidian Vault"""
today = datetime.now().strftime("%Y-%m-%d")
file_path = (
f"{vault_path}/Sprint Notes/sprint-current/daily-{today}.md"
)
content = f"""---
created: {today}
type: daily-standup
tags: [sprint, standup, ai-generated]
---
# 站会简报 {today}
{brief}
---
## 人工补充(站会讨论后填写)
### Blocker 解决方案
<!-- 站会讨论的解法 -->
### 优先级调整
<!-- 任何优先级变更 -->
### 今日行动项
- [ ] 
"""
with open(file_path, "w") as f:
f.write(content)
print(f"✅ 站会简报已保存:{file_path}")
return file_path
if __name__ == "__main__":
VAULT = "/Users/你的用户名/Documents/vault"
PROJECT_KEY = "RAG"
REPO = "your-org/your-repo"
jira_data = fetch_jira_activity(PROJECT_KEY)
github_data = fetch_github_prs(REPO)
brief = generate_standup_brief(
jira_data, github_data, "", VAULT
)
save_to_vault(brief, VAULT)
# 可选:通过 Slack webhook 发送到团队频道
# send_to_slack(brief)
print(brief)

仅站会摘要自动化就通常能为管理者每周节省1-2小时。

但对我来说,更大的收益不是节省时间,而是让站会真正聚焦在「解决问题」而不是「汇报进展」上。

四、模块二:Sprint 规划 AI 辅助

2026年一个出人意料的核心用例是在项目启动时请 AI 进行风险头脑风暴。描述项目的范围、时间表、依赖关系、团队构成、供应商情况,然后请它列出你应该考虑的20个风险。输出很少全是新奇的,但它始终能浮现出3-5个你还没有列入清单的风险,尤其是在邻近但超出你直接经验范围的领域。这有效,因为风险识别奖励广度而非深度,而 LLM 非常擅长广度。它们在足够多的项目事后分析和案例研究上训练,能够对以前出错的场景进行模式匹配。

把这个洞察用到 Sprint Planning 上,我开发了一套「Sprint 规划 AI 辅助脚本」:

Python

# sprint_planning_assistant.py
def generate_sprint_planning_packet(
backlog_items: list[dict],
team_velocity: float,
vault_path: str
) -> str:
"""
Sprint Planning 前,AI 生成辅助材料包:
1. 基于历史速度的容量计算
2. 每个 ticket 的风险标记
3. 技术债提醒
4. 跨 Sprint 未解决问题摘要
"""
# 从 Vault 读取历史 Sprint 数据
with open(f"{vault_path}/Sprint Notes/sprint-patterns.md") as f:
historical_patterns = f.read()
# 从 Vault 读取技术债记录(来自 B04 建立的系统)
with open(f"{vault_path}/02-Areas/technical-debt.md") as f:
tech_debt = f.read()
response = client.messages.create(
model="claude-opus-4-5",
max_tokens=3000,
system="""你是一个经验丰富的 Scrum 辅助 AI。
你的角色:提供数据和模式,不做决策。
决策永远由人类做。
你特别擅长:
- 从历史数据中发现低估模式
- 识别 ticket 之间的隐藏依赖
- 提醒团队之前承诺未兑现的技术债
- 标记模糊的验收标准""",
messages=[{
"role": "user",
"content": f"""请为本次 Sprint Planning 生成辅助材料包。
团队历史速度:{team_velocity} SP/Sprint
历史模式与教训:
{historical_patterns[:2000]}
当前技术债:
{tech_debt[:1000]}
待规划 Backlog(按优先级):
{str(backlog_items)[:3000]}
请生成:
1. 容量建议(考虑历史完成率,不是理论速度)
2. 每个 ticket 的风险标记和关注点
3. 本次 Sprint 应该还清的技术债建议
4. 验收标准模糊的 ticket 列表(需要 PO 澄清)
5. 跨 Sprint 重复出现的风险提醒
格式:可以直接用于 Planning 会议的摘要卡片"""
}]
)
planning_packet = response.content[0].text
# 保存到 Vault
sprint_num = get_current_sprint_number(vault_path)
with open(
f"{vault_path}/Sprint Notes/sprint-{sprint_num:02d}/planning.md",
"w"
) as f:
f.write(f"""---
created: {datetime.now().strftime("%Y-%m-%d")}
type: sprint-planning
sprint: {sprint_num}
tags: [sprint, planning, ai-generated]
velocity-target: {team_velocity}
---
# Sprint {sprint_num} 规划辅助材料
{planning_packet}
---
## 人工决策记录(Planning 会议中填写)
### 最终承诺的 Tickets
<!-- 从 Backlog 选入本 Sprint 的 tickets -->
### Sprint Goal
<!-- 一句话:本 Sprint 的核心目标 -->
### 风险应对计划
<!-- 针对 AI 标记的风险,人工制定应对方案 -->
""")
return planning_packet

我把 Planning 会议从2小时压缩到了45分钟。

原因是:以前的前30分钟用于「读 Backlog」和「问澄清性问题」——现在 AI 提前把这些都准备好了。Planning 会议变成了纯粹的「决策会议」,而不是「信息收集会议」。

五、模块三:自动化 Sprint 复盘(核心模块)

这是整套系统里我最花精力的部分,也是价值最大的部分。

AI 在复盘中出现在两个方面:情感分析和模式检测。情感分析扫描复盘板上的评论,并按语气对其进行分类。TeamRetro 和 Miro 等工具可以按关键词或情感自动聚类反馈,提取团队在逐张阅读卡片时可能遗漏的主题。跨 Sprint 的模式检测是更有价值的应用。

但这些工具有一个共同的问题:它们的数据存在它们自己的平台上,不在你的知识库里。

我的做法:用 Obsidian 作为所有复盘数据的「真实来源」,然后用 LLM 做跨 Sprint 的模式分析。

Python

# retrospective_analyzer.py
RETRO_PROMPTS = {
"4Ls": [
"Liked(喜欢什么)",
"Learned(学到什么)",
"Lacked(缺少什么)",
"Longed for(渴望什么)"
],
"Start_Stop_Continue": [
"Start(开始做什么)",
"Stop(停止做什么)",
"Continue(继续做什么)"
],
"Mad_Sad_Glad": [
"Mad(让人生气的)",
"Sad(让人难过的)",
"Glad(让人高兴的)"
]
}
def run_retrospective_analysis(
vault_path: str,
current_sprint: int,
retro_format: str = "4Ls",
num_historical_sprints: int = 4
) -> str:
"""
Sprint 复盘分析:
1. 分析本 Sprint 的数据(速度、完成率、blockers)
2. 与历史 Sprint 对比,识别跨 Sprint 模式
3. 生成结构化复盘会议议程
4. 追踪上次行动项的完成情况
"""
# 读取本 Sprint 所有 Daily Notes
sprint_dailies = []
sprint_dir = f"{vault_path}/Sprint Notes/sprint-{current_sprint:02d}/"
import os
for filename in sorted(os.listdir(sprint_dir)):
if filename.startswith("daily-") and filename.endswith(".md"):
with open(f"{sprint_dir}{filename}") as f:
sprint_dailies.append(f.read())
# 读取历史 Sprint 的模式记录
historical_retros = []
for i in range(
max(1, current_sprint - num_historical_sprints), current_sprint
):
retro_file = (
f"{vault_path}/Sprint Notes/"
f"sprint-{i:02d}/retrospective.md"
)
if os.path.exists(retro_file):
with open(retro_file) as f:
historical_retros.append(f.read())
# 读取上次复盘的行动项(追踪完成情况)
prev_sprint_retro = f"{vault_path}/Sprint Notes/sprint-{current_sprint-1:02d}/retrospective.md"
prev_action_items = ""
if os.path.exists(prev_sprint_retro):
with open(prev_sprint_retro) as f:
prev_action_items = f.read()
# 第一轮:数据分析
data_analysis = client.messages.create(
model="claude-opus-4-5",
max_tokens=2000,
system="""你是 Sprint 数据分析师。
只分析数据,不做主观评价。
重点:
- 用数字说话(完成率、速度、blocker 持续时间)
- 识别重复出现的问题模式
- 标记上次行动项的完成状态
- 避免主观判断,数据之外的判断留给团队""",
messages=[{
"role": "user",
"content": f"""请分析 Sprint {current_sprint} 的数据。
本 Sprint 每日站会记录(共{len(sprint_dailies)}天):
{"---".join(sprint_dailies[:5])}  
历史 Sprint 复盘记录(最近{len(historical_retros)}次):
{"---".join(historical_retros[-2:])}
上次复盘行动项:
{prev_action_items[:1000]}
请生成:
1. 本 Sprint 关键指标(完成率、blocker 数量、延期 tickets)
2. 跨 Sprint 重复出现的 TOP3 问题模式
3. 上次行动项完成情况(✅/❌/⚠️部分完成)
4. 本次复盘的数据基础摘要(给团队看的1页纸)"""
}]
).content[0].text
# 第二轮:生成复盘会议议程
retro_agenda = client.messages.create(
model="claude-haiku-4-5",
max_tokens=1500,
system=f"""你是复盘会议组织者。
基于数据分析,生成一份聚焦的复盘会议议程。
复盘格式:{retro_format}
维度:{", ".join(RETRO_PROMPTS[retro_format])}
原则:
- 议程总时长不超过60分钟
- 每个问题预留讨论时间(分钟)
- 行动项必须有 Owner 和 Deadline
- 优先讨论跨 Sprint 重复出现的问题""",
messages=[{
"role": "user",
"content": f"""基于以下数据分析,生成本次复盘会议议程:
{data_analysis}
要求:
- 5分钟:上次行动项回顾
- 40分钟:{retro_format} 框架讨论(基于上述数据预设讨论方向)
- 15分钟:行动项制定(带 Owner 和 Deadline)
对于每个讨论维度,请基于数据预设2-3个具体的讨论引导问题。"""
}]
).content[0].text
# 保存复盘文档到 Vault
retro_doc = f"""---
created: {datetime.now().strftime("%Y-%m-%d")}
type: retrospective
sprint: {current_sprint}
format: {retro_format}
tags: [sprint, retrospective, ai-generated]
---
# Sprint {current_sprint} 复盘
## 数据基础(AI 生成)
{data_analysis}
---
## 复盘会议议程(AI 生成)
{retro_agenda}
---
## 团队讨论记录(会议中填写)
### {RETRO_PROMPTS[retro_format][0]}
<!-- 团队观点 -->
### {RETRO_PROMPTS[retro_format][1]}
<!-- 团队观点 -->
### {RETRO_PROMPTS[retro_format][2]}
<!-- 团队观点 -->
{"### " + RETRO_PROMPTS[retro_format][3] if len(RETRO_PROMPTS[retro_format]) > 3 else ""}
---
## 行动项(会议中制定)
| 行动项 | Owner | Deadline | 优先级 |
|--------|-------|----------|--------|
|  |  |  |  |
---
## 下次复盘检查项
<!-- 本次行动项将在 Sprint {current_sprint + 1} 复盘时检查 -->
"""
retro_path = (
f"{vault_path}/Sprint Notes/"
f"sprint-{current_sprint:02d}/retrospective.md"
)
with open(retro_path, "w") as f:
f.write(retro_doc)
# 更新跨 Sprint 模式库
update_sprint_patterns(vault_path, current_sprint, data_analysis)
print(f"✅ 复盘文档已生成:{retro_path}")
return retro_doc
def update_sprint_patterns(
vault_path: str, 
sprint_num: int, 
analysis: str
):
"""
维护跨 Sprint 模式库——
这是让复盘随时间变得越来越有价值的关键
"""
patterns_file = f"{vault_path}/Sprint Notes/sprint-patterns.md"
new_entry = f"""
## Sprint {sprint_num} 模式记录
{analysis[:500]}
---
"""
with open(patterns_file, "a") as f:
f.write(new_entry)

六、模块四:跨 Sprint 模式洞察(最被忽视的价值)

三个月之后,模式库里积累了6个 Sprint 的数据。

我运行了一次「季度模式分析」:

Python

def quarterly_pattern_analysis(vault_path: str) -> str:
"""
每季度运行一次:
从所有 Sprint 复盘中提取战略级模式
"""
with open(f"{vault_path}/Sprint Notes/sprint-patterns.md") as f:
all_patterns = f.read()
response = client.messages.create(
model="claude-opus-4-5",
max_tokens=3000,
system="""你是工程效能分析师。
分析跨 Sprint 的战略级模式——
不是「这个 Sprint 发生了什么」,
而是「这支团队的系统性问题是什么」。
重点关注:
- 重复出现3次以上的问题(系统性,不是偶发)
- 行动项完成率趋势(团队执行力)
- 速度变化趋势(团队容量变化)
- 技术债对速度的影响""",
messages=[{
"role": "user",
"content": f"""分析以下6个 Sprint 的模式数据:
{all_patterns}
请生成:
1. 前3个系统性问题(证据:出现次数 + Sprint 编号)
2. 行动项完成率趋势(执行力评估)
3. 速度趋势分析(是在加速还是在减速?)
4. 给工程 Leader 的3条建议(不是给 Scrum Master,是给技术决策者)"""
}]
)
return response.content[0].text

这次分析给了我三个让我沉默了一会儿的结论:

1.
「估点不准」在6个 Sprint 里出现了5次,但每次的「行动项」是「下次评估时更仔细」。根本没有解决问题。真正的原因:用户故事粒度太大,一个故事包含了多个不同复杂度的任务。
2.
「集成测试阶段总是延期」在4个 Sprint 里出现了。根本原因:集成测试依赖的 staging 环境不稳定,但这个问题从未作为技术债被立项处理。
3.
团队速度从 Sprint 3 开始持续下降,而行动项完成率同期也在下降。这是一个「团队精力耗尽」的早期信号,在任何单次复盘里都不明显,但跨 Sprint 数据一眼就能看出来。

这三个洞察,任何一个在单次复盘里都不会被发现。它们只有在数据被持久化、被跨 Sprint 分析时才会浮现。

这就是 Obsidian 作为「知识持久化层」的真正价值:不是记录单次会议,而是让历史可被 AI 分析,让模式从数据里自己长出来。

七、真实效率数据

实施这套系统3个月后,我统计了一次:

活动
之前
之后
节省
每日站会
15分钟
5分钟
10分钟/天
Sprint Planning
120分钟
50分钟
70分钟
Sprint Review
60分钟
45分钟
15分钟
Retrospective 准备
30分钟
5分钟
25分钟
Retrospective 会议
90分钟
60分钟
30分钟

按一个8人团队、两周 Sprint 计算,每个 Sprint 节省约350分钟的团队时间,折算成个人时间约44分钟/人。

Jellyfish 2025年的数据显示,全面采用 AI 的团队每位工程师合并的 PR 数量多113%,周期时间缩短24%。

但我在实施过程中观察到了一件更重要的事:

会议的质量比节省的时间更重要。

当 AI 负责「信息广播」之后,站会变成了真正的协作会议。工程师们开始在站会上讨论技术方案,而不是汇报进度。这种质的变化,很难用时间来衡量。

八、我必须说清楚的边界

研究结果强调,AI 无法取代 Scrum Master,但可以生成有价值的情境化洞察。

这是我在实施这套系统时始终谨记的原则。

AI 做不到的事(永远不要试图自动化):

1.
感知团队情绪:某个工程师最近很沉默,可能是遇到了生活困难,也可能是对某个技术决策有不满。这需要人的感知。
2.
解读「行间意思」:有人在复盘里写「流程不够顺畅」,背后可能是对某个架构决策的不满,也可能是觉得需求变化太快。AI 看到的是文字,人看到的是人。
3.
建立心理安全:好的复盘需要心理安全。团队成员愿意说出真实问题,需要信任,需要关系,需要 Scrum Master 创造的容纳氛围。
4.
做权衡取舍:「我们应该这个 Sprint 还清技术债还是继续新功能?」这个问题背后有商业判断、团队士气、技术风险——AI 可以提供数据,但决策必须是人做的。

这之所以有效,是因为状态更新遵循可预测的结构(RAG 状态、里程碑、风险、请求),而 LLM 擅长组装工作。它在关于向哪个受众呈现哪个风险的判断方面较弱——这仍然是你的工作——但按键工作在很大程度上消失了。

结语:仪式的意义从来不是汇报

Scrum 的创始人 Jeff Sutherland 曾说:复盘是最重要的 Scrum 仪式。

不是因为它让你汇报进度,而是因为它让团队停下来,看清楚自己。

AI 能帮你「看清楚数字」,但「看清楚自己」还需要人。

这套系统的真正价值,是把数字从会议室里解放出来,让会议室里的时间,真正用于那些需要人在场的事情。

你的 Sprint,应该有两种节奏:数据节奏(AI 负责),和人的节奏(你负责)。


普通人如何用 AI 搭建自己的知识操作系统?

一个程序员出身的知识工作者,公开记录自己如何用 AI 工具搭建个人知识系统、把读过的书和做过的项目变成可复用资产的全过程。

我是【一只阿木木】——公开建造我的 AI 第二大脑。

我们的方向是——AI + Obsidian 的结合。但请记住:Obsidian 的灵魂不是效率,是自由。不是自动化,是代理力。不是工具帮你想,而是你借工具想得更好。
在一个许多工具承诺代替用户思考的市场中,Obsidian 赌的是我们仍然想要一个可以自己思考的地方。

欢迎加入行动营👇获取更多Obsidian + AI数字大脑实践

Image

我相信:在 AI 时代,每个普通人都该拥有一个自动生长的知识系统

欢迎关注【一只阿木木】🌊