#!/usr/bin/env python3
import re
from pathlib import Path

ROOT = Path(__file__).resolve().parent
PART1 = (ROOT / "part1" / "index.html").read_text(encoding="utf-8")
STYLE = re.search(r"<style>(.*?)</style>", PART1, re.S).group(1)
SCRIPT = re.search(r"(<script>.*?</script>)", PART1, re.S).group(1)
FONT_LINKS = "".join(re.findall(r'<link rel="preconnect"[^>]*>|<link href="https://fonts.googleapis.com[^>]*>', PART1))
PART2_CSS = r"""
.loop9{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:22px}.loop9 .unit{padding:14px 15px;border-top:2px solid var(--line2);background:rgba(255,253,248,.45)}.loop9 .unit.hot{border-color:var(--red);background:#F7E7E4}.loop9 b{font-family:var(--serif);font-size:17px}.loop9 p{font-size:12.5px;line-height:1.48;color:var(--muted);margin-top:5px}
.cap6{display:grid;grid-template-columns:repeat(3,1fr);gap:13px;margin-top:22px}.cap6 .cap{padding:16px 17px;border-top:2px solid var(--line2)}.cap6 .cap:nth-child(2n){background:rgba(255,253,248,.42)}.cap6 h3{font-size:17px}.cap6 p{font-size:12.5px;line-height:1.5;color:var(--muted);margin-top:6px}
.brief7{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:20px}.brief7 .item{padding:14px 15px;border-top:2px solid var(--line2);min-height:100px}.brief7 .item:last-child{grid-column:span 2;border-color:var(--red);background:#F7E7E4}.brief7 b{font-family:var(--serif);font-size:17px}.brief7 p{font-size:12px;line-height:1.45;color:var(--muted);margin-top:5px}
.checklist{display:flex;flex-direction:column;margin-top:20px;border-top:2px solid var(--red)}.check-row{display:grid;grid-template-columns:46px 175px 1fr;gap:15px;padding:12px 4px;border-bottom:1px solid var(--line2);align-items:baseline}.check-row .n{font-family:var(--mono);color:var(--red);font-size:11px}.check-row b{font-family:var(--serif);font-size:17px}.check-row span{font-size:13.5px;line-height:1.48;color:var(--muted)}
.chain8{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:23px}.chain8 .stage{padding:15px;border-top:2px solid var(--line2);min-height:105px}.chain8 .stage:nth-child(5),.chain8 .stage:nth-child(6),.chain8 .stage:nth-child(7),.chain8 .stage:nth-child(8){background:rgba(255,253,248,.5)}.chain8 b{font-family:var(--serif);font-size:16px}.chain8 p{font-size:12px;line-height:1.45;color:var(--muted);margin-top:5px}
.demo-clock{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:22px}.demo-step{padding:15px 16px;border-top:2px solid var(--line2)}.demo-step.hot{border-color:var(--red);background:#F7E7E4}.demo-step .time{font-family:var(--mono);font-size:11px;color:var(--red)}.demo-step b{display:block;font-family:var(--serif);font-size:17px;margin-top:5px}.demo-step p{font-size:12.5px;line-height:1.48;color:var(--muted);margin-top:5px}
.qa-cats{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-top:28px}.qa-cat{padding:17px 15px;border-top:2px solid var(--line2)}.qa-cat:nth-child(3){border-color:var(--red);background:#F7E7E4}.qa-cat b{font-family:var(--serif);font-size:18px}.qa-cat p{font-size:12.5px;line-height:1.5;color:var(--muted);margin-top:7px}
.reason .pad{padding-bottom:54px}.reason .big-number{font-size:88px}.reason h1{font-size:54px}.reason .foot{color:var(--faint)}
.opening .hook{max-width:30ch;font-size:43px;line-height:1.25}.opening .lead{max-width:68ch!important}
@media(max-width:700px){.opening .hook{max-width:none;font-size:36px;line-height:1.32}.reason .pad{min-height:calc(100vh - 54px);display:flex;padding:28px 20px 78px!important}.reason .big-number{font-size:70px}.reason h1{font-size:42px}.loop9,.cap6,.brief7,.chain8,.demo-clock,.qa-cats{grid-template-columns:1fr!important}.brief7 .item:last-child{grid-column:auto}.loop9 .unit,.cap6 .cap,.brief7 .item,.chain8 .stage,.demo-step,.qa-cat{min-height:0;padding:16px}.loop9 b,.cap6 h3,.brief7 b,.chain8 b,.demo-step b,.qa-cat b{font-size:20px}.loop9 p,.cap6 p,.brief7 p,.chain8 p,.demo-step p,.qa-cat p{font-size:16px;line-height:1.6;color:#302A26}.check-row{grid-template-columns:34px 1fr;padding:15px 2px}.check-row span{grid-column:2;font-size:16px;line-height:1.6}.check-row b{font-size:20px}}
"""

slides = []
BOTTOM = {}
def add(section, body, cls="", takeaway=None, action=None):
    slides.append((section, body, cls))
    if takeaway and action:
        BOTTOM[section] = (takeaway, action)
def footer(section, page, total):
    band = ""
    if section in BOTTOM:
        takeaway, action = BOTTOM[section]
        band = f'<div class="bottom-band"><div class="bottom-box"><div class="bottom-label">Key Takeaway</div><div class="bottom-text">{takeaway}</div></div><div class="bottom-box action"><div class="bottom-label">执行建议</div><div class="bottom-text">{action}</div></div></div>'
    return band + f'<div class="foot"><span>和合谷 × ReOrc / Syfo · Part B</span><span>{section}</span><span>{page:02d} / {total:02d}</span></div>'

def cards(items, cols="grid3"):
    return f'<div class="{cols}" style="margin-top:22px">' + "".join(f'<div class="card {"red" if i==0 else ""}"><div class="num">{label}</div><h3>{title}</h3><p>{text}</p></div>' for i,(label,title,text) in enumerate(items)) + '</div>'

def checks(items):
    return '<div class="checklist">' + "".join(f'<div class="check-row"><div class="n">{i:02d}</div><b>{title}</b><span>{text}</span></div>' for i,(title,text) in enumerate(items,1)) + '</div>'

add("封面", r'''<div class="topline"></div><div class="ring one"></div><div class="ring two"></div><div class="ring three"></div><div class="pad"><div class="brands"><img src="../assets/hegugu-wordmark.png" style="width:184px;height:54px;object-fit:contain"><span style="width:1px;height:38px;background:#B6A89A"></span><img src="../assets/syfo-wordmark.svg" style="width:100px;height:38px"></div><div style="margin:auto 0"><div class="kicker">Agent 工作方法 · Part B</div><h1 style="margin-top:22px;max-width:22ch">Agent 工作方法<br><span class="accent">任务、协作与复盘</span></h1><p class="lead" style="margin-top:24px;max-width:62ch">本场讨论五个具体问题：Context、任务表达、任务拆解、协作过程和经验沉淀。</p></div><div class="pill" style="width:max-content"><span class="dot"></span>80 分钟 · 讲解 45′ · Demo 20′ · Q&A 15′</div></div>''', "cover")

add("讲者", r'''<div class="pad"><div class="kicker">关于讲者</div><div style="display:grid;grid-template-columns:290px 1fr;gap:48px;align-items:center;margin:auto 0"><img src="../assets/tony-profile.png" style="width:290px;height:auto;border-radius:16px;border:1px solid var(--line);box-shadow:0 18px 50px rgba(26,22,18,.18)"><div><h1 style="font-size:54px">Tony Ren</h1><p class="lead" style="margin-top:10px;max-width:48ch">长期从事智能系统研究、数据产品与全球化产品管理。</p><div style="display:flex;flex-direction:column;gap:9px;margin-top:20px;max-width:60ch"><div class="bio-item"><b>香港科技大学</b> · 计算机科学本科、硕士、博士</div><div class="bio-item"><b>研究员经历</b> · 腾讯、华为诺亚方舟实验室、日本国立情报学研究所</div><div class="bio-item"><b>一面数据 · 创始人</b><div class="bio-desc">2019 年被 Ascential plc 收购后并入 Omnicom；2026 年被 NIQ 再次收购。</div></div><div class="bio-item"><b>前 Ascential / Flywheel Omnicom</b> · 亚太区首席产品官</div><div class="bio-item"><b>反曲科技 · 创始人</b></div></div></div></div></div>''', "bio")

add("从 LLM 到 Agent 编队", r'''<div class="pad"><div class="kicker">Three Levels</div><h2 style="margin-top:18px">从回答问题，到承接任务，再到<span class="accent">多角色完成结果</span>。</h2><div class="grid3" style="margin-top:26px"><div class="card"><div class="num">LEVEL 1 · LLM</div><h3>回答一个问题</h3><p>输入一段文字，返回一段内容。它擅长理解和生成，但不会自动负责后续行动。</p></div><div class="card red"><div class="num">LEVEL 2 · AGENT</div><h3>承接一项任务</h3><p>拥有目标、Context、工具和状态；能继续追问、执行动作、记录证据并交付结果。</p></div><div class="card"><div class="num">LEVEL 3 · AGENT TEAM</div><h3>组织一支编队</h3><p>分诊、研究、执行、检查和协调各有角色；可以并行、交接、Review，并在人类闸口停下。</p></div></div></div>''', takeaway="LLM 提供认知能力，Agent 把能力放进任务，Agent 编队把多个任务组织成结果。", action="判断需求属于哪一级：只要答案、需要完成任务，还是需要多个角色协作。")

add("Syfo 的四条 Agent 链路", r'''<div class="pad"><div class="kicker">Syfo in Practice</div><h2 style="margin-top:18px">Syfo 已经在四类工作中使用<span class="accent">Agent 编队</span>。</h2><div class="grid2" style="margin-top:22px"><div class="card red"><div class="num">产品问题</div><h3>#syfo-doctor → 研发闭环</h3><p>Han Solo 分诊、路由到研发频道、创建任务，排查、测试、Review、部署证据和回告形成闭环。</p></div><div class="card"><div class="num">官网内容</div><h3>反馈 → 修改 → Preview</h3><p>内容 Agent 修改页面，测试 Agent 检查导航与多语言，发布 Agent 生成 noindex 验收地址，人确认后再决定生产。</p></div><div class="card"><div class="num">生产发布</div><h3>CI 证据 → 人类 GO → 上线复核</h3><p>Agent 核对代码版本、构建产物与线上 marker；生产权限和最终发布保留在人类闸口。</p></div><div class="card"><div class="num">这次 Deck</div><h3>反馈 → 任务 → 重建 → 浏览器验收</h3><p>Tony 提出修改，Agent 更新生成器、逐页检查桌面和手机、部署新版本，再把验收结果回到线程。</p></div></div></div>''', takeaway="不同场景共享同一套结构：入口、角色、任务、状态、交付物、Review 和人类闸口。", action="听后面的六个原因时，把门店运营、会员营销、新品上市或供应链流程与这四条 Syfo 链路对照。")

add("影响 Agent 效果的条件", r'''<div class="pad"><div class="kicker">Working Conditions</div><div style="margin:auto 0"><div class="hook">Agent 效果取决于<span class="accent">五项基础条件</span>。</div><p class="lead" style="margin-top:24px;max-width:68ch">资料是否集中、任务是否明确、工作能否拆分、结果怎样验收、经验是否沉淀。这些条件决定 Agent 能参与到哪一步。</p></div></div>''', cls="opening", takeaway="Agent 的能力相同，工作环境和任务组织方式不同，交付质量也会不同。", action="带着一个真实任务听课，逐项检查 Context、表达、拆解、协作和复盘。")

add("Agent 是工作镜子", r'''<div class="pad"><div class="kicker">A Mirror of Work</div><h2 style="margin-top:18px">Agent 工作依赖<span class="accent">五项基础条件</span>。</h2><div class="qa-cats"><div class="qa-cat"><b>资料</b><p>放在哪里，别人能否接手？</p></div><div class="qa-cat"><b>表达</b><p>目标和标准是否说清？</p></div><div class="qa-cat"><b>拆解</b><p>大任务能否一步步推进？</p></div><div class="qa-cat"><b>协作</b><p>谁负责，状态在哪里？</p></div><div class="qa-cat"><b>复盘</b><p>下次是否还要从零开始？</p></div></div><div style="margin-top:28px;font-family:var(--serif);font-size:26px;line-height:1.5">先补齐工作条件，再评估 Agent 的实际效果。</div></div>''', takeaway="很多 Agent 问题，本质上是原有工作方式在新工具面前暴露出来。", action="遇到失败先定位是哪种工作习惯造成的，不急着换模型或换软件。")

add("原因 01", r'''<div class="pad"><div class="kicker">Reason 01</div><div style="margin:auto 0"><div class="big-number">01</div><h1 style="margin-top:18px;max-width:18ch">缺少稳定的<br><span class="accent">工作 Context</span></h1><p class="lead" style="margin-top:22px;max-width:50ch">资料分散、背景依赖口头转述、每次从零解释，Agent 无法稳定接续任务。</p></div></div>''', "reason")

add("两种工作现场", r'''<div class="pad"><div class="kicker">Work Habits</div><h2 style="margin-top:18px">同一项工作，<span class="accent">两个完全不同的现场</span>。</h2><div class="compare" style="margin-top:26px"><div class="card"><div class="num">混乱现场</div><h3>全靠个人记忆</h3><p>资料在桌面、聊天和下载目录；任务没有边界；关键决定没有记录；每次重新向 Agent 解释。</p></div><div class="mid">→</div><div class="card red"><div class="num">清晰现场</div><h3>别人和 Agent 都能接手</h3><p>一个项目有固定工作区；目标、素材、过程与输出各有位置；关键决定可追溯，结果可以复用。</p></div></div></div>''', takeaway="整理工作现场的目的，是让信息能被接手、追溯和复用。", action="为当前项目建立一个共同工作区，把目标、素材、决定、过程和最终结果放到固定位置。")

add("五个基本接口", r'''<div class="pad"><div class="kicker">Minimum System</div><h2 style="margin-top:18px">让 Agent 有地方落脚，只需要<span class="accent">五个基本接口</span>。</h2><div class="qa-cats"><div class="qa-cat"><b>目标</b><p>这次到底要完成什么。</p></div><div class="qa-cat"><b>素材</b><p>已有资料统一放在哪里。</p></div><div class="qa-cat"><b>约束</b><p>边界、口径和禁区是什么。</p></div><div class="qa-cat"><b>过程</b><p>关键决定为什么这样做。</p></div><div class="qa-cat"><b>输出</b><p>结果如何归档与复用。</p></div></div></div>''', takeaway="一个最小工作系统，比一条更复杂的 Prompt 更能提高长期效率。", action="先把五个接口补齐，再让 Agent 开始执行；缺少的信息明确标记为待补。")

add("原因 02", r'''<div class="pad"><div class="kicker">Reason 02</div><div style="margin:auto 0"><div class="big-number">02</div><h1 style="margin-top:18px;max-width:18ch">目标没有转化为<br><span class="accent">可执行任务</span></h1><p class="lead" style="margin-top:22px;max-width:50ch">只有方向性要求，没有输入、输出、限制和验收标准，执行者无法判断何时完成。</p></div></div>''', "reason")

add("模糊要求与清晰任务", r'''<div class="pad"><div class="kicker">Expectation Gap</div><h2 style="margin-top:18px">模糊要求会增加 Agent 的<span class="accent">判断偏差</span>。</h2><div class="compare" style="margin-top:25px"><div class="card"><div class="num">模糊要求</div><h3>“帮我做一个门店活动方案”</h3><p>没有背景、对象、事实来源和验收标准；结果不满意时，只能说“感觉不对”。</p></div><div class="mid">→</div><div class="card red"><div class="num">清晰任务</div><h3>“这是目标、限制和完成标准”</h3><p>说明为什么做、给谁看、哪些事实必须使用、什么不能改，以及怎样算完成。</p></div></div></div>''', takeaway="任务表达越清楚，Agent 越能自主推进；表达模糊时，管理成本会转化为返工。", action="委托前让 Agent 复述目标、缺口、计划和验收标准，确认理解一致后再开始。")

add("七段式 Brief", r'''<div class="pad"><div class="kicker">A Clear Brief</div><h2 style="margin-top:18px">一份可执行 Brief，回答<span class="accent">七个简单问题</span>。</h2><div class="brief7"><div class="item"><div class="num">01</div><b>背景</b><p>为什么现在要做？</p></div><div class="item"><div class="num">02</div><b>目标</b><p>最终要改变什么？</p></div><div class="item"><div class="num">03</div><b>受众</b><p>交付给谁、影响谁？</p></div><div class="item"><div class="num">04</div><b>输入</b><p>资料、数据和案例在哪里？</p></div><div class="item"><div class="num">05</div><b>约束</b><p>哪些边界不能越过？</p></div><div class="item"><div class="num">06</div><b>交付</b><p>格式、数量和粒度是什么？</p></div><div class="item"><div class="num">07</div><b>验收</b><p>怎样才算完成？</p></div></div></div>''', takeaway="清晰 Brief 的作用是把影响结果的条件提前说明。", action="把七个问题做成团队模板；Brief 缺项时先补信息，不让执行者靠猜。")

add("原因 03", r'''<div class="pad"><div class="kicker">Reason 03</div><div style="margin:auto 0"><div class="big-number">03</div><h1 style="margin-top:18px;max-width:18ch">任务颗粒度过大，<br><span class="accent">过程无法检查</span></h1><p class="lead" style="margin-top:22px;max-width:52ch">复杂任务直接交给一个 Agent，通常会在中途丢信息、走偏或无法验收。</p></div></div>''', "reason")

add("按交付物拆任务", r'''<div class="pad"><div class="kicker">Break It Down</div><h2 style="margin-top:18px">把大任务拆成<span class="accent">可验收的阶段交付</span>。</h2>''' + checks([
("结果可见", "每一步都产生可以检查和继续使用的东西。"),
("顺序清楚", "先做什么、后做什么，哪些步骤可以并行。"),
("责任明确", "每一步只有一个负责人，其他角色提供协作。"),
("错误可停", "某一步走偏时可以及时纠正，不让错误一路传下去。"),
]) + r'''</div>''', takeaway="好的拆解让复杂工作可以推进、检查和纠偏，不依赖一次生成完美结果。", action="拆分时写下每一步的输入、输出和验收；没有明确输出的步骤继续拆。")

add("客户方案怎么拆", r'''<div class="pad"><div class="kicker">A Simple Example</div><h2 style="margin-top:18px">“做一个客户方案”，可以拆成<span class="accent">五个交付</span>。</h2><div class="flow" style="margin-top:27px"><div class="node"><div class="num">01</div><strong>研究摘要</strong><p>客户、市场、问题和机会。</p></div><div class="arrow">→</div><div class="node"><div class="num">02</div><strong>方案结构</strong><p>核心观点和章节顺序。</p></div><div class="arrow">→</div><div class="node"><div class="num">03</div><strong>内容初稿</strong><p>按结构填充事实与建议。</p></div><div class="arrow">→</div><div class="node"><div class="num">04</div><strong>事实检查</strong><p>来源、数字、承诺与风险。</p></div><div class="arrow">→</div><div class="node" style="border-color:#D7A8AB;background:#F9EEEE"><div class="num">05</div><strong>最终交付</strong><p>统一风格、格式和结论。</p></div></div></div>''', takeaway="按交付物拆任务，能让不同角色并行，也让人类在关键节点及时判断。", action="为自己的真实任务画一条五步以内的交付链，先用最少角色跑通。")

add("原因 04", r'''<div class="pad"><div class="kicker">Reason 04</div><div style="margin:auto 0"><div class="big-number">04</div><h1 style="margin-top:18px;max-width:18ch">只验最终结果，<br><span class="accent">无法定位偏差</span></h1><p class="lead" style="margin-top:22px;max-width:52ch">一次失败直接归因给“Agent 不行”，下一次换一个工具，往往还会重复同样的问题。</p></div></div>''', "reason")

add("出错先查五层", r'''<div class="pad"><div class="kicker">Diagnose the Work</div><h2 style="margin-top:18px">结果不对时，先检查<span class="accent">五个常见原因</span>。</h2><div class="qa-cats"><div class="qa-cat"><b>权限</b><p>它真的能读取、写入和调用吗？</p></div><div class="qa-cat"><b>环境</b><p>文件、账号和运行条件一致吗？</p></div><div class="qa-cat"><b>Context</b><p>背景是否足够、正确、最新？</p></div><div class="qa-cat"><b>能力</b><p>当前模型和工具适合吗？</p></div><div class="qa-cat"><b>拆解</b><p>任务是否大到无法一次判断？</p></div></div></div>''', takeaway="定位错误发生在哪一层，再调整对应的变量。", action="复盘失败时只改一个变量并重新测试，把有效解法记录下来。")

add("怎样验收主观结果", r'''<div class="pad"><div class="kicker">Quality Judgment</div><h2 style="margin-top:18px">“感觉不对”要变成<span class="accent">具体反馈</span>。</h2>''' + cards([
("完整", "少了什么", "检查必要信息、章节、数据和交付格式。"),
("准确", "哪里不可靠", "标记事实、数字、来源、时效和推断。"),
("合适", "哪里不符合场景", "说明受众、语气、业务目标和资源限制。"),
("风险", "哪里不能直接用", "指出客户、品牌、合规、资金和不可逆影响。"),
], "grid4") + r'''</div>''', takeaway="好的反馈指出偏差发生在哪里，并给出下一轮可执行的修改方向。", action="准备 3–5 个好样本和坏样本，用具体差异训练团队与 Agent 的共同标准。")

add("人什么时候介入", r'''<div class="pad"><div class="kicker">Human Checkpoints</div><h2 style="margin-top:18px">人不需要盯每一步，<span class="accent">重点看三个时刻</span>。</h2>''' + cards([
("开始前", "目标与边界", "确认任务方向、事实来源和不可触碰范围。"),
("执行中", "异常与低置信度", "信息冲突、方向变化、连续失败时及时接管。"),
("行动前", "高风险承诺", "客户发送、资金、权限、生产发布和不可逆动作。"),
]) + r'''</div>''', takeaway="人的判断应放在方向、异常和高风险动作上，减少重复确认。", action="为每项任务预先写明：哪些动作可自主，哪些情况必须停下来找谁。")

add("原因 05", r'''<div class="pad"><div class="kicker">Reason 05</div><div style="margin:auto 0"><div class="big-number">05</div><h1 style="margin-top:18px;max-width:18ch">协作信息分散，<br><span class="accent">任务无法连续交接</span></h1><p class="lead" style="margin-top:22px;max-width:52ch">没有共同现场，协作会变成私聊转述、重复追问和不断催进度。</p></div></div>''', "reason")

add("信息放在哪里", r'''<div class="pad"><div class="kicker">One Place, One Purpose</div><h2 style="margin-top:18px">每种信息都有一个<span class="accent">最合适的位置</span>。</h2><div class="flow" style="margin-top:25px"><div class="node"><div class="num">频道</div><strong>长期背景</strong><p>主题、参与者和共同 Context。</p></div><div class="arrow">→</div><div class="node"><div class="num">任务</div><strong>责任与状态</strong><p>谁负责、做到哪、下一步是什么。</p></div><div class="arrow">→</div><div class="node"><div class="num">Thread</div><strong>执行过程</strong><p>证据、讨论、异常和决定。</p></div><div class="arrow">→</div><div class="node" style="border-color:#D7A8AB;background:#F9EEEE"><div class="num">交付物</div><strong>最终结果</strong><p>版本、来源、证据和修改历史。</p></div></div></div>''', takeaway="信息放对位置，团队才能少追问、少转述，也更容易接手和复用。", action="约定主频道留结论，任务记状态，Thread 留过程，交付物放最终版本。")

add("Syfo 八步闭环", r'''<div class="pad"><div class="kicker">A Real Workflow</div><h2 style="margin-top:18px">Syfo 用八步，把一次报障<span class="accent">变成可追踪的结果</span>。</h2><div class="chain8"><div class="stage"><div class="num">01</div><b>统一入口</b><p>#syfo-doctor 收问题。</p></div><div class="stage"><div class="num">02</div><b>补信息</b><p>Han Solo 继续追问。</p></div><div class="stage"><div class="num">03</div><b>判断归属</b><p>找到正确研发频道。</p></div><div class="stage"><div class="num">04</div><b>创建任务</b><p>明确 Owner 和下一步。</p></div><div class="stage"><div class="num">05</div><b>执行</b><p>排查、修改、测试。</p></div><div class="stage"><div class="num">06</div><b>Review</b><p>检查根因和边界。</p></div><div class="stage"><div class="num">07</div><b>交付</b><p>挂结果和验证证据。</p></div><div class="stage"><div class="num">08</div><b>回告</b><p>把结论送回问题来源。</p></div></div></div>''', takeaway="这八步适用于任何需要入口、分诊、执行、验收和回告的业务流程。", action="把一条和合谷真实流程映射到八步，找出现在依赖私聊或个人记忆的环节。")

add("20 分钟 Demo", r'''<div class="pad"><div class="kicker">Live Demo</div><h2 style="margin-top:18px">Demo 展示一条<span class="accent">完整工作链路</span>。</h2><div class="demo-clock"><div class="demo-step"><div class="time">02 MIN</div><b>问题进入</b><p>为什么不直接私聊工程师。</p></div><div class="demo-step"><div class="time">03 MIN</div><b>Han Solo 补信息</b><p>环境、复现、影响和预期。</p></div><div class="demo-step"><div class="time">04 MIN</div><b>路由与建任务</b><p>Owner、状态、下一步和分工。</p></div><div class="demo-step hot"><div class="time">04 MIN</div><b>执行与纠偏</b><p>证据、依赖、阻塞公开可见。</p></div><div class="demo-step"><div class="time">04 MIN</div><b>Review 与批准</b><p>检查根因、回归和高风险动作。</p></div><div class="demo-step"><div class="time">03 MIN</div><b>交付与回告</b><p>结果、证据、结论和经验沉淀。</p></div></div></div>''', takeaway="Demo 的价值在于看清责任、信息、状态、判断和结果怎样连接。", action="现场持续追问：谁负责、做到哪、信息去哪、谁在 Review、下一步谁决定。")

add("原因 06", r'''<div class="pad"><div class="kicker">Reason 06</div><div style="margin:auto 0"><div class="big-number">06</div><h1 style="margin-top:18px;max-width:18ch">任务结束后，<br><span class="accent">经验没有形成复用材料</span></h1><p class="lead" style="margin-top:22px;max-width:52ch">聊天记录很多，但团队没有形成统一模板、规则和样本。</p></div></div>''', "reason")

add("留下什么", r'''<div class="pad"><div class="kicker">Save the Learning</div><h2 style="margin-top:18px">一次成功，至少留下<span class="accent">六种东西</span>。</h2><div class="cap6"><div class="cap"><h3>Brief 模板</h3><p>下次怎样提供完整输入。</p></div><div class="cap"><h3>好坏样本</h3><p>团队共同的质量参照。</p></div><div class="cap"><h3>验收清单</h3><p>结果怎样检查和放行。</p></div><div class="cap"><h3>角色说明</h3><p>谁负责什么，何时升级。</p></div><div class="cap"><h3>异常解法</h3><p>常见失败怎样定位和接管。</p></div><div class="cap"><h3>Skill / 连接</h3><p>可以直接复用的执行能力。</p></div></div></div>''', takeaway="团队能力来自共同积累，不来自每个人各自保存一条 Prompt。", action="每次任务结束时，至少更新一份模板、一条规则或一个样本。")

add("明天先做一件事", r'''<div class="pad"><div class="kicker">Start Tomorrow</div><h2 style="margin-top:18px">选择一个真实任务，按<span class="accent">五个步骤执行</span>。</h2>''' + checks([
("选一件事", "本周会真实发生、结果可检查、风险可控制。"),
("说清任务", "写完七段 Brief，让 Agent 先复述理解。"),
("拆成小步", "每一步都有交付物、负责人和验收。"),
("边做边看", "记录偏差、人工修改、阻塞和最终证据。"),
("留下经验", "把有效做法变成模板、样本或清单。"),
]) + r'''</div>''', takeaway="任务完成后，工作方法应当至少有一项可复用更新。", action="会后 24 小时内确定任务和 Owner，不等大平台，不先改全部流程。")

add("团队能力的积累", r'''<div class="pad"><div class="kicker">From One Person to a Team</div><h2 style="margin-top:18px">团队能力由<span class="accent">三项日常机制</span>积累。</h2>''' + cards([
("看得见", "工作过程可见", "目标、资料、状态、异常和决定都留在共同现场。"),
("说得清", "任务与标准清楚", "Brief、交付和验收不用依赖个人默契。"),
("留得下", "每次都积累", "模板、样本、清单和 Skill 越用越完整。"),
]) + r'''</div>''', takeaway="个人用 Agent 解决一次问题，团队用共同方法持续提高完成问题的能力。", action="选择一类重复工作，统一工作现场、任务模板和复盘方式，连续运行四周。")

add("Q&A", r'''<div class="pad"><div class="kicker">15 分钟问答</div><h2 style="margin-top:18px">欢迎大家<span class="accent">随时提问</span>。</h2><div class="qa-cats"><div class="qa-cat"><b>概念</b><p>LLM、Agent 和 Agent 编队有什么区别？</p></div><div class="qa-cat"><b>使用</b><p>日常工作怎样开始用 Agent？</p></div><div class="qa-cat"><b>协作</b><p>人和 Agent 怎样分工？</p></div><div class="qa-cat"><b>风险</b><p>哪些环节需要人工确认？</p></div><div class="qa-cat"><b>其他</b><p>任何刚才没有讲清楚的问题。</p></div></div><div style="margin-top:26px;font-family:var(--serif);font-size:25px;line-height:1.5">不需要准备完整案例，<span class="accent">想到什么就问什么</span>。</div></div>''', takeaway="问题可以来自刚才的内容，也可以来自日常工作中的困惑。", action="直接提出问题即可；我们现场一起讨论。")

add("结束", r'''<div class="topline"></div><div class="ring one"></div><div class="ring two"></div><div class="ring three"></div><div class="pad"><div class="brands"><img src="../assets/hegugu-wordmark.png" style="width:184px;height:54px;object-fit:contain"><span style="width:1px;height:38px;background:#B6A89A"></span><img src="../assets/syfo-wordmark.svg" style="width:100px;height:38px"></div><div style="margin:auto 0"><h1 style="max-width:18ch">从一项真实任务开始<br><span class="accent">建立可重复的工作方法</span>。</h1><p class="lead" style="margin-top:24px;max-width:54ch">明确输入与输出，拆分执行步骤，设置检查点，并把有效做法沉淀为团队材料。</p></div><div class="pill" style="width:max-content"><span class="dot"></span>下一步：选择任务，完成一次五步执行</div></div>''', "cover")
TOTAL = len(slides)
sections = [f'<section class="slide {cls}">{body}{footer(section, index, TOTAL)}</section>' for index, (section, body, cls) in enumerate(slides, start=1)]
html = f'''<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex,nofollow"><title>和合谷｜Agent 工作方法 · Part B</title><link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 64 64%22><rect width=%2264%22 height=%2264%22 rx=%2214%22 fill=%22%23B4202A%22/><path d=%22M18 20h8l6 18 6-18h8L35 48h-6z%22 fill=%22white%22/></svg>">{FONT_LINKS}<style>{STYLE}{PART2_CSS}</style></head><body class="web"><div class="deck">{"".join(sections)}</div><div class="bar" id="bar"></div><div class="zone left" onclick="show(i-1)"></div><div class="zone right" onclick="show(i+1)"></div><div class="nav"><button onclick="show(i-1)">‹ 上一页</button><span id="count"></span><button onclick="show(i+1)">下一页 ›</button></div>{SCRIPT}</body></html>'''
out = ROOT / "part2"
out.mkdir(exist_ok=True)
(out / "index.html").write_text(html, encoding="utf-8")
print(f"wrote {TOTAL} slides to {out / 'index.html'}")
