From 5e77efd2ac90a9c2dc55299e6b35597e094ceb0c Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Sun, 16 Aug 2026 21:47:05 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat(video-pipeline):=20=E6=B2=89=E6=B7=80?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E7=A7=91=E6=99=AE=E8=A7=86=E9=A2=91=E5=88=B6?= =?UTF-8?q?=E4=BD=9C=E7=AE=A1=E7=BA=BF=E5=B9=B6=E6=94=B6=E6=95=9B=E4=B8=8A?= =?UTF-8?q?=E9=9B=86=E8=84=9A=E6=9C=AC=E4=B8=BA=E8=96=84=E5=8C=85=E8=A3=85?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 media/pipeline/:中心脚本三件套(build_narration/tts/qa_frames,--project 参数化,tts 增 --voice/--rate)+ Pipeline 总纲 README(九阶段 Stages、两种工程模式、复用边界、新集脚手架清单)+ skills/01-05 各阶段代理提示词规格; - 上集 scripts/*.py 改为薄包装转发 ../../pipeline/scripts/,保持原 CLI 契约;改造后 narration.json 字节级等价验证通过(shasum 一致); - qa_frames CLI 规整:--scene 与句 id 位置参数互斥二选一。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- media/pipeline/README.md | 101 +++++++++++++++++ media/pipeline/scripts/build_narration.py | 60 +++++++++++ media/pipeline/scripts/qa_frames.py | 102 ++++++++++++++++++ media/pipeline/scripts/tts.py | 100 +++++++++++++++++ media/pipeline/skills/01-paper-extraction.md | 43 ++++++++ media/pipeline/skills/02-planning.md | 25 +++++ media/pipeline/skills/03-narration.md | 42 ++++++++ media/pipeline/skills/04-verification.md | 30 ++++++ media/pipeline/skills/05-storyboard.md | 27 +++++ .../scripts/build_narration.py | 55 +++------- .../scripts/qa_frames.py | 92 ++-------------- .../scripts/tts.py | 83 ++------------ 12 files changed, 564 insertions(+), 196 deletions(-) create mode 100644 media/pipeline/README.md create mode 100644 media/pipeline/scripts/build_narration.py create mode 100644 media/pipeline/scripts/qa_frames.py create mode 100644 media/pipeline/scripts/tts.py create mode 100644 media/pipeline/skills/01-paper-extraction.md create mode 100644 media/pipeline/skills/02-planning.md create mode 100644 media/pipeline/skills/03-narration.md create mode 100644 media/pipeline/skills/04-verification.md create mode 100644 media/pipeline/skills/05-storyboard.md diff --git a/media/pipeline/README.md b/media/pipeline/README.md new file mode 100644 index 00000000..ba1564d0 --- /dev/null +++ b/media/pipeline/README.md @@ -0,0 +1,101 @@ +# 科普视频制作 Pipeline(公共基建) + +> 从「论文精读 → 逐字稿 → 配音 → 代码动画 → 终渲」全链路中沉淀的**仓库级可复用流水线**。 +> 首个完整范例:[《AI 如何自己变强?》](../self-improving-agents-video/README.md)(Remotion 工程模式);轻量替代:[video-package 制作包模式](../../video-package/README.md)。 + +## 一、Pipeline 总览(9 Stages) + +```mermaid +flowchart LR + subgraph S["内容层(文档驱动)"] + A[① 论文精读提取
并行子代理] --> B[② 策划案
受众/结构/视觉契约] + B --> C[③ 逐字稿 narration.md
★单一事实源] + C --> D[④ 双重校验
真实性回溯+易懂性] + D --> E[⑤ 分镜表 storyboard.md] + end + subgraph P["生产层(工具驱动)"] + C --> F[⑥ TTS 合成
逐句 mp3+manifest] + E --> G[⑦ Remotion 场景实现] + F --> G + G --> H[⑧ 草渲+抽帧 QA
迭代修正] + H --> I[⑨ 终渲 1080p30] + end + style C fill:#1a3a5c,stroke:#4A9EFF,color:#fff + style F fill:#5c3a1a,stroke:#FF9F45,color:#fff + style I fill:#2d5c1a,stroke:#7ED321,color:#fff +``` + +每个 Stage 的代理提示词规格见 [skills/](./skills/)(01–05 覆盖内容层),可直接作为子代理 prompt 或未来挂载为 `.claude/skills/` 的底稿。 + +## 二、工程目录约定 + +每集视频一个 `media/-video/` 工程: + +``` +media/-video/ +├── README.md # 本集说明(目录表/复现流水线/视觉契约/许可) +├── research/paper-notes.md # 事实源:全部口播断言须可回溯至此 +├── script/ +│ ├── planning.md # 策划案 +│ ├── narration.md # 逐字稿(唯一维护处,勿改 narration.json) +│ ├── narration.json # 派生物(build_narration.py 生成) +│ └── storyboard.md # 分镜表(镜号↔句 id 区间↔画面↔动效) +├── scripts/*.py # 薄包装 → ../../pipeline/scripts/(保 CLI 契约) +├── video/ # Remotion 独立 pnpm 工程(--ignore-workspace 隔离) +└── out/ # 渲染产物(gitignored) +``` + +**格式契约**(`build_narration.py` 的解析规则): +- narration.md:`## P0 标题` 分幕 + `- [p0-01] 文本` 一句一行;句 id 必须以幕名小写为前缀、全片唯一。 +- `>` 引用块为画面备注,不进配音;英文方法名做角标不口播。 + +## 三、公共脚本(单一事实源) + +| 脚本 | 用途 | 工程内等价调用 | +|---|---|---| +| [scripts/build_narration.py](./scripts/build_narration.py) | narration.md → narration.json + 时长估算 | `uv run --no-project scripts/build_narration.py` | +| [scripts/tts.py](./scripts/tts.py) | 逐句 edge-tts 合成 + 时长 manifest(幂等) | `uv run --no-project --with edge-tts --with mutagen scripts/tts.py` | +| [scripts/qa_frames.py](./scripts/qa_frames.py) | 按句 id 抽帧视觉 QA | `uv run --no-project scripts/qa_frames.py out/draft.mp4 --scene P2` | + +中心脚本以 `--project <工程根>` 参数化;工程内 `scripts/*.py` 为薄包装(透传参数、保持原 CLI)。改造/迭代只改 `media/pipeline/scripts/`,验证门 = 受影响工程的 `narration.json` / `manifest.json` 字节级不变。 + +## 四、复用边界(显式权衡) + +- **Python 脚本:集中共享(SSOT)**——三个纯文本变换工具,跨集零差异,中心化防 split-brain。 +- **Remotion 工程原语:复制适配,不做共享包**——`timing.ts` / `Subtitle` / `cards.tsx` / `theme.ts` 等每集复制后按本集视觉契约修改。理由:每集工程须保持 pnpm `--ignore-workspace` 独立可渲染(嵌套 workspace 隔离 + Remotion 版本自由),共享 TS 包会把「一集的视觉改动」泄漏进其他集。复用时以首集工程为模板复制 `video/` 骨架。 +- **每集视觉契约独立设计**(色彩语义映射到本集核心概念),但底层规范复用:深色底 `#0E1116` 系、警示红 `#FF5C5C`、确认绿 `#7ED321`、金句卡衬线体、公式只作角标彩蛋。 + +## 五、音画同步机制(零手工对轨) + +每句一段 MP3;`tts.py` 产出 `video/public/audio/manifest.json`(含每句实测时长);Remotion `calculateMetadata` 读取 manifest 计算全片时间轴(默认句间 0.32s、幕间 +0.9s、片头 0.6s、片尾 2s)。**改稿后只需重跑:build → tts → render**。 + +⚠️ 若工程自定义了 `timing.ts` 常量,须同步 `qa_frames.py` 顶部的镜像常量,否则抽帧时间错位。 + +## 六、新集脚手架清单 + +1. `git cp` 上一集工程目录骨架(README/research/script/scripts/video),改 slug 与内容。 +2. `video/package.json` 改 `name`;清空 scenes 重建;`theme.ts` 换本集色板。 +3. 根 `.gitignore` 追加本集产物规则(**不能放工程内**——根级裸 `.gitignore` 规则会挡住嵌套 ignore 文件): + ``` + media/-video/video/public/audio/ + media/-video/out/ + media/-video/**/*.mp4 + media/-video/**/*.mp3 + media/-video/**/*.wav + ``` +4. `cd video && pnpm install --ignore-workspace`(必须显式忽略根 workspace;`onlyBuiltDependencies: [esbuild]` 已在 package.json);装完检查根 lockfile 零变更。 +5. 按 [skills/](./skills/) 01→05 顺序走内容层,再进生产层。 + +## 七、两种工程模式 + +| | Remotion 工程模式 | 轻量制作包模式 | +|---|---|---| +| 载体 | `media/-video/video/`(Remotion + React) | `video-package/`(单文件 Canvas HTML) | +| 动画 | 全代码动画,可编程复渲 | 浏览器手动录屏 | +| 配音 | edge-tts + manifest 自动对轨 | 人工录音/剪辑对齐 | +| 适用 | 中长视频、多轮迭代、可复现 | 快速产出、低工程成本 | +| 范例 | [《AI 如何自己变强?》](../self-improving-agents-video/README.md) | [《当 AI 开始给自己当老师》](../../video-package/README.md) | + +## 八、许可注意 + +Remotion 对超过 3 人的公司需商业授权(个人/小团队免费);edge-tts 为微软在线语音,发布前确认平台对合成语音的标注要求;不使用任何未经授权的第三方图片/音频素材。 diff --git a/media/pipeline/scripts/build_narration.py b/media/pipeline/scripts/build_narration.py new file mode 100644 index 00000000..36845d2c --- /dev/null +++ b/media/pipeline/scripts/build_narration.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +"""从 narration.md 解析生成 narration.json(逐句:id/scene/text)——公共管线版本。 + +narration.md 是单一事实源;本脚本是纯派生转换,不做任何内容改写。 +适用于任何 `media/*-video/` 科普视频工程(目录约定见 media/pipeline/README.md)。 + +用法:uv run --no-project media/pipeline/scripts/build_narration.py --project media/<工程> + 工程内薄包装等价于:uv run --no-project scripts/build_narration.py +""" + +from __future__ import annotations + +import argparse +import json +import re +from pathlib import Path + +LINE_RE = re.compile(r"^- \[(?P[a-z0-9-]+)\]\s+(?P.+)$") +SCENE_RE = re.compile(r"^## (?PP\d+)\b") + + +def main() -> None: + parser = argparse.ArgumentParser(description="narration.md → narration.json") + parser.add_argument("--project", default=".", help="视频工程根目录(含 script/)") + args = parser.parse_args() + + root = Path(args.project).resolve() + src = root / "script" / "narration.md" + dst = root / "script" / "narration.json" + + scene = "" + items: list[dict[str, str]] = [] + seen: set[str] = set() + for raw in src.read_text(encoding="utf-8").splitlines(): + if m := SCENE_RE.match(raw): + scene = m.group("scene") + continue + if m := LINE_RE.match(raw): + sid, text = m.group("id"), m.group("text").strip() + if sid in seen: + raise SystemExit(f"重复句 id: {sid}") + if not sid.startswith(scene.lower() + "-"): + raise SystemExit(f"句 id {sid} 与所在幕 {scene} 不一致") + seen.add(sid) + items.append({"id": sid, "scene": scene, "text": text}) + + dst.write_text( + json.dumps(items, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" + ) + total_chars = sum(len(i["text"]) for i in items) + per_scene: dict[str, int] = {} + for i in items: + per_scene[i["scene"]] = per_scene.get(i["scene"], 0) + 1 + print(f"句数: {len(items)} 总字数: {total_chars}") + print(f"各幕句数: {per_scene}") + print(f"估算时长(280字/分): {total_chars / 280:.1f} 分钟") + + +if __name__ == "__main__": + main() diff --git a/media/pipeline/scripts/qa_frames.py b/media/pipeline/scripts/qa_frames.py new file mode 100644 index 00000000..80cc0d94 --- /dev/null +++ b/media/pipeline/scripts/qa_frames.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +"""按句 id 从渲染产物中抽帧,用于视觉 QA——公共管线版本。 + +时序常量须与工程的 video/src/timing.ts 保持一致(FPS/句间停顿/幕间停顿/片头引导)。 +若工程自定义了 timing 常量,须同步本文件顶部的镜像常量。 + +用法:uv run --no-project media/pipeline/scripts/qa_frames.py --project media/<工程> \ + <句id> [句id ...] + uv run --no-project media/pipeline/scripts/qa_frames.py --project media/<工程> \ + --scene P1 # 该幕抽样至多 ~8 帧(与 ids 二选一) +输出:<工程>/out/frames/{句id}.png +""" + +from __future__ import annotations + +import argparse +import json +import subprocess +from pathlib import Path + +# 与各工程 video/src/timing.ts 对齐(管线默认值;改过 timing 的工程须同步) +FPS = 30 +SENTENCE_GAP = 0.32 +SCENE_GAP = 0.9 +LEAD_IN = 0.6 + + +def timeline(manifest: Path) -> dict[str, tuple[float, float]]: + items = json.loads(manifest.read_text(encoding="utf-8")) + result: dict[str, tuple[float, float]] = {} + cursor_frames = round(LEAD_IN * FPS) + for i, item in enumerate(items): + nxt = items[i + 1] if i + 1 < len(items) else None + gap = SENTENCE_GAP + (SCENE_GAP if nxt and nxt["scene"] != item["scene"] else 0) + dur_frames = max(1, round((item["durationSec"] + gap) * FPS)) + result[item["id"]] = (cursor_frames / FPS, dur_frames / FPS) + cursor_frames += dur_frames + return result + + +def main() -> None: + parser = argparse.ArgumentParser(description="按句 id 抽帧视觉 QA") + parser.add_argument("--project", default=".", help="视频工程根目录(含 video/ 与 out/)") + parser.add_argument("--scene", help="按幕抽样(如 P1),与位置参数 ids 二选一") + parser.add_argument("--offset", type=float, default=0.0, help="时间轴整体偏移(草渲与终渲时间基准不一致时用)") + parser.add_argument("video", help="渲染产物 mp4 路径") + parser.add_argument("ids", nargs="*", help="句 id 列表(与 --scene 二选一)") + args = parser.parse_args() + if bool(args.scene) == bool(args.ids): + parser.error("ids 与 --scene 必须二选一") + + root = Path(args.project).resolve() + video = Path(args.video).resolve() + manifest = root / "video" / "public" / "audio" / "manifest.json" + out = root / "out" / "frames" + + tl = timeline(manifest) + offset = args.offset + if args.scene: + prefix = args.scene.lower() + "-" + ids = [k for k in tl if k.startswith(prefix)] + ids = ids[:: max(1, len(ids) // 8)] # 每幕最多抽 ~8 帧 + else: + ids = args.ids + + out.mkdir(parents=True, exist_ok=True) + ffmpeg = ["pnpm", "exec", "remotion", "ffmpeg"] + for sid in ids: + if sid not in tl: + print(f"跳过未知句 id: {sid}") + continue + start, dur = tl[sid] + ts = start + dur / 2 - offset + dst = out / f"{sid}.png" + try: + subprocess.run( + [ + *ffmpeg, + "-y", + "-ss", + f"{ts:.3f}", + "-i", + str(video), + "-frames:v", + "1", + "-update", + "1", + str(dst), + ], + cwd=root / "video", + check=True, + capture_output=True, + text=True, + ) + except subprocess.CalledProcessError as e: + print(f"ffmpeg 失败({sid}): {(e.stderr or '')[-500:]}") + raise + print(f"{sid} @ {ts:.2f}s -> {dst.relative_to(root)}") + + +if __name__ == "__main__": + main() diff --git a/media/pipeline/scripts/tts.py b/media/pipeline/scripts/tts.py new file mode 100644 index 00000000..d3208361 --- /dev/null +++ b/media/pipeline/scripts/tts.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +"""逐句合成配音并产出时长 manifest——公共管线版本。 + +- 输入:<工程>/script/narration.json(单一事实源派生) +- 输出:<工程>/video/public/audio/{id}.mp3 + <工程>/video/public/audio/manifest.json +- 引擎:edge-tts(免密钥);每句一个文件,幂等(文本未变则跳过)。 + +用法:uv run --no-project --with edge-tts --with mutagen media/pipeline/scripts/tts.py \ + --project media/<工程> [--voice zh-CN-YunxiNeural] [--rate +4%] [--force] + 工程内薄包装等价于:uv run --no-project --with edge-tts --with mutagen scripts/tts.py +""" + +from __future__ import annotations + +import argparse +import asyncio +import hashlib +import json +from pathlib import Path + +import edge_tts +from mutagen.mp3 import MP3 + +DEFAULT_VOICE = "zh-CN-YunxiNeural" +DEFAULT_RATE = "+4%" +CONCURRENCY = 6 +RETRIES = 4 + + +def tts_text(text: str) -> str: + """口播文本微调:破折号换为逗号停顿,避免 TTS 念成怪音。""" + return text.replace("——", ",").replace("……", "。") + + +async def synth_one( + sem: asyncio.Semaphore, + item: dict, + force: bool, + voice: str, + rate: str, + out_dir: Path, +) -> dict: + sid, text = item["id"], item["text"] + mp3 = out_dir / f"{sid}.mp3" + meta = out_dir / f"{sid}.sha" + digest = hashlib.sha1(f"{voice}|{rate}|{text}".encode()).hexdigest() + + if not force and mp3.exists() and mp3.stat().st_size > 0 and meta.exists() and meta.read_text() == digest: + pass + else: + async with sem: + last_err: Exception | None = None + for attempt in range(RETRIES): + try: + communicate = edge_tts.Communicate(tts_text(text), voice, rate=rate) + await communicate.save(str(mp3)) + if mp3.stat().st_size == 0: + raise RuntimeError("空音频文件") + meta.write_text(digest) + break + except Exception as e: # noqa: BLE001 - 网络服务需要整体重试 + last_err = e + await asyncio.sleep(1.5 * (attempt + 1)) + else: + raise RuntimeError(f"{sid} 合成失败: {last_err}") + + duration = MP3(str(mp3)).info.length + return {**item, "durationSec": round(duration, 3)} + + +async def main() -> None: + parser = argparse.ArgumentParser(description="逐句 edge-tts 合成 + 时长 manifest") + parser.add_argument("--project", default=".", help="视频工程根目录(含 script/ 与 video/)") + parser.add_argument("--voice", default=DEFAULT_VOICE, help="edge-tts 语音(默认 zh-CN-YunxiNeural)") + parser.add_argument("--rate", default=DEFAULT_RATE, help="语速(默认 +4%%)") + parser.add_argument("--force", action="store_true", help="忽略缓存强制重合成") + args = parser.parse_args() + + root = Path(args.project).resolve() + src = root / "script" / "narration.json" + out_dir = root / "video" / "public" / "audio" + + items = json.loads(src.read_text(encoding="utf-8")) + out_dir.mkdir(parents=True, exist_ok=True) + sem = asyncio.Semaphore(CONCURRENCY) + results = await asyncio.gather( + *(synth_one(sem, i, args.force, args.voice, args.rate, out_dir) for i in items) + ) + + manifest_path = out_dir / "manifest.json" + manifest_path.write_text( + json.dumps(results, ensure_ascii=False, indent=1) + "\n", encoding="utf-8" + ) + total = sum(r["durationSec"] for r in results) + print(f"合成 {len(results)} 句,纯语音总时长 {total / 60:.2f} 分钟") + print(f"manifest: {manifest_path}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/media/pipeline/skills/01-paper-extraction.md b/media/pipeline/skills/01-paper-extraction.md new file mode 100644 index 00000000..3b295397 --- /dev/null +++ b/media/pipeline/skills/01-paper-extraction.md @@ -0,0 +1,43 @@ +# Skill 01 · 论文精读提取(并行子代理) + +> Stage ①:把论文全文转化为科普视频的**单一事实源** `research/paper-notes.md`。 +> 本文件是提取代理的提示词规格,可直接作为 Workflow 子代理 prompt 底稿。 + +## 输入 + +- 论文 PDF 绝对路径(或 HTML 版 URL)。 +- 分章清单(每章一个代理,并行执行;章的粒度以「一个代理能在一次上下文内精读完」为准,长综述通常 8–10 章)。 + +## 每章代理任务 + +通读所辖章节全文(不是摘要、不是跳读),按以下**四段式结构**输出: + +### 1. 章节主旨综述段(中文,300–600 字) +- 本章解决什么问题、在全文中的位置、组织逻辑(作者按什么维度切分小节)。 +- 形式化定义原样摘录(符号 + 一句话白话解释)。 + +### 2. 代表方法列表 +每个方法一条:`- **名称(作者,年份)**:机制一句话(通俗但准确)。(例:论文原文表述 "...")` +- 覆盖正文与表格点名的方法;表格-only 方法单独分组标注。 +- 机制描述必须落在论文原文的动词与对象上,不自行引申。 + +### 3. 风险 / 挑战 / 防护 +- 论文明确列出的失败模式、trade-off、防护措施;保留关键英文术语。 + +### 4. 科普叙事素材(金句 / 比喻 / 例子) +- 每条:【标签】英文原句(如有)→ 中文白话 → 画面感建议。 +- 优先收录:反直觉断言、具体数字、有名字的系统、作者自评的边界句。 +- 这一段是后续逐字稿「记忆点」的原料库,宁多勿漏。 + +## 纪律(硬约束) + +1. **零编造**:每条内容须能回溯到论文原文;不确定的写「论文未展开」。 +2. 引用编号/图表号原样保留(如 Figure 4、Table 3),便于校验。 +3. 不做价值判断、不添加论文之外的观点。 +4. 英文原句须逐字精确(供字幕角标与事实核查复用)。 + +## 汇编与验收 + +- 主代理合并各章产出 → 头部补:来源(IEEE 引用)、作者/机构、提取方式与日期、与仓库既有调研报告的交叉引用。 +- 一致性复核:跨章术语统一(同一概念不出现两种译名)、编号连续、重复方法去重。 +- 验收:抽 10 条断言 grep 原文验证命中;无命中项打回重查。 diff --git a/media/pipeline/skills/02-planning.md b/media/pipeline/skills/02-planning.md new file mode 100644 index 00000000..4c489b4e --- /dev/null +++ b/media/pipeline/skills/02-planning.md @@ -0,0 +1,25 @@ +# Skill 02 · 策划案生成 + +> Stage ②:基于 `research/paper-notes.md` 产出 `script/planning.md`——全片的叙事与视觉蓝图。 + +## 产出结构(六节) + +1. **定位表**:平台(B 站/YouTube 中长视频)、时长目标(硬约束区间)、形态(AI 配音 + 代码动画,无真人)、受众(不预设 ML 背景的普通人)、核心内容范围(论文章节取舍)。 +2. **叙事策略**: + - 一个贯穿全片的拟人化/比喻体系(论文的形式化概念 → 生活意象,全片一致); + - 一条主线问题(钩子 → 悬念 → 回答); + - 记忆点节奏(约每 60–90 秒一个,全部取自 paper-notes 第 4 段素材); + - 理性收尾原则(不贩卖焦虑,把悬念留在开放问题上)。 +3. **视觉语言**: + - **色彩语义契约**:为本集核心概念分配专属色(如上集 蓝=改大脑/橙=改装备);任何示意图严格用色; + - 深色底 `#0E1116` 系、警示红 `#FF5C5C`、确认绿 `#7ED321`、金句卡衬线体; + - 公式只作画面角标彩蛋,不进口播主线。 +4. **分幕结构表**:幕号 | 目标时间 | 主题 | 叙事要点(回溯 paper-notes)| 视觉锚点。通常 6–7 幕。 +5. **生产管线图**(Mermaid):文档层→配音层→视觉层,标注单一事实源节点。 +6. **边界与不做的事**:BGM 留空轨、论文外观点不进口播、许可注意。 + +## 纪律 + +- 每个叙事要点须指向 paper-notes 的具体小节; +- 取舍原则:深度 > 广度,砍掉的章节在收尾「一句话带过」而不是硬塞; +- 时长预算:中文口播约 280 字/分钟;各幕目标时间是规划值,最终以配音实测为准。 diff --git a/media/pipeline/skills/03-narration.md b/media/pipeline/skills/03-narration.md new file mode 100644 index 00000000..0e94bc7e --- /dev/null +++ b/media/pipeline/skills/03-narration.md @@ -0,0 +1,42 @@ +# Skill 03 · 逐字稿写作 + +> Stage ③:撰写 `script/narration.md`——全片口播的**单一事实源**。定稿后一切下游(TTS/字幕/分镜/动画)均由它派生。 + +## 格式契约(build_narration.py 解析规则) + +```markdown +# 逐字稿:<片名>(vN,已过真实性+易懂性双重校验) + +> **格式约定**:`- [句id] 口播文本`——每行一句,一句 = 一条字幕 = 一段配音。 +> `>` 引用块为画面备注,不进入配音。英文方法名原则上不口播,做成画面角标。 +> 事实源:[../research/paper-notes.md](../research/paper-notes.md) + +## P0 幕标题 + +> 画面:……(本段画面的导演备注) + +- [p0-01] 第一句。 +- [p0-02] 第二句。 + +> 角标:MethodName +``` + +- 幕标题 `## P`;句 id 必须 `p-` 前缀、全片唯一(含字母后缀如 `p2-37b` 允许,用于事后插句)。 +- 每句一个完整语义单元(一条字幕),长度 8–35 字为宜;TTS 微调规则:`——`→逗号停顿、`……`→句号。 + +## 写作纪律 + +1. **事实回溯**:每个论文断言必须能在 paper-notes 找到对应条目;论文外内容须口播标明「论文之外多说一句」。 +2. **口语化**:短句、主谓宾、单句单义;禁用「综上所述」「值得注意的是」等书面腔。 +3. **术语降落**:新概念第一次出现必须配比喻(paper-notes 第 4 段的素材库);英文专名进角标不进口播(个别已成为中文口语的除外,如 ChatGPT)。 +4. **节奏**:每 60–90 秒一个记忆点(金句/反转/数字);每幕结尾留半句悬念钩到下一幕。 +5. **数字精确**:论文数字原样(如 +16.2 个百分点、~1200 个),不四舍五入成「很多」。 +6. 收尾理性:明确当前技术的边界,不渲染末日/奇点焦虑。 + +## 自检清单(定稿前) + +- [ ] 通读一遍模拟口播,无拗口句、无超 40 字长句; +- [ ] 每幕句数与其目标时长匹配(句均 ~1.9s); +- [ ] 每个断言 grep paper-notes 可命中; +- [ ] 角标(英文方法名)已随句标注; +- [ ] 估算时长(280 字/分)落在硬约束区间内。 diff --git a/media/pipeline/skills/04-verification.md b/media/pipeline/skills/04-verification.md new file mode 100644 index 00000000..61fa3050 --- /dev/null +++ b/media/pipeline/skills/04-verification.md @@ -0,0 +1,30 @@ +# Skill 04 · 双重校验(真实性 + 易懂性) + +> Stage ④:逐字稿定稿前的质量门。可由两个独立子代理并行执行(互不污染视角)。 + +## A. 真实性校验(Veracity) + +逐句扫描 narration.md,产出核查表: + +| 句 id | 断言摘要 | paper-notes 锚点 | 判定 | +|---|---|---|---| +| p2-14 | 一致≠正确,自信地错会放大 | §5.2 风险第 3 条 | ✅ | + +- **判定级别**:✅ VERIFIED(原文可回溯)/ ⚠️ ANALOGY(比喻性引申,比喻与事实边界清晰)/ ❌ RISKY(无锚点或与原文有出入)/ ✏️ REWRITE(表述需修正)。 +- **定稿门槛:RISKY 与未处理 REWRITE 必须为零。** +- 比喻句必须显式归类 ANALOGY 且核对本体不与论文矛盾(例如「在梦里练车」是比喻,但「梦有偏差、上路前需验证」这一约束句必须是 VERIFIED)。 +- 数字、系统名、人名、年份逐一核对。 + +## B. 易懂性评审(Accessibility) + +以「不预设 ML 背景、智商在线但外行」的观众视角通读: + +- 每个新术语出现处,前一句或后一句内是否有比喻/白话解释? +- 代词指代是否清晰(「它」「这条路」——离先行词太远则重写)? +- 是否存在连续 3 句以上无画面感抽象论述(标记加比喻或例子)? +- 金句卡候选(英文原文金句 ≤3 处/幕,过密则贬值); +- 听觉友好:避免连读歧义、避免中英夹杂同一句。 + +## 输出 + +两份报告合并为逐字稿头部版本号升级依据(如 v1 → v2,已过双重校验)。所有 REWRITE 修正直接落回 narration.md,再复跑 A 直到清零。 diff --git a/media/pipeline/skills/05-storyboard.md b/media/pipeline/skills/05-storyboard.md new file mode 100644 index 00000000..4dd50bdd --- /dev/null +++ b/media/pipeline/skills/05-storyboard.md @@ -0,0 +1,27 @@ +# Skill 05 · 分镜表生成 + +> Stage ⑤:把逐字稿切「镜」,产出 `script/storyboard.md`——Remotion 场景组件的实现规格。 + +## 产出结构 + +1. 头部:与 narration.md 句 id 对齐说明;时长以音频 manifest 实测为准的声明;**本集视觉契约**(色板 hex + 语义映射,与 planning.md 一致)。 +2. 每幕一节(对应一个场景组件 `video/src/scenes/P.tsx`),内含分镜表: + +| 镜 | 句区间 | 画面 | 动效 | +|---|---|---|---| +| 2-A 章头 | p2-01..04 | 蓝色章节卡…… | 章节转场 | + +3. 字幕规范(底部单行、一句一条、字号、与配音同步)。 +4. 实现映射:幕 ↔ 组件名对照、公共组件清单(金句卡/章节卡/字幕条/图标集)。 + +## 切镜规则 + +- 一「镜」(beat)= 一段连续句 id(2–8 句)共享同一主画面;镜内动效随句推进。 +- 句 id 区间必须**覆盖该幕全部句子、无交叠无遗漏**(组件内以 `beatWindow(sentences, sceneFrom, from, to)` 取窗口)。 +- 每镜「画面」写清:主体元素、布局、色彩(用契约色名)、出现的角标;「动效」写清:入场方式、随句节奏的推进(生长/高亮/计数)。 +- 风险/反转段显式标注色调切换(如「画面转红调」)。 + +## 验收 + +- 逐幕核对句 id 连续性(首个 beat 起于本幕第一句,末个 beat 止于本幕最后一句,相邻 beat 区间无缝衔接); +- 每镜画面均可在 Remotion 用现有公共组件 + 少量定制实现(不出现无法代码化的素材需求)。 diff --git a/media/self-improving-agents-video/scripts/build_narration.py b/media/self-improving-agents-video/scripts/build_narration.py index 849a5164..c543cf73 100644 --- a/media/self-improving-agents-video/scripts/build_narration.py +++ b/media/self-improving-agents-video/scripts/build_narration.py @@ -1,52 +1,23 @@ #!/usr/bin/env python3 -"""从 narration.md 解析生成 narration.json(逐句:id/scene/text)。 +"""薄包装:转发到公共管线 media/pipeline/scripts/build_narration.py。 -narration.md 是唯一事实源;本脚本是纯派生转换,不做任何内容改写。 -用法:uv run --no-project scripts/build_narration.py +实现已收敛至仓库级单一事实源;本文件仅保留原 CLI 契约 +(uv run --no-project scripts/build_narration.py)。 """ from __future__ import annotations -import json -import re +import runpy +import subprocess +import sys from pathlib import Path -ROOT = Path(__file__).resolve().parent.parent -SRC = ROOT / "script" / "narration.md" -DST = ROOT / "script" / "narration.json" - -LINE_RE = re.compile(r"^- \[(?P[a-z0-9-]+)\]\s+(?P.+)$") -SCENE_RE = re.compile(r"^## (?PP\d+)\b") - - -def main() -> None: - scene = "" - items: list[dict[str, str]] = [] - seen: set[str] = set() - for raw in SRC.read_text(encoding="utf-8").splitlines(): - if m := SCENE_RE.match(raw): - scene = m.group("scene") - continue - if m := LINE_RE.match(raw): - sid, text = m.group("id"), m.group("text").strip() - if sid in seen: - raise SystemExit(f"重复句 id: {sid}") - if not sid.startswith(scene.lower() + "-"): - raise SystemExit(f"句 id {sid} 与所在幕 {scene} 不一致") - seen.add(sid) - items.append({"id": sid, "scene": scene, "text": text}) - - DST.write_text( - json.dumps(items, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" - ) - total_chars = sum(len(i["text"]) for i in items) - per_scene: dict[str, int] = {} - for i in items: - per_scene[i["scene"]] = per_scene.get(i["scene"], 0) + 1 - print(f"句数: {len(items)} 总字数: {total_chars}") - print(f"各幕句数: {per_scene}") - print(f"估算时长(280字/分): {total_chars / 280:.1f} 分钟") - +PIPELINE_SCRIPT = Path(__file__).resolve().parents[2] / "pipeline" / "scripts" / "build_narration.py" if __name__ == "__main__": - main() + sys.exit( + subprocess.run( + [sys.executable, str(PIPELINE_SCRIPT), "--project", str(Path(__file__).resolve().parent.parent), *sys.argv[1:]], + check=False, + ).returncode + ) diff --git a/media/self-improving-agents-video/scripts/qa_frames.py b/media/self-improving-agents-video/scripts/qa_frames.py index 119b21a7..0e8a4957 100644 --- a/media/self-improving-agents-video/scripts/qa_frames.py +++ b/media/self-improving-agents-video/scripts/qa_frames.py @@ -1,94 +1,22 @@ #!/usr/bin/env python3 -"""按句 id 从渲染产物中抽帧,用于视觉 QA。 +"""薄包装:转发到公共管线 media/pipeline/scripts/qa_frames.py。 -时序常量须与 video/src/timing.ts 保持一致(FPS/句间停顿/幕间停顿/片头引导)。 - -用法:uv run --no-project scripts/qa_frames.py <句id> [句id ...] - uv run --no-project scripts/qa_frames.py --scene P1 # 该幕每镜首句 -输出:out/frames/{句id}.png +实现已收敛至仓库级单一事实源;本文件仅保留原 CLI 契约 +(uv run --no-project scripts/qa_frames.py [--offset N] <句id|--scene P1>)。 """ from __future__ import annotations -import json import subprocess import sys from pathlib import Path -ROOT = Path(__file__).resolve().parent.parent -MANIFEST = ROOT / "video" / "public" / "audio" / "manifest.json" -OUT = ROOT / "out" / "frames" - -# 与 video/src/timing.ts 对齐 -FPS = 30 -SENTENCE_GAP = 0.32 -SCENE_GAP = 0.9 -LEAD_IN = 0.6 - - -def timeline() -> dict[str, tuple[float, float]]: - items = json.loads(MANIFEST.read_text(encoding="utf-8")) - result: dict[str, tuple[float, float]] = {} - cursor_frames = round(LEAD_IN * FPS) - for i, item in enumerate(items): - nxt = items[i + 1] if i + 1 < len(items) else None - gap = SENTENCE_GAP + (SCENE_GAP if nxt and nxt["scene"] != item["scene"] else 0) - dur_frames = max(1, round((item["durationSec"] + gap) * FPS)) - result[item["id"]] = (cursor_frames / FPS, dur_frames / FPS) - cursor_frames += dur_frames - return result - - -def main() -> None: - video = Path(sys.argv[1]).resolve() - tl = timeline() - argv = sys.argv[2:] - offset = 0.0 - if argv and argv[0] == "--offset": - offset = float(argv[1]) - argv = argv[2:] - ids: list[str] - if argv and argv[0] == "--scene": - prefix = argv[1].lower() + "-" - ids = [k for k in tl if k.startswith(prefix)] - ids = ids[:: max(1, len(ids) // 8)] # 每幕最多抽 ~8 帧 - else: - ids = argv - - OUT.mkdir(parents=True, exist_ok=True) - ffmpeg = ["pnpm", "exec", "remotion", "ffmpeg"] - for sid in ids: - if sid not in tl: - print(f"跳过未知句 id: {sid}") - continue - start, dur = tl[sid] - ts = start + dur / 2 - offset - dst = OUT / f"{sid}.png" - try: - subprocess.run( - [ - *ffmpeg, - "-y", - "-ss", - f"{ts:.3f}", - "-i", - str(video), - "-frames:v", - "1", - "-update", - "1", - str(dst), - ], - cwd=ROOT / "video", - check=True, - capture_output=True, - text=True, - ) - except subprocess.CalledProcessError as e: - print(f"ffmpeg 失败({sid}): {(e.stderr or '')[-500:]}") - raise - print(f"{sid} @ {ts:.2f}s -> {dst.relative_to(ROOT)}") - +PIPELINE_SCRIPT = Path(__file__).resolve().parents[2] / "pipeline" / "scripts" / "qa_frames.py" if __name__ == "__main__": - main() + sys.exit( + subprocess.run( + [sys.executable, str(PIPELINE_SCRIPT), "--project", str(Path(__file__).resolve().parent.parent), *sys.argv[1:]], + check=False, + ).returncode + ) diff --git a/media/self-improving-agents-video/scripts/tts.py b/media/self-improving-agents-video/scripts/tts.py index b44d3e07..2bf5b66a 100644 --- a/media/self-improving-agents-video/scripts/tts.py +++ b/media/self-improving-agents-video/scripts/tts.py @@ -1,83 +1,22 @@ #!/usr/bin/env python3 -"""逐句合成配音并产出时长 manifest。 +"""薄包装:转发到公共管线 media/pipeline/scripts/tts.py。 -- 输入:script/narration.json(单一事实源派生) -- 输出:video/public/audio/{id}.mp3 + video/public/audio/manifest.json -- 引擎:edge-tts(免密钥);每句一个文件,幂等(文本未变则跳过)。 - -用法:uv run --no-project --with edge-tts --with mutagen scripts/tts.py [--force] +实现已收敛至仓库级单一事实源;本文件仅保留原 CLI 契约 +(uv run --no-project --with edge-tts --with mutagen scripts/tts.py [--force])。 """ from __future__ import annotations -import asyncio -import hashlib -import json +import subprocess import sys from pathlib import Path -import edge_tts -from mutagen.mp3 import MP3 - -ROOT = Path(__file__).resolve().parent.parent -SRC = ROOT / "script" / "narration.json" -OUT_DIR = ROOT / "video" / "public" / "audio" - -VOICE = "zh-CN-YunxiNeural" -RATE = "+4%" -CONCURRENCY = 6 -RETRIES = 4 - - -def tts_text(text: str) -> str: - """口播文本微调:破折号换为逗号停顿,避免 TTS 念成怪音。""" - return text.replace("——", ",").replace("……", "。") - - -async def synth_one(sem: asyncio.Semaphore, item: dict, force: bool) -> dict: - sid, text = item["id"], item["text"] - mp3 = OUT_DIR / f"{sid}.mp3" - meta = OUT_DIR / f"{sid}.sha" - digest = hashlib.sha1(f"{VOICE}|{RATE}|{text}".encode()).hexdigest() - - if not force and mp3.exists() and mp3.stat().st_size > 0 and meta.exists() and meta.read_text() == digest: - pass - else: - async with sem: - last_err: Exception | None = None - for attempt in range(RETRIES): - try: - communicate = edge_tts.Communicate(tts_text(text), VOICE, rate=RATE) - await communicate.save(str(mp3)) - if mp3.stat().st_size == 0: - raise RuntimeError("空音频文件") - meta.write_text(digest) - break - except Exception as e: # noqa: BLE001 - 网络服务需要整体重试 - last_err = e - await asyncio.sleep(1.5 * (attempt + 1)) - else: - raise RuntimeError(f"{sid} 合成失败: {last_err}") - - duration = MP3(str(mp3)).info.length - return {**item, "durationSec": round(duration, 3)} - - -async def main() -> None: - force = "--force" in sys.argv - items = json.loads(SRC.read_text(encoding="utf-8")) - OUT_DIR.mkdir(parents=True, exist_ok=True) - sem = asyncio.Semaphore(CONCURRENCY) - results = await asyncio.gather(*(synth_one(sem, i, force) for i in items)) - - manifest_path = OUT_DIR / "manifest.json" - manifest_path.write_text( - json.dumps(results, ensure_ascii=False, indent=1) + "\n", encoding="utf-8" - ) - total = sum(r["durationSec"] for r in results) - print(f"合成 {len(results)} 句,纯语音总时长 {total / 60:.2f} 分钟") - print(f"manifest: {manifest_path}") - +PIPELINE_SCRIPT = Path(__file__).resolve().parents[2] / "pipeline" / "scripts" / "tts.py" if __name__ == "__main__": - asyncio.run(main()) + sys.exit( + subprocess.run( + [sys.executable, str(PIPELINE_SCRIPT), "--project", str(Path(__file__).resolve().parent.parent), *sys.argv[1:]], + check=False, + ).returncode + ) From 76924717ae64d93916bc8cf3aec8a2f10ee0b248 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Sun, 16 Aug 2026 21:47:17 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat(video):=20=E6=96=B0=E5=A2=9E=E3=80=8A?= =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E4=B9=8B=E5=90=8E=EF=BC=8CAI=20=E6=89=8D?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E4=B8=8A=E5=AD=A6=E3=80=8B=E7=BB=8F=E9=AA=8C?= =?UTF-8?q?=E6=97=B6=E4=BB=A3=E7=BB=BC=E8=BF=B0=E7=A7=91=E6=99=AE=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E5=B7=A5=E7=A8=8B=EF=BC=88=E7=AC=94=E8=AE=B0/?= =?UTF-8?q?=E9=80=90=E5=AD=97=E7=A8=BF/=E5=88=86=E9=95=9C/Remotion=20?= =?UTF-8?q?=E5=85=A8=E9=93=BE=E8=B7=AF=EF=BC=89;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 基于清华×Frontis.AI 88 页综述《Self-Improving Agents in the Era of Experience》制作,与上集《AI 如何自己变强?》互补(改什么 vs 怎么攒经验),片尾互相引用; - research/paper-notes.md:9 个并行提取代理逐章精读产出的单一事实源(四段式:主旨/代表方法/风险防护/科普素材),IEEE 引用 + 140 号工程调研交叉引用; - script/:七幕策划案(金=经验流/青=Harness/紫=参数内化三色契约)+ 172 句逐字稿(12.6 分钟纯语音)+ 分镜表; - video/:Remotion 独立工程,七幕场景组件(P0Hook–P6Ending),manifest 驱动音画自动对轨,typecheck 零错误,草渲抽帧 QA(30+ 帧/7 幕目检)通过后终渲 1080p30(13.6 分钟,out/final.mp4 本地产物不入 git); - 根 .gitignore 追加本集产物规则;knowledge-map 增补「科普视频制作 Pipeline」条目串联基建与两部作品。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- .gitignore | 7 + docs/.agents/knowledge-map.md | 1 + media/experience-era-agents-video/README.md | 58 + .../research/paper-notes.md | 883 ++++++ .../script/narration.json | 862 ++++++ .../script/narration.md | 321 ++ .../script/planning.md | 81 + .../script/storyboard.md | 95 + .../scripts/build_narration.py | 23 + .../scripts/qa_frames.py | 22 + .../scripts/tts.py | 22 + .../experience-era-agents-video/video/.npmrc | 2 + .../video/package.json | 26 + .../video/pnpm-lock.yaml | 2607 +++++++++++++++++ .../video/remotion.config.ts | 4 + .../video/src/Main.tsx | 47 + .../video/src/Root.tsx | 35 + .../video/src/components/NarrationAudio.tsx | 16 + .../video/src/components/Subtitle.tsx | 52 + .../video/src/components/cards.tsx | 135 + .../video/src/design/theme.ts | 26 + .../video/src/index.ts | 4 + .../video/src/scenes/P0Hook.tsx | 252 ++ .../video/src/scenes/P1Anatomy.tsx | 516 ++++ .../video/src/scenes/P2FourDestinations.tsx | 611 ++++ .../video/src/scenes/P3Meta.tsx | 361 +++ .../video/src/scenes/P4Eval.tsx | 322 ++ .../video/src/scenes/P5Safety.tsx | 442 +++ .../video/src/scenes/P6Ending.tsx | 263 ++ .../video/src/timing.ts | 59 + .../video/src/types.ts | 24 + .../video/tsconfig.json | 15 + 32 files changed, 8194 insertions(+) create mode 100644 media/experience-era-agents-video/README.md create mode 100644 media/experience-era-agents-video/research/paper-notes.md create mode 100644 media/experience-era-agents-video/script/narration.json create mode 100644 media/experience-era-agents-video/script/narration.md create mode 100644 media/experience-era-agents-video/script/planning.md create mode 100644 media/experience-era-agents-video/script/storyboard.md create mode 100644 media/experience-era-agents-video/scripts/build_narration.py create mode 100644 media/experience-era-agents-video/scripts/qa_frames.py create mode 100644 media/experience-era-agents-video/scripts/tts.py create mode 100644 media/experience-era-agents-video/video/.npmrc create mode 100644 media/experience-era-agents-video/video/package.json create mode 100644 media/experience-era-agents-video/video/pnpm-lock.yaml create mode 100644 media/experience-era-agents-video/video/remotion.config.ts create mode 100644 media/experience-era-agents-video/video/src/Main.tsx create mode 100644 media/experience-era-agents-video/video/src/Root.tsx create mode 100644 media/experience-era-agents-video/video/src/components/NarrationAudio.tsx create mode 100644 media/experience-era-agents-video/video/src/components/Subtitle.tsx create mode 100644 media/experience-era-agents-video/video/src/components/cards.tsx create mode 100644 media/experience-era-agents-video/video/src/design/theme.ts create mode 100644 media/experience-era-agents-video/video/src/index.ts create mode 100644 media/experience-era-agents-video/video/src/scenes/P0Hook.tsx create mode 100644 media/experience-era-agents-video/video/src/scenes/P1Anatomy.tsx create mode 100644 media/experience-era-agents-video/video/src/scenes/P2FourDestinations.tsx create mode 100644 media/experience-era-agents-video/video/src/scenes/P3Meta.tsx create mode 100644 media/experience-era-agents-video/video/src/scenes/P4Eval.tsx create mode 100644 media/experience-era-agents-video/video/src/scenes/P5Safety.tsx create mode 100644 media/experience-era-agents-video/video/src/scenes/P6Ending.tsx create mode 100644 media/experience-era-agents-video/video/src/timing.ts create mode 100644 media/experience-era-agents-video/video/src/types.ts create mode 100644 media/experience-era-agents-video/video/tsconfig.json diff --git a/.gitignore b/.gitignore index 2b9f306a..cecd3639 100644 --- a/.gitignore +++ b/.gitignore @@ -302,3 +302,10 @@ media/self-improving-agents-video/out/ media/self-improving-agents-video/**/*.mp4 media/self-improving-agents-video/**/*.mp3 media/self-improving-agents-video/**/*.wav + +# 科普视频工程(media/experience-era-agents-video)本地产物:同上集规则。 +media/experience-era-agents-video/video/public/audio/ +media/experience-era-agents-video/out/ +media/experience-era-agents-video/**/*.mp4 +media/experience-era-agents-video/**/*.mp3 +media/experience-era-agents-video/**/*.wav diff --git a/docs/.agents/knowledge-map.md b/docs/.agents/knowledge-map.md index b90861da..7e0cb424 100644 --- a/docs/.agents/knowledge-map.md +++ b/docs/.agents/knowledge-map.md @@ -71,4 +71,5 @@ - [经验时代的自驱迭代进化智能体调研](../research/self-evolution/140-experience-era-self-improvement.md) — 精读 88 页综述提炼 Harness 经验基础设施框架,对照 negentropy Routine 闭环诊断出两处根本断点(Judge 无历史锚点 ±20 振荡 / `decay_override` 死配置致经验记忆 7-8 天全灭 + 反馈链断),落地双支柱改进:证据锚定纵向评估(trajectory + progress_evidence + 量化振荡 opt-in)与经验记忆闭环补强(衰减修复 E / 检索反馈闭环 B / 写入去重准入 A / 失败教训结构化与注入 C-D) - [Skill 进化闭环 × 自我改进评测](../research/self-evolution/141-skills-evolution-and-si-measurement.md) — 综述 §3(Skills 三阶段 Evolution 缺口)/ §7(Meta-Evolving 三体制)/ §8(SI 六目标 + SIP-Bench + 反事实归因)映射到 negentropy:PR [#1038](https://github.com/ThreeFish-AI/negentropy/pull/1038) 落地 eval 四表 + held-out 双相门(decide_skill_shadow/canary)+ 反事实 Skill Influence Pattern + TargetHandler 抽象 + SkillTemplateHandler 闭环(GEPA 变异 prompt_template + active_version 发布),补 140 号未覆盖的 Skills/Meta/SI 度量框架 - [arXiv §5 科普视频制作包](../../video-package/README.md) — 基于 [141 号调研同源综述](../research/self-evolution/141-skills-evolution-and-si-measurement.md)(arXiv:2607.13104 §5 基座模型自我改进)的完整视频制作包:13:42 逐字稿(N0–N6 段落 ID 主键体系,4.7 字/秒自洽)+ 46 镜头分镜表(md/csv 双格式,822s 与逐字稿/动画三表对齐)+ 单文件 Canvas 动画 demo(1920×1080、8 场景 3B1B 风格、←/→/空格/R/1-8/H 快捷键、file:// 零依赖直开)+ 71 条事实核查表(引文 100% grep 验证命中论文原文、RISKY/REWRITE 双零、ANALOGY 类比显式登记) +- [科普视频制作 Pipeline(公共基建)](../../media/pipeline/README.md) — 全仓可复用的论文→视频九阶段流水线(精读提取/策划/逐字稿 SSOT/双重校验/分镜/TTS/Remotion/抽帧 QA/终渲):中心脚本三件套(`--project` 参数化)+ 每 Stage 代理提示词规格(skills/01–05)+ 新集脚手架清单与复用边界(Python 脚本集中 SSOT、Remotion 原语复制适配);作品:[《AI 如何自己变强?》](../../media/self-improving-agents-video/README.md)(Schmidhuber 综述 · 蓝/橙契约 · 6 幕)与 [《上线之后,AI 才开始上学》](../../media/experience-era-agents-video/README.md)([140 号调研](../research/self-evolution/140-experience-era-self-improvement.md)同源清华×Frontis 综述 · 金/青/紫契约 · 7 幕 13.6 分钟,论文笔记由 9 并行代理逐章精读产出) - [自进化 Agents Team 方案(Phase 3 记忆检索面已落地)](../concepts/design/self-evolving-agents.md) — 四层自进化架构:本次落地 `engine/evolution/` 子系统(GEPA proposer + 状态机 + decision 护栏)并在记忆检索权重面接通 propose→shadow→canary→promote/rollback 全闭环(迁移 0081 + evolution_inspector),默认全关灰度;agent/skill/knowledge 面、Phase 1 tool_invocations 遥测、eval 四表留后续 diff --git a/media/experience-era-agents-video/README.md b/media/experience-era-agents-video/README.md new file mode 100644 index 00000000..5fc4b851 --- /dev/null +++ b/media/experience-era-agents-video/README.md @@ -0,0 +1,58 @@ +# 《上线之后,AI 才开始上学》科普视频工程 + +> 基于 Che Jiang, Jincheng Zhong, Yu Fu, *et al.*, "Self-Improving Agents in the Era of Experience: A Survey of Self- to Meta-Evolution," *Frontis.AI / Tsinghua University*, Jun. 2026(88 页综述,无公开 arXiv 号)的动效图解式科普视频(B 站/YouTube,约 13.6 分钟)。 +> 形态:AI 配音(edge-tts)+ Remotion 代码动画,无真人出镜。 +> 与上一集《AI 如何自己变强?》([../self-improving-agents-video/](../self-improving-agents-video/README.md),Schmidhuber 团队综述)互补:上集讲「自我进化改什么」,本集讲「部署之后经验怎么攒」;片尾互相引用。 + +## 目录结构 + +| 路径 | 说明 | +|---|---| +| `research/paper-notes.md` | 论文精读笔记——全部口播内容的**单一事实源**(9 个并行提取代理逐章产出) | +| `script/planning.md` | 策划案:受众、七幕结构、三色视觉契约(金=经验流 / 青=Harness / 紫=参数内化) | +| `script/narration.md` | 逐字稿(唯一维护处),`- [句id] 文本` 一句一行 | +| `script/narration.json` | 派生物:拆句结果,供 TTS 与字幕消费(勿手改) | +| `script/storyboard.md` | 分镜表:镜号 ↔ 句 id 区间 ↔ 画面动效(场景组件实现规格) | +| `scripts/*.py` | 薄包装 → 公共管线 [media/pipeline/scripts/](../pipeline/scripts/)(`--project` 透传) | +| `video/` | Remotion 工程(独立 pnpm 项目,`ignore-workspace` 与主仓隔离) | +| `out/` | 渲染产物(gitignored) | + +## 复现流水线 + +```bash +# 1. 改稿后重建逐句 JSON +uv run --no-project scripts/build_narration.py + +# 2. 合成配音(增量幂等;首跑约 3-5 分钟,需网络) +uv run --no-project --with edge-tts --with mutagen scripts/tts.py + +# 3. 预览 +cd video && pnpm install --ignore-workspace && pnpm dev + +# 4. 草渲(半分辨率快速迭代) +cd video && pnpm run render:draft # -> ../out/draft.mp4 + +# 5. 抽帧 QA(在工程根目录;--scene 与句 id 二选一) +uv run --no-project scripts/qa_frames.py out/draft.mp4 --scene P2 + +# 6. 终渲 1080p30 +cd video && pnpm run render # -> ../out/final.mp4 +``` + +## 音画同步机制 + +每句一段 MP3;`tts.py` 产出 `video/public/audio/manifest.json`(含每句实测时长);Remotion `calculateMetadata` 读取 manifest 计算全片时间轴(句间 0.32s、幕间 +0.9s、片头 0.6s、片尾 2s)——改稿后**只需重跑 1→2→4**,无需手工对轨。 + +## 内容修改守则 + +- 口播内容改动只发生在 `script/narration.md`;所有论文断言须可回溯 `research/paper-notes.md`; +- 新增/修改句后,受影响 beat 的句 id 区间需在对应场景组件(`video/src/scenes/`)同步; +- 三色语义是全片视觉契约:金 `#F5C542` = 经验流(trace→z),青 `#2DD4BF` = Harness 运行时,紫 `#B78CFF` = 参数内化。 + +## 论文引用(IEEE) + +[1] C. Jiang, J. Zhong, Y. Fu, *et al.*, "Self-Improving Agents in the Era of Experience: A Survey of Self- to Meta-Evolution," *Frontis.AI / Tsinghua University*, Jun. 2026.(Harness 形式化、技能/记忆/环境/参数四面、元进化、SI 六评测目标、移动攻击面) + +## 许可注意 + +Remotion 对超过 3 人的公司需商业授权(个人/小团队免费);若本视频转为公司用途,请评估许可或迁移 MIT 协议的 Motion Canvas。配音来自 edge-tts(微软在线语音),发布前请自行确认平台对合成语音的标注要求。 diff --git a/media/experience-era-agents-video/research/paper-notes.md b/media/experience-era-agents-video/research/paper-notes.md new file mode 100644 index 00000000..dc1e4bd4 --- /dev/null +++ b/media/experience-era-agents-video/research/paper-notes.md @@ -0,0 +1,883 @@ +# 论文精读笔记:Self-Improving Agents in the Era of Experience: A Survey of Self- to Meta-Evolution + +> **来源**:Che Jiang, Jincheng Zhong, Yu Fu, *et al.*, "Self-Improving Agents in the Era of Experience: A Survey of Self- to Meta-Evolution," *Frontis.AI / Tsinghua University*, Jun. 2026.(88 页,无公开 arXiv 号) +> **作者**:清华大学 × Horizon Research (Frontis.AI) 联合团队(Che Jiang、Kaiyan Zhang 项目负责;Ning Ding、Kaiyan Zhang、Bowen Zhou 通讯) +> **用途**:本笔记是科普视频《经验时代》的**单一事实源**——逐字稿中的每个论文断言必须能回溯到本文件的对应条目。 +> **提取方式**:2026-08-16 由 9 个并行提取代理对论文 PDF 全文逐节精读产出(§1–2、§3、§4、§5、§6、§7、§8、§9、§10 各一代理)。 +> **交叉引用**:工程向应用调研见 [docs/research/self-evolution/140-experience-era-self-improvement.md](../../../docs/research/self-evolution/140-experience-era-self-improvement.md)(同一论文映射到本仓 Routine 闭环的双支柱改进)。 +> **与本系列上一集的关系**:上一集《AI 如何自己变强?》依据的是 Schmidhuber 团队综述(arXiv:2607.13104,聚焦“自我进化改什么:大脑 θ / 装备 Σ”);本集论文聚焦“部署之后经验如何变成实力”(Harness=经验基础设施、trace→经验、四代更新面、元进化、SI 评测、移动攻击面)。两篇互补:上一集回答“改哪”,本集回答“上线之后怎么攒”。 + +--- + +## §1–2 引言与 Harness 范式:从“经验时代”到运行时基础设施 + +(一)本章是全文的理论地基:§1 提出总问题——在“经验时代”(Era of Experience [Silver and Sutton, 2025]),长期部署的智能体如何借助 harness 中介的控制积累经验、自我进化乃至元进化;§2 给出全文的分析单元与历史坐标。作者从 Gödel Machine 的“证明门”(自我修改须先证明期望效用提升)讲到 Darwin Gödel Machine 用“经验选择”取代证明门,说明改进的可信度来源已从形式证明转向“改动周围的证据对未来尝试持续可用”。随后把 harness 定义为模型外围的运行时控制层(规划、工具、上下文、记忆、权限、验证、恢复、停止条件、升级路径在此被指定、观察与修订),即“经验基础设施”,其重要性源于时间尺度不对称:harness 状态比模型权重更便宜、更频繁地可检查、可修订、可治理。§2.1 给出核心形式化:A_t = ⟨M_θt, H_t, U_t, E_t⟩(基座模型、可变 harness、用户侧、环境侧四元组,t 为墙钟部署时间);交互切成不规则 trace 窗口 τ_i = {α | time(α) ∈ [t_{i−1}, t_i)},窗口关闭时 harness 将其编译为经验 z_i = H_{t_i}(τ_i)(刻意不是原始日志,而是经过过滤/压缩/归因/验证的可复用经验),累积为经验池 Z_T;快速尺度上 H_{t_i+} = Φ_H(H_{t_i}, z_i) 更新 harness,慢速尺度上 θ_{s_k+} = Φ_M(θ_{s_k}, Z_{s_k}) 固化进参数——“部署后变聪明”正发生于此(Figure 2)。§2.2 以三代演进史(Gen1 任务级循环→Gen2 跨任务复用→Gen3 产品化自进化运行时,Figure 3)回答“我们如何走到今天”;§2.3 给出组织逻辑(外部化→参数固化→元层协调→评测与安全);§2.4 以 Table 1 按“什么在进化/在哪进化/如何驱动”三问对比 23 篇既有综述,将本文定位在三线交叠处。 + +### 代表方法 + +**引言中的自进化谱系(§1)** +- **Gödel Machine(Schmidhuber, 2003)**:理想化的自改进机——只有当证明了期望效用提升后才允许自我修改(“证明门”的出处)。 +- **Darwin Gödel Machine(Zhang et al., 2025d)**:让智能体修改自身代码、评估变体、把成功后裔存入档案库——用“经验选择”替代证明门。 +- **自动化 AI 研究循环(Recursive, 2026)**:提出的研究改动被实现、测试、检查回归与 reward hacks,然后折入上下文供后续尝试使用。 +- **AlphaEvolve(AlphaEvolve team, 2025)/ SkillRL(Xia et al., 2025)/ Agent0(Xia et al., 2026a)**:三个有名字的系统,共同点是从孤立任务执行转向“工程化的改进过程”,依赖能收集经验、支持评估、治理变更边界的持久运行时基础设施。 + +**harness 术语的工程来源(§1)** +- **Anthropic managed-agent stack 与 Claude Agent SDK(Martin et al., 2026; Young, 2025)**:harness 指调用 Claude 并在持久会话与执行沙箱之间路由工具调用的循环。 +- **Guides 与 Sensors(Böckeler, 2026)**:编码智能体实践中的控制二分法——guides 在行动前塑造“允许/鼓励做什么”,sensors 在行动后暴露反馈让智能体纠偏。 +- **从业者社区用法(Martin, 2026; Xu, 2026b; Osmani, 2026)**:harness 泛指模型外围控制层;Osmani 将这类工作风格称为 "loop engineering"。 + +**Gen 1:任务级循环(§2.2)** +- **WebGPT(Nakano et al., 2022)**:语言模型在浏览器式环境中操作并用引用支撑长文回答。 +- **SayCan(Ahn et al., 2022)**:把语言模型计划锚定在机器人可供性(affordances)上,使动作可行性成为循环一部分。 +- **ReAct(Yao et al., 2023)**:把“推理—行动交错”变成跨知识与决策任务的通用提示模式。 +- **Reflexion(Shinn et al., 2023)**:在有界 episode 内加入言语反馈与自反思,是后续自改进工作的先声,但仍以 episode 为中心。 + +**Gen 2:持久可复用运行时(§2.2)** +- **Voyager(Wang et al., 2023)**:自动课程表 + 可执行技能库 + 反馈驱动的程序修复,把先前交互变成可复用行为。 +- **MetaGPT(Hong et al., 2024)/ AutoGen(Wu et al., 2024b)**:把多智能体角色、会话模式与协调逻辑变成显式运行时结构。 +- **LangGraph(LangChain Team, 2024)**:用带分支、检查点、可恢复执行的有状态图表示智能体工作流。 +- **SWE-agent(Yang et al., 2024b)/ OpenHands(Wang et al., 2025c)**:走向智能体—计算机接口:仓库导航、文件编辑、测试执行、沙箱化执行。 + +**Gen 3:产品化自进化运行时(§2.2)** +- **Claude Code(Anthropic, 2025)/ Codex(OpenAI, 2025)/ Cursor 3(Cursor, 2026)**:智能体运行时成为“开发基底”——运行于终端/仓库/云工作空间,维护任务状态、调工具、改文件、跑测试,并以可审查工件交还人类。 +- **OpenClaw(OpenClaw Contributors, 2026)**:暴露持久、可编辑的 harness 表面。 +- **Hermes Agent(Nous Research, 2026)**:always-on 个人智能体,具备持久记忆、智能体自管理技能、cron、MCP 与网关式工具集成。 +- **MetaClaw(Xia et al., 2026b)**:研究快外部适应 + 慢策略固化的组合。 +- **OpenClaw-RL(Wang et al., 2026l)**:把 live next-state 信号变成智能体运行时内的策略学习监督。 +- **Agentic Harness Engineering(Lin et al., 2026b)**:把工具、中间件、技能、记忆、子智能体配置当作可编辑、可观察、可验证的演化目标。 + +**概念源头** +- **Era of Experience(Silver and Sutton, 2025)**:未来进步日益来自智能体与环境交互产生的经验、接地奖励与长程后果。 +- **经典智能体五属性(Russell and Norvig, 2020)**:自主控制、环境感知、长时间运行、适应变化、目标导向。 + +**§2.4 相关综述(均入 Table 1,正文亦有讨论)** +- **系统级/harness 综述线**:Wang et al. [2024] 与 Xi et al. [2023](LLM 智能体总框架);Xu [2026a](跨架构/应用/评测);Chen et al. [2025a](“模型+外部组件”的复合系统观);Meng et al. [2026a](把 harness 当第一等基础设施层,形式化其执行/工具/上下文/状态/生命周期/验证功能);Li et al. [2026b](ETCLOVG 分类法,映射 170+ 开源项目);Zhou et al. [2026a](外部化 externalization 框架);Lu et al. [2026a](围绕 open policy/environment/population/substrate 组织开放部署智能体)。 +- **harness 组件综述线**:技能综述 Jiang et al. [2026b]、Xu and Yan [2026];记忆综述 Zhang et al. [2024b]、Du [2026](write–manage–read、遗忘、检索、评测、安全);工作流与上下文工程综述 Mei et al. [2025]、Yue et al. [2026];环境工程综述 Li et al. [2026a];评测与安全综述 Yehudai et al. [2025]、Mohammadi et al. [2025]、Su et al. [2025a]。 +- **进化导向综述线**:Tao et al. [2024](LLM 级自进化的经验获取/精炼/更新/评测);Gao et al. [2026](智能体在“什么/何时/如何/何处”进化);Fang et al. [2025a](系统输入—智能体—环境—优化器的反馈环视角);Xiang et al. [2026](模型中心/环境中心/模型—环境共进化三分);Zhang et al. [2026c](智能体强化学习综述)。 + +### 风险 / 挑战 / 防护 +- **Gen 1 失败模式**:有用状态大多停留于 episode——“Once the task ended, the system usually had no durable runtime state through which later tasks could benefit from earlier experience.”(任务结束即失忆) +- **Gen 2 局限**:运行时表面持久但仍“mostly designed or configured by humans”,部署后未被系统化演化。 +- **评测混淆项(§2.3)**:须区分真实纵向增益与 overfitting、cost transfer、benchmark leakage、hidden regression。 +- **安全攻击面扩张(§2.3 + Figure 1)**:可变技能、记忆、工具、反馈通道、治理规则随演化扩大攻击面;Figure 1 点名五类威胁:Skill hijacking、Memory poisoning、Protocol exploit、Feedback manipulation、Alignment drift。 +- **证明门 vs 经验选择的 trade-off(§1)**:Gödel Machine 的证明门在现实中不可得,实证选择则要求“改动周围的证据对未来尝试持续可用且继续支撑后续行为”才可信。 +- **自动化研究循环的防护**:改动须检查 regressions 或 reward hacks 后才折入上下文(Recursive, 2026)。 +- **经验编译的防护性设计(§2.1)**:z_i “deliberately not a raw log”——必须经过过滤、压缩、归因或验证才可用于后续适应,防止原始日志直接污染更新面。 +- **既有综述的盲区(§2.4)**:组件综述“fragmentation”(各表面被孤立研究,而部署改进依赖它们在同一运行时循环内的交互);进化导向综述未系统区分哪些改进走可编辑外部表面、哪些需参数固化、哪些需元层过程。 + +### 科普叙事素材(金句/比喻/例子) +- 【总纲金句】"Making agents smarter after deployment is therefore a trace-to-capability problem"(Abstract)→ 让智能体在部署后变聪明,本质是“从 trace 到能力”的问题 → 画面:一条原始日志流水线,末端输出的是“能力”而非文本。 +- 【时代断言】"agentic AI is no longer defined only by what a model can infer from static data, but by how a deployed system accumulates, organizes, and reuses experience from interaction"(Abstract)→ 智能体的定义变了:不看你从静态数据推了什么,而看你部署后怎么攒经验、组织经验、复用经验 → 画面:静态书本 vs 边干边记的笔记本。 +- 【反直觉/时间尺度不对称】"Harness state can be inspected, revised, and governed during deployment far more frequently and cheaply than model weights, yet it directly shapes what the model sees, what actions it can take, what evidence is captured"(§2.1)→ 改外围比改大脑便宜得多,却同样决定智能体看到什么、能做什么 → 画面:不改发动机,改换挡逻辑和导航。 +- 【关键句】"This is the point at which the deployed agent can become smarter after deployment."(§2.1)→ 部署后变聪明的魔法时刻就在 trace 被编译为经验 z_i 的这一步。 +- 【精确性边界句】"The symbol z_i is deliberately not a raw log. It denotes experience that has been filtered, compressed, attributed, or verified enough to be usable for later adaptation."(§2.1)→ 经验不是日志倾倒,是提纯后的东西 → 画面:原油 vs 精炼汽油。 +- 【历史规律句】"The field arrived here by gradually externalizing more of the agent's operative state and then discovering that, once deployment-time change becomes systematic, the runtime layer itself must be treated as a first-class scientific object."(§2.2)→ 三代史一句话总结:先把智能体的“工作状态”一步步搬出模型,再发现运行时层本身成了科学研究对象。 +- 【证明→经验的类比】"The Gödel Machine formalized an ideal case in which self-modification is admitted only after a proof of expected-utility improvement [Schmidhuber, 2003]."(§1)→ 理想国要求“先证明会更好才准改自己”→ Darwin Gödel Machine 用“改了试一试、留成功的”替代 → 画面:数学证明 vs 进化档案库。 +- 【可信改进的定义】"improvement becomes credible when the evidence around a change remains available to future attempts and continues to support later behavior"(§1)→ 改进何时可信:证据留得住、后续还用得上。 +- 【从业黑话】"loop engineering"(Osmani, 2026,§1)→ 从业者已把这种工作风格命名为“循环工程”。 +- 【比喻:向导与传感器】"guides shape what the agent is allowed or encouraged to do before action, while sensors expose feedback that lets the agent detect errors and correct its trajectory after action"(Böckeler, 2026,§1)→ 行动前的“路牌”+ 行动后的“仪表盘”。 +- 【四元组的具象】U_t 含 chat、gateways、workflow interfaces、user protocols;E_t 含 filesystems、browsers、shells、MCP、A2A [A2A Protocol Contributors, 2026]、tools、tests、logs(§2.1)→ 一侧进“人的意图”,一侧接“世界的插座”。 +- 【Gen2 断言】"the agent is no longer only a prompt loop. It becomes a runtime system with reusable procedures, persistent artifacts, execution tools, and coordination mechanisms."(§2.2)→ 智能体不再只是一个提示词循环,而是一套带可复用程序、持久工件、执行工具与协调机制的运行时系统。 +- 【Voyager 例子】"its automatic curriculum, executable skill library, and feedback-driven program repair turned prior interaction into reusable behavior"(§2.2)→ 在 Minecraft 里边玩边攒技能库的经典先例。 +- 【Gen3 产品名单】Claude Code、Codex、Cursor 3、OpenClaw、Hermes Agent(§2.2)→ “harness 成为开发基底”的活例子;Hermes Agent 强调 always-on 个人智能体:durable memory、agent-managed skills、cron、MCP。 +- 【数字】Li et al. [2026b] 的 ETCLOVG 分类法"mapping more than 170 open-source projects onto that engineering surface"(§2.4)→ 170+ 个开源项目被映射到七维工程面 → 佐证 harness 已是庞大生态。 +- 【时间轴数字(Figure 3)】WebGPT 2021-12 → ReAct 2022-10 → Reflexion 2023-03 → AutoGen/MetaGPT 2023-08 → LangGraph 2024-01 → SWE-agent 2024-05 → OpenHands 2024-07 → Claude Code 2025-02 → Codex 2025-05 → OpenClaw 2026-02 → Cursor 3 2026-04:约四年半从“任务循环”走到“部署运行时自适应”。 +- 【Figure 2 画面】Meta-Agent continuously optimizes the Harness;Trace τ_i 流入经验池 Z_T,分两路:H_{t_i+}=Φ_H(H_{t_i}, z_i) 更新技能/记忆等外部面,θ_{s_k+}=Φ_M(θ_{s_k}, Z_{s_k}) 固化进参数。 +- 【风险五连(Figure 1)】Skill hijacking / Memory poisoning / Protocol exploit / Feedback manipulation / Alignment drift → 五个有名字的攻击面,可直接做“反派图鉴”。 +- 【表 1 自评定位】本文在 Long Horizon、Open-ended、Human-aided、Self-improve、Meta-evolve 五列均 ✓(Table 1)→ 与 23 篇前作对比的差异化坐标。 + +--- + +## 3 Skills:经验成为可复用程序 + +**(一)章节主旨综述段** + +本章回答“程序性经验如何变成可复用的运行时结构”:智能体在不改动基座模型参数 M_θ^t 的前提下,把 know-how 外化为可持久化入库、可被 harness 调用、可在部署后修订的技能(skill)。在全文(自进化智能体综述)中,本章紧接 §2 形式化框架,是外部经验载体的第一个专题层,作者按三阶段生命周期闭环组织全章:Skill Creation(3.3,外部来源→组织成库)、Skill Use(3.4,路由→组合→执行)、Skill Evolution(3.5,部署证据→四类更新操作→验证准入),对应 Figure 4 与状态链 𝑆ᵢᵗ →𝜏ᵢ 𝐻ᵢᵗ→ 𝑧ᵢ → 𝑆ᵢᵗ⁺ → 𝜏ᵢ₊₁。形式化定义原样摘录:技能库为时变集合 𝑆𝑡 = {𝜎₁,ₜ, …, 𝜎ₙₜ,ₜ},每个技能 𝜎ᵢ,ₜ = ⟨𝑀, 𝐼, 𝑅, 𝐴⟩;白话一句话:一个技能就是一个标准化四件套文件夹——M 是“门牌+目录页”(SKILL.md frontmatter 元数据,让运行时找得到它),I 是“说明书正文”(Markdown 正文,教模型怎么做任务),R 是“参考资料架”(references/ 下的文档、schema、样例、测试、审计记录),A 是“工具箱”(scripts/、assets/、模板、数据文件等支撑落地的资源)。库更新统一写为 𝑆ᵢᵗ⁺ = Φ_S(𝑆ᵢᵗ, 𝑧ᵢ),Φ_S 可增/退技能(±𝜎)或修订既有技能的 M/I/R/A 分量。作者强调四分结构描述的是已收敛的 SKILL.md 规范而非全部历史系统(Voyager 等早期系统以非标准化形式实现同一思想);生产侧 OpenAI 挂载技能包、OpenClaw/ClawHub 注册表与 Anthropic 渐进式披露印证其工程可用性,MUSE-Autoskill 则代表把技能生命周期当作持久适配层管理的前沿。 + +### 代表方法 + +**Skill Creation(3.3)——专家/产品 authored** +- **Anthropic Agent Skills / document skills(Anthropic,2026,工程博文)**:专家直接编写技能文件夹,运行时渐进式披露(progressive disclosure)——先见轻量元数据,relevant 时才展开 SKILL.md 与支撑文件。 +- **OpenAI skill bundles(Guo, 2026; Xu et al., 2026a)**:生产挂载式技能包,runtime 把 name/description/path 等元数据放进模型上下文,模型自行决定何时从该路径读全包。 +- **OpenClaw / ClawHub(OpenClaw Contributors, 2026; ClawHub Marketplace, 2026)**:社区注册表/市场分发层——用户在 registry 发现、安装到本地 runtime、按名字或版本加载;技能成为 "installable, routable, scoped, and versioned runtime packages"。 +- **MUSE-Autoskill(Lin et al., 2026a)**:在一条部署闭环里耦合按需技能创建、技能级记忆、管理、单测评估与反馈精修(例:"couple on-demand skill creation, skill-level memory, management, unit-test evaluation, and feedback-driven refinement in one deployed loop");Use 阶段采用 metadata-first,并为每个技能附独立 skill-level memory 文件。 + +**Source-grounded 构建** +- **仓库/工作流挖掘(Bi et al., 2026)**:从经过检验的代码库或 agent workflow 中抽取已嵌入脚本、工具与执行惯例的程序结构。 +- **Corpus2Skill(Authors, 2026)**:对语料聚类,把结果结构物化为层级 SKILL.md/INDEX.md 目录;库组织沿文档派生结构。 +- **SkillForge(Liu et al., 2026e)**:企业版——从历史支持工单挖掘工作流与工具、从内部技术文档检索领域参考,合成领域专用技能;进化侧配 failure analyser + skill diagnostician + skill optimiser 三件套。 +- **OpenSkill(Yan et al., 2026)**:用外部信息合成可迁移技能,并抽取“independently checkable anchors”构建 proxy evaluation,在创建时即可测试技能是否该入库。 + +**离线轨迹/示范蒸馏** +- **SkillX(Wang et al., 2026b)**:用更强 agent 的 rollout 提取 planning/functional/atomic 三层技能,把原始轨迹压缩成多层技能表示;库按能力粒度组织。 +- **Trace2Skill(Ni et al., 2026)**:sub-agent 处理执行轨迹、提取轨迹局部经验并汇入技能目录;进化侧做横向合并(horizontal consolidation:对比、去重、冲突消解、合并为单一统一技能目录)。 +- **AutoSkill(Yang et al., 2026d)**:把反复出现的查询与交互轨迹蒸馏成个性化可复用技能;进化侧做纵向判重(与当前 SkillBank 邻近条目对比,"add is proposed only when the candidate remains a distinct durable capability rather than a merge or discard case")。 +- **MIND-Skill(Li et al., 2026f)**:从固定轨迹池/历史对话蒸馏初始技能;验证侧检查技能是否保留可迁移程序知识而不丢关键步骤、不记忆实例特定细节。 + +**Library organization** +- **SkillNet(Liang et al., 2026a)**:把 200K+ 技能库组织成全局关系图(category、similarity、dependency、composition 关系);Use 阶段记录 dependency 与 compose_with 关系,检索后限定到选中子集形成 runtime skill graph 供工作流合成。 +- **(Li, 2026,对照缩放实验)**:平坦池中语义相近技能竞争同一任务态、使路由变差——库侧需要显式结构的动机证据。 + +**Skill Use(3.4)——路由/检索** +- **SkillsWild(Liu et al., 2026f)**:量化“理想注入 vs 真实检索”差距——强制加载精选技能可胜过大混合池检索。 +- **SkillRouter(Zheng et al., 2026)**:注册表规模下仅看元数据不够;用更全的技能文本做 compact retrieve-and-rerank 管线改善匹配。 +- **SkillRet(Cho et al., 2026)**:长文本技能匹配专项检索基准;通用检索器不自动解决技能选择,skill-specific 微调有效。 + +**组合** +- **GoSkills(Zeng et al., 2026b)**:从锚点技能出发构建局部图,依赖/产出等类型化关系提供候选弧 A_q,t,暴露技能集为节点 V_q,t,先于 executor 见到 prompt。 +- **SkillRAE(Meng et al., 2026b)**:选中技能作节点,把任务相关子单元与 "rescued cues" 挂回节点,作为执行的局部指导。 + +**执行** +- **Hermes Agent(Nous Research, 2026)**:生产侧暴露 create、update、delete、archive 式成熟生命周期动作;安装技能元数据被索引、bundle 置于已知路径、loading scope 决定可见条目。 +- **SkillSmith(Xu et al., 2026b)**:把离线技能包编译成 boundary-guided runtime interfaces——抽取算子、输入输出契约等为紧凑执行契约,而非整包进上下文;"reduced solve-stage token use, reasoning iterations, and latency on SkillsBench"。 + +**Skill Evolution(3.5)——完整环路示范** +- **SkillOpt(Yang et al., 2026b)**:打分 rollout 定义证据,优化器模型对技能文档提出有界 add/delete/replace 编辑,held-out validation gate 只放行有改进的编辑。 +- **SkillOS(Ouyang et al., 2026)**:冻结 agent executor,训练独立 skill curator 对 Markdown SkillRepo 执行 insert_skill / update_skill / delete_skill;分组任务流让早期库编辑由后续相关任务的效果回报。 + +**证据发现(Evidence Discovery)** +- **Voyager(Wang et al., 2023)**:最早具体例子——从成功的 Minecraft 经验积累可执行 JavaScript 技能,供后续任务检索。 +- **SkillsVote(Liu et al., 2026b)**:把执行轨迹分解为细粒度 skill-linked 子任务,"admits only successful, reusable, and attribution-supported discoveries to library updates"。 +- **SkillEvolver(Zhang et al., 2026b)**:让新鲜下游 agent 加载候选技能,其轨迹暴露作者 agent 自身探索可能遗漏的部署态失败;fresh-session auditor 在 held-out 评估前检查失败模式。 +- **EvoSkill(Alzubi et al., 2026)**:失败轨迹连同当前技能清单与真值答案一起记录,"so the proposer can distinguish uncovered capabilities from failures of existing skills";候选程序仅在改进 held-out validation frontier 时保留。 +- **AutoRefine(Qiu et al., 2026)**:追踪累积经验模式的 effectiveness、frequency、precision,修剪/合并低价值或冗余模式;陈旧判据=常被检索但少被使用、或用了不提升成功率。 +- **Memento-Skills(Mi et al., 2026)/ Skill-Pro(Zhou et al., 2026b)**:给技能挂跨多次执行的运行 utility/reward/failure attribution 信号,库维护取决于使用历史而非单次 episode。 +- **SkillClaw(Ma et al., 2026b)**:集体场景——多部署 agent 与用户的轨迹按被引用技能聚合,反复成功定义稳定行为、反复失败暴露共享修正目标;验证在夜间空闲用户环境、全工具链下进行。 + +**更新操作代表(Add / Edit / Prune / Version)** +- **XSkill(Jiang et al., 2026a)**:任务级技能与上下文敏感经验分离,本地经验可先更新而不立即改写技能;"a modify operation on skill is proposed only when multi-path rollouts consistently show necessity"。 +- (增:Trace2Skill 横向合并、AutoSkill 纵向判重;删:AutoRefine 识别+Hermes 产品动作;版本/回滚:OpenClaw/ClawHub 的 registry、install/load、version、distribution 表面——均见上列。) + +**验证与准入(Validation)** +- **SkillsBench(Han et al., 2026)/ SWE-Skills-Bench(Li et al., 2026c)**:基准级证据——技能能提升 agent,但自生成或错配技能会负迁移。 +- **SkillLens(Huang et al., 2026)**:评估全管线(experience generation → skill extraction → skill consumption);生成技能常有帮助但也会产生 substantial negative transfer;模型可能强抽取弱消费(或反之)。 +- **SkillTester(Wang et al., 2026h)**:with-skill 执行对比 baseline 执行;同一端到端思想可复用于新旧库对比。 +- **CoEvoSkills(Zhang et al., 2026e)**:真值任务分数权威但稀疏,pass/fail 信号不足;Surrogate Verifier 提供更密诊断反馈再升级到 ground-truth oracle,论文同时指出剩余 surrogate–oracle gap。 + +**仅出现在 Figure 4 的条目**:图中列名与正文基本重合(Human-Authored: Anthropic/ClawHub;Repo-Based: Bi et al. 2026;Doc-Based: Corpus2Skill;Traj-derived: Trace2Skill 等;Organization: SkillNet/Voyager;Routing: SkillRouter/SkillsWild/SkillRet;Composition: SkillRAE/GoSkills;Execution: OpenAI/OpenClaw/SkillTester;Evidence 按 Positive/Negative/Statistics 分组;Infrastructure: CoEvoSkills/SkillClaw;Validation: SkillsBench)。图中另有 "AddX"、"SkillEdit" 等因 PDF 渲染粘连产生的碎片,无法与正文可靠对应——论文未在正文展开。 + +### 风险 / 挑战 / 防护 + +- **好技能三难**:经验不会自动成为好技能——须 "specific enough to guide future action, general enough to transfer beyond the episode that produced it, and stable enough to remain trustworthy as the runtime changes"。 +- **平坦池污染路由(library-side risk)**:"when semantically similar skills stay in a flat pool, they compete for the same task states and make routing less reliable"(Li, 2026)→ 防护:库侧显式组织(全局关系图/能力粒度/文档派生结构),让 router 收到中间结构而非无差别池。 +- **理想注入 oracle 假设**:"many reported gains assume that the right skill is already injected. Real deployments do not have this oracle"——库规模只在 runtime 能在 context 与 latency 约束下找到、组合、执行相关程序时才有价值。 +- **库增长反噬检索**:"force-loaded curated skills can outperform retrieval from a large mixed pool, so library growth can hide useful skills instead of exposing them"(SkillsWild);且 "Showing metadata alone first, which is standard practice now, can be insufficient at registry scale"(SkillRouter)→ 防护:retrieve-and-rerank、技能专用微调(SkillRet);伴随 retrieval performance vs retrieval budget 的天然 trade-off。 +- **组合兼容性问题**:每个技能须契合周围流程的假设、产物、副作用与停止条件;composer 必须全程保持 preconditions、intermediate artifacts、side effects、termination criteria T_σ;复杂度上,naive ordered search 为 O(|S_q,t|^d),无路由则 O(|S_t|^d)——routing 缩底数、composition 压指数。 +- **库腐化(pollution gap)**:"Without revision, a growing library accumulates brittle triggers, stale assumptions, and overlapping procedures." → 防护:修剪/退役(AutoRefine 统计判据;Hermes 产品动作)。 +- **失败证据的可用性**:"failure is useful only when an analytic pipeline turns it into a specific update target"——须把失败转为局部化更新证据而非无差别 pass/fail 标签(SkillForge 四维分解:knowledge / tool-use / clarification / style)。 +- **负迁移(negative transfer)**:"skills can improve agents, but self-generated or mismatched skills can also cause negative transfer"(SkillsBench、SWE-Skills-Bench);SkillLens 显示生成技能 "can still produce substantial negative transfer",且 "a model may be a strong extractor yet a weak skill consumer, or vice versa" → 防护:端到端验证——在实际消费技能的目标模型与领域测试。 +- **修订技能的隐性作弊**:"a revised skill can look useful in the authoring context while leaking training-instance details, relying on private session context"(SkillEvolver)→ 防护:fresh-session auditor 先审后评。 +- **验证信号稀疏与代理偏差**:ground-truth 分数 authoritative but sparse,pass/fail 信号不足;surrogate 与 oracle 间存在剩余 gap(CoEvoSkills)→ 防护:Surrogate Verifier 密化反馈后再升级真值。 +- **过度编辑**:编辑应保守——XSkill 仅在多路 rollout 一致显示必要时才 modify;SkillForge 每个编辑提案携带 evidence、expected impact、risk。 +- **共享库的部署缺口(deployment gap)**:技能库成为共享源后必须显式指定 synchronization / versioning / rollback 机制(OpenClaw、ClawHub)。 +- **Creation 与 Evolution 的边界**:离线 bootstrapping 轨迹属 Creation;由已部署库产生的轨迹用于修订该库才属 Evolution——作者以此防概念混淆。 + +### 科普叙事素材(金句/比喻/例子) + +- 【定义金句】"Skills are the mechanism by which procedural experience becomes reusable runtime structure." → 技能就是让“做过的事”变成“下次直接调用的程序”。→ 画面:一次成功操作被“编译”成一个带目录页的文件夹,飞入图书馆书架。 +- 【反直觉】"The difficulty is that experience does not automatically become a good skill." → 经验不会自动变成好技能,要同时够具体、够通用、够稳定。→ 画面:三个方向拉扯的 tug-of-war(具体/通用/稳定)。 +- 【核心卖点】"new competence can be added by expanding or editing the skill library, without modifying the base model parameters" → 不动模型权重,改技能库就能长能力。→ 画面:大脑不动,往工具腰带上挂新工具。 +- 【前沿定位】"the current frontier is beginning to manage the skill lifecycle as a persistent adaptation layer" → 技能生命周期正被当作持久适配层管理(MUSE-Autoskill)。→ 画面:一条自转的传送带(创建→使用→进化)。 +- 【比喻】"An active library must be more than a flat pile of files." → 活的技能库不能是一堆平铺文件。→ 画面:散落纸堆 vs 分好类的立体书架。 +- 【反直觉+数字】"SkillNet organizes a 200K+ skill repository as a global relation graph" → 二十万+技能靠关系图管住。→ 画面:星系图般的技能关系网络。 +- 【反直觉】"force-loaded curated skills can outperform retrieval from a large mixed pool, so library growth can hide useful skills instead of exposing them" → 库越大反而可能把好技能藏起来。→ 画面:图书馆膨胀成迷宫,想要的书沉底。 +- 【金句】"Routing therefore cannot be a thin metadata lookup once the library becomes large." → 库一大,路由就不可能是薄薄一层元数据查询。→ 画面:只看书脊标签 vs 抽出书翻目录。 +- 【复杂度数字】"naive ordered search is O(|S_q,t|^d); without routing, it would be O(|S_t|^d). Routing reduces the base of this search by exposing a smaller candidate set. Composition addresses the exponent side" → 路由压底数、组合压指数。→ 画面:指数曲线被两把剪刀分别从底数和指数剪下去。 +- 【定位金句】"routing is a retrieval problem over 𝑆𝑡, whereas composition is a planning and compatibility problem over the smaller set 𝑆𝑞,𝑡" → 路由是检索问题,组合是规划+兼容问题。→ 画面:先海选后编排的两段流水线。 +- 【腐化警告】"Without revision, a growing library accumulates brittle triggers, stale assumptions, and overlapping procedures." → 不修剪的库会长出脆弱触发词、过时假设、重复流程。→ 画面:花园无人打理,杂草淹没花。 +- 【失败价值】"However, failure is useful only when an analytic pipeline turns it into a specific update target." → 失败只有被解析成具体修改目标才有用。→ 画面:报错堆栈被放大镜定位成 SKILL.md 里的一行红字。 +- 【归因升级】"This makes success an attributed evidence source rather than a raw trajectory-level signal." → 成功从“整条轨迹对/错”升级为“归因到具体技能的证据”。→ 画面:颁奖典礼上功劳分到每位队员头上。 +- 【负迁移】"skills can improve agents, but self-generated or mismatched skills can also cause negative transfer" → 技能用错地方会让模型变差。→ 画面:吃错药方,病更重。 +- 【角色错位】"a model may be a strong extractor yet a weak skill consumer, or vice versa" → 会写技能≠会用技能。→ 画面:名厨写的菜谱,学徒照做仍翻车(反之亦然)。 +- 【越权审计】"a revised skill can look useful in the authoring context while leaking training-instance details, relying on private session context" → 改出来的技能可能靠“背题+私藏上下文”作弊。→ 画面:考场上偷瞄袖口小抄的考生被请进新考场重考(fresh-session auditor)。 +- 【夜间评估】"evaluation occurs at night in idle user environments, with the full toolchain in use"(SkillClaw)→ 跨用户的集体更新在夜里、用户空闲、真实全工具链下验证。→ 画面:深夜办公室里机器人群自发上岗考试。 +- 【生命周期演化规律】"insertion dominates early, while updates become more frequent as the curator moves from expanding the repository toward refining and consolidating existing skills"(SkillOS)→ 技能库先“扩地盘”后“精装修”。→ 画面:时间轴上前半段新文件夹涌入、后半段红笔批注密布。 +- 【例子】Voyager:"accumulating executable JavaScript skills from successful Minecraft experience and retrieving them for later tasks" → 在游戏里干活攒下一兜可执行 JS 技能。→ 画面:方块小人打完怪,代码卡片收进背包,下次直接掷出。 +- 【边界自评】"This lifecycle changes agent behavior without requiring an immediate model-weight update, but they remain useful only when the library is continuously organized, tested, and maintained." → 免改权重≠免维护,库要持续组织、测试、保养。→ 画面:结尾字幕——工具腰带也需要定期保养。 +- 【生态事实】技能打包已收敛到 SKILL.md 锚定文件夹规范(脚注 1/3:https://agentskills.io/home;脚注 2:Anthropic 工程博文;脚注 4:OpenAI developers 文档),“a required SKILL.md file with optional supporting resources”。→ 画面:一个标准化的技能文件夹爆炸图(frontmatter/正文/references/scripts 四层)。 + +--- + +## 4 Memory:经验成为持久状态 + +(一)章节主旨综述段:本章解决的问题是:智能体如何让经验在单次模型调用之外持续存活——跨调用、跨会话、跨环境地保留任务相关信息,并决定哪些过去进入活跃上下文、哪些留在上下文之外可检索、哪些被压缩、修订或遗忘 [Verma, 2026]。在全文定位上,作者把记忆视为部署期(deploy-time)智能体改进的主要载体(substrate):不改模型权重即可在线积累经验。本章先划两条边界:与 RAG 不同(RAG 检索的是相对静态的语料,agent 记忆由智能体自己生产、编辑、复用);与技能层不同(技能存“怎么做”的可复用程序,记忆存“发生了什么/变了什么/失败了什么/用户偏好过什么”的状态与证据)。组织逻辑由 Figure 5 的三层结构撑起:①表示层——核心形式化对象原样摘录:"The key object is therefore a context-mediated persistence system: past information is stored outside the model, transformed into useful forms, and selectively reintroduced into context.",白话即“经验存在模型外面的外置库里,加工成有用的形态,再按需挑着送回上下文”;表示层再拆成 content unit(存什么记忆条目)与 organization structure(条目如何排布以供保留、检索、更新)两个正交设计维度。②操作层——write/admission、compression、consolidation、retrieval/activation、update/revision 五操作。③进化层——Content / Mechanism / Policy 三层自进化。Table 2 按同一结构收录代表工作,正文逐一展开;章末把“改记忆内容”与“改记忆机制(meta-memory)”的边界交给后文元进化讨论。作者强调本章聚焦外部记忆层,因为它可检查、可编辑、且能在部署期间改变。 + +### 代表方法 + +**4.2.1 记忆内容单元(Memory Content Units)** +- **Empowering Working Memory(Guo et al., 2023)**:把工作记忆当作控制问题,而非逐字转录的堆积。(原文表述 "frames this as a control problem rather than transcript accumulation") +- **Hangman(Baldelli et al., 2026)**:其失败案例表明,即便对话历史完整在场,智能体仍需要显式任务状态。("agents may need explicit task state even when the dialogue history is available") +- **Active Context Compression(Verma, 2026)**:对活跃交互历史做剪枝与压缩。("prunes and compresses active interaction history") +- **TierMem(Zhu et al., 2026a)**:原始日志保留为底层来源,摘要证据不足时可回翻。("keeps raw logs available as a lower-level source that can be revisited when summaries are insufficient") +- **WebCoach(Liu et al., 2025a)**:保存跨会话导航经验,把既往轨迹检索为任务级建议。(Table 2 亦将其归入 Consolidation) +- **Live-Evo(Zhang et al., 2026n)**:让情节记录随反馈演化。("lets episodic records evolve under feedback") +- **CAST(Ma et al., 2026a)**:围绕“角色×场景”事件与派生角色画像来组织记忆,使记忆单元本身更明确。 +- **SimpleMem(Liu et al., 2026c)**:从交互历史中提取结构化记忆单元。("extracts structured memory units from interaction history") +- **Memori(Borro et al., 2026)**:把对话改写为“三元组 + 摘要”。("rewrites dialogue into triples plus summaries") +- **Chronos(Sen et al., 2026)**:加入带日期的事件元组与日历。("adds dated event tuples and calendars") + +**4.2.2 组织结构(Memory Organization Structures)** +- **Generative Agents(Park et al., 2023)**:观察流+反思日志走 append-only 模式;证明存储观察与反思能塑造长程行为。 +- **Reflexion(Shinn et al., 2023)**:反思日志同样采用 append-only 结构(正文与 Park et al., 2023 并列引用)。 +- **Cognis(Daftari et al., 2026)**:在 append-only 底座上带版本追踪地存全量历史记录。 +- **APEX-MEM(Banerjee et al., 2026)**:以 append-only 存储显式保留信息的时间演化。("explicitly preserves the temporal evolution of information through append-only storage") +- **MemGPT(Packer et al., 2023)**:把记忆部分当作跨“prompt 可见层 / 外部层”的分页问题。("treats memory partly as a paging problem across prompt-visible and external tiers") +- **LightMem(Zhang et al., 2026h)**:在延迟约束下分离活跃存储与长期存储。 +- **Agentic Memory(Yu et al., 2026b)**:用学习型控制器耦合短期与长期存储。 +- **CLAG(Roh et al., 2026)**:介于平面归档与显式图之间——把记忆划入不断演化的语义簇,而非添加丰富类型化关系。 +- **PlugMem(Yang et al., 2026a)**:用图结构支持长程检索(与 AriadneMem 并列表述)。 +- **AriadneMem(Zhu et al., 2026b)**:证据分散在多处时用“图桥发现”(graph bridge discovery)。 +- **GAAMA(Paul et al., 2026)**:在异构记忆节点上构建关联图。("builds associative graphs over heterogeneous memory nodes") +- **MemORAI(Pham Van et al., 2026)**:带溯源意识(provenance-aware)的多关系图检索。 +- **SAGE(Wang et al., 2026g)**:把图组织做成自进化的关联记忆引擎,闭合记忆读者-写者环。 +- **H-MEM(Yu et al., 2026a)**:时间-语义树做巩固 + 实体图做多跳检索。 + +**4.3 五操作(Memory Operations)** +- **AMAC / Adaptive Memory Admission Control(Zhang et al., 2026d)**:把写入当作显式效用决策,考量因素包括未来效用、置信度、新颖度、近因性、内容类型。 +- **U-Mem(Wu et al., 2026c)**:把记忆增长变成“主动获取 + 验证”的过程,而非被动堆积。 +- **Agentic Memory(Yu et al., 2026b)**:把 store / retrieve / update / summarize / discard 全部变成对短期与长期记忆的策略动作。 +- **Nemori(Ma et al., 2025)**:与 SimpleMem、Memori 一起表明写入质量还取决于准入前候选记忆单元如何成形;其单独机制论文未展开(未列入 Table 2)。 +- **Active Context Compression(Verma, 2026)**:压缩时保留任务状态、剔除重复或超大痕迹。 +- **SimpleMem / Memori**:语义侧压缩——提取 facts、triples、profiles、events。 +- **DeMem(Zou et al., 2026)**:用决策论的率失真目标(rate-distortion objective)重新定义压缩,而非只看摘要质量。 +- **A-MEM(Xu et al., 2025b)**:通过 linking、merging、revision 让记忆随时间演化。 +- **LightMem(Zhang et al., 2026h)**:增加显式的离线长期综合(offline long-term synthesis)阶段。 +- **Auto-Dreamer(Ye et al., 2026b)**:学习一个 consolidator,把快速的会话内记忆获取与较慢的跨会话抽象/替换解耦。 +- **GAAMA / CLAG**:GAAMA 在图结构上合成高阶反思;CLAG 在簇内通过画像生成与邻域级演化做局部巩固。 +- **xMemory(Hu et al., 2026)**:把记忆视为 self-authored、revisable、action-coupled;检索时跨 messages、episodes、semantics、themes 自顶向下,而非只靠平面相似度。 +- **Chronos(Sen et al., 2026)**:按时间限定检索范围。 +- **TierMem(Zhu et al., 2026a)**:摘要证据不足时升级到原始日志。 +- **MemORAI(Pham Van et al., 2026)**:图遍历权重随查询自适应。 +- **Cognis(Daftari et al., 2026)**:检索与版本追踪耦合——激活不仅取决于相似度,还取决于存储证据的当前有效性。 +- **Live-Evo(Zhang et al., 2026n)**:依反馈在线重加权记忆。 +- **STALE(Chao et al., 2026)**:实证揭示当前系统常无法检测“隐式失效”。 +- **MemoRepair(Zhao et al., 2026b)**:对派生产物(derived artifacts)的级联修复做形式化。 +- **APEX-MEM(Banerjee et al., 2026)**:在检索时解决冲突或演化中的证据。 + +**4.4 三层自进化(Memory Evolution)** +- **内容进化**:SimpleMem、Memori、Chronos、Live-Evo(表示增益:结构化语义压缩、时间记录、在线情节加权);Auto-Dreamer、AMAC、MemoRepair、TierMem(操作增益:更好准入、离线巩固、溯源检索、修订)。原文定位:"This is the most direct external path for post-deployment improvement." +- **MetaMem(Xin et al., 2026)**:显式区分 factual memory(存任务信息)与 meta-memory(存“如何整合、检索、推理记忆碎片”的可复用经验)。 +- **MemSkill(Zhang et al., 2026f)**:把提取、整合、保留、遗忘当作由控制器选择的可复用“记忆技能”。 +- **Self-Evolving LLM Memory Extraction(Yang et al., 2026c)**:把进化环收窄到记忆提取器本身——持续改进跨异构任务提取有用记忆的提示词。 +- **SAGE(Wang et al., 2026g)/ CLAG(Roh et al., 2026)**:SAGE 在自进化图记忆引擎中闭合读者-写者环;CLAG 是轻量版——组织机制本身通过聚类与局部演化自适应。 +- **策略进化**:Agentic Memory(正文以 "AgeMem" 简称引用,引用编号指向 [Yu et al., 2026b])把记忆操作变成策略动作;MemRL(Zhang et al., 2026k)学习检索效用;DeltaMem(Zhang et al., 2026i)学习更新奖励(单独机制论文未展开);U-Mem 主动获取;AMAC 准入控制。MemRL 在 Table 2 中另被归入 Episodic trajectories。 + +**评测基准(正文点名、未入 Table 2)**:LongMemEval、MemoryArena、Mem2ActBench、EMemBench [He et al., 2026, Li et al., 2026d, Shen et al., 2026a, Wu et al., 2024a],检验持续召回、多会话依赖、记忆条件化行动、情节连续性;EMemBench 在 §4.2.1 单独被引为情节连续性的评估代表 [Li et al., 2026d]。 + +(仅出现在 Table 2 而正文未提及的方法:无——Table 2 全部条目均在正文出现;反向地,Nemori [Ma et al., 2025] 仅正文出现。) + +### 风险 / 挑战 / 防护 +- **密度 vs 保真(density versus fidelity)**:内容单元层的核心 trade-off——原始日志“优势是证据保真,弱点是密度低”("Their advantage is evidence preservation; their weakness is low density.")。 +- **平面/append-only 结构的风险**:“写入便宜且通用,但把结构重建留给之后的检索”("leaves later retrieval to reconstruct structure on demand");且 "Append-only storage accumulates redundant, stale, or malformed records."——防护即写入/准入控制(AMAC、U-Mem)。 +- **隐式失效(implicit invalidation)**:原文 "A memory may be correct during one interval and wrong later, so update mechanisms must handle implicit invalidation as well as explicit correction.";STALE 证明现有系统常检测不到;防护方向:MemoRepair 的级联修复、APEX-MEM 的检索时冲突消解、Live-Evo 的在线重加权。 +- **巩固的开放问题**:原文 "The open problem is deciding which abstractions should be merged into a more stable memory and which should remain separate traces." +- **总体风险句**:"the risk is that poor abstraction, unstable revision, or uncontrolled accumulation can also amplify error over time."(抽象不当、修订不稳、无控堆积会随时间放大错误) +- **策略进化所需的防护设计要素**(作者列出的需求清单):何时写/检索/修订/合并的触发器(triggers);某条记忆是否真帮到后续行动的 credit assignment;针对坏记忆更新的 versioning and rollback;测试 memory-conditioned behavior 而非仅召回率的评估协议。 +- **评估短板**:现有基准 "are still weak for self-evolving agents"——说不出记忆策略是否随时间改进、巩固是否带来更好的未来决策、反复修订后是否仍稳定、改进能否在长部署周期上持续。 +- **中心开放问题**:"whether an agent can maintain a memory that becomes more selective, better organized, and more trustworthy over time without silently amplifying outdated, biased, or poisoned experience." +- **任务状态缺失风险**:Hangman 式失败表明对话历史在场不等于任务状态可用,需显式任务状态。 + +### 科普叙事素材(金句/比喻/例子) +- 【核心定义】"The key object is therefore a context-mediated persistence system: past information is stored outside the model, transformed into useful forms, and selectively reintroduced into context." → 记忆系统=外置库+加工厂+按需回填通道。画面感:模型大脑旁一条“存储→加工→回填”三段传送带。 +- 【核心比喻】"memory is not a single store, but a managed flow from past interaction into active context through representation, operations, and evolution."(Figure 5 图内亦写 "Memory is a managed flow from past interaction into active context")→ 记忆不是一座仓库,而是一条从过去流向当前上下文的受控水流。画面感:旧经验像水流经三道闸门(表示/操作/进化)注入“当前上下文”容器。 +- 【对比金句】"RAG usually retrieves from a relatively static corpus, whereas agent memory is produced, edited, and reused by the agent itself." → RAG 是查一座不变的图书馆,agent 记忆是自己写、自己改、自己再用的活账本。画面感:左固定书架 vs 右边智能体在账本上又写又划。 +- 【记忆≠技能】"If it becomes a named procedure, it belongs to the skill layer; if it remains valuable as situated evidence, it belongs to memory." → 同一段经历两种命运:变成“怎么做”的命名说明书归技能层;仍是“当时发生了什么”的情境证据归记忆。画面感:一条轨迹分叉成两张卡片。 +- 【可检查性】"This chapter focuses on this external memory layer because it is inspectable, editable, and able to change during deployment." → 外部记忆层可检查、可编辑、部署中还能变。画面感:透明玻璃柜里不断被翻动整理的卡片。 +- 【系统类比】MemGPT "treats memory partly as a paging problem across prompt-visible and external tiers" → 像操作系统的内存换页:prompt 里放不下的先换到外存。画面感:RAM 与硬盘之间的页面调度动画。 +- 【写入把关】AMAC "treats writing as an explicit utility decision using factors such as future utility, confidence, novelty, recency, and content type" → 记忆入口设海关,按五要素打分决定放行。画面感:闸机+五格打分表。 +- 【操作层的点题句】"Operations determine whether stored memory affects future behavior." / "The write path determines memory quality before retrieval begins." / "Retrieval decides which memory affects the next step." → 存了不等于有用,操作才决定记忆是否影响下一步。画面感:三句依次作为三小节的字幕卡。 +- 【压缩的信息论化】DeMem "reframes compression through a decision-theoretic rate-distortion objective rather than summary quality alone" → 压缩不是“写得像摘要”,而是率失真最优化。画面感:“码率—失真”滑块权衡动画。 +- 【快慢双轨】Auto-Dreamer "decouples fast per-session memory acquisition from slower cross-session abstraction and replacement" → 快通道当场记账,慢通道跨会话沉淀替换。画面感:快轨/慢轨双传送带,慢轨产出更抽象的卡片替换旧卡。 +- 【检索升级】TierMem "escalates from summaries to raw logs when summary evidence is insufficient" → 先看摘要,不够再调原始录像。画面感:摘要卡片翻转出背后的完整日志。 +- 【图记忆优势】"The central advantage is that the system stores not only individual memories, but also how they relate." → 不只存单条记忆,还存记忆之间的关系。画面感:散点逐渐连成网。 +- 【记忆会过期】"A memory may be correct during one interval and wrong later" → 一段记忆可能在某段时间是对的、之后就错了。画面感:日历翻页,昨天绿色的记忆条变红。 +- 【xMemory 三词】"self-authored, revisable, and action-coupled" → 自己写、可修改、与行动耦合。画面感:三枚标签盖在记忆卡上。 +- 【元认知二分】MetaMem: "factual memory stores task information, while meta-memory stores reusable experience about how to integrate, retrieve, and reason over memory fragments" → 账本本身 vs“怎么记账”的心得手册。画面感:两本册子并排。 +- 【不改权重也能进化】"Memory lets an agent adapt after deployment without changing model weights" → 大脑权重锁死,靠外部记忆在线适应。画面感:锁住的权重方块旁,记忆库在持续生长。 +- 【经验闭环】"acting produces traces, memory operations distill those traces into a better store, and later behavior is conditioned on the improved store"(原文称之为 "a practical online experience loop")→ 干活→留痕→蒸馏成更好的库→下次照着更好的库干活。画面感:四节点循环箭头逐帧点亮。 +- 【进化层点题】"Memory itself becomes an update surface when the agent does not merely read stored records, but also changes the memory system that future runs will inherit." → 记忆本身成为被更新的表面——改的是未来运行将继承的记忆系统。画面感:递给“下一个自己”的记忆库在被改写。 +- 【风险警告】"poor abstraction, unstable revision, or uncontrolled accumulation can also amplify error over time" → 抽象不当、修订不稳、无限堆积会让错误随时间放大。画面感:向下滚大的雪球。 +- 【中心开放问题】"The central open question is whether an agent can maintain a memory that becomes more selective, better organized, and more trustworthy over time without silently amplifying outdated, biased, or poisoned experience." → 记忆能否越用越挑剔、越有序、越可信,而不悄悄放大过时、带偏见或被投毒的经验。画面感:记忆库“净化”与“污染”两条时间线分岔。 +- 【评估前沿】"A key frontier is therefore evaluation for longitudinal adaptation rather than one-shot memory use." → 关键前沿是考“长期适应”,不是考“一次回忆”。画面感:短跑赛道换成马拉松计时。 +- (注:本章无具体数字结果(如百分点提升);定量数字论文未展开。) + +--- + +## 5 环境:智能体所能经验世界的边界(Environment: The Boundary of What Agents Can Experience) + +**(一)章节主旨综述** + +前几章论证了智能体部署后可通过重写流程、积累记忆、持续适应运行时而改进,本章随即回答一个系统层面的追问:如果暴露给智能体的世界本身“很薄”,经验驱动的适应还能走多远?作者断言环境常常是运行时适应的绑定约束(binding constraint)——更强的 harness 只能利用环境实际暴露的机会。§5.1 先拆开三个常被混用的概念:environment(智能体活动的外部世界)、execution harness(通过权限/日志/重放/验证/接口暴露该世界的工程层)、benchmark suite(建在特定环境–harness 对之上的任务集与评测协议)。随后把环境形式化为天花板变量 E:设 A_LM 为模型名义动作空间,环境诱导出可执行子集 A(E)⊆A_LM(仅含能被解析、接地、授权且真正改变状态的动作),Π(E) 为可执行策略类,J(π;E)=𝔼_{τ∼P(τ|π,E)}[R(τ)],则 J★(E):=sup_{π∈Π(E)} J(π;E) ≤ sup_{π∈Π_LM} J(π;E)。白话一句话:提示、记忆与控制逻辑只能“在可执行区域内搜得更好”,无法“把区域本身变大”;扩天花板必须改环境面(动作空间、可观测性、反馈、验证)。作者强调这是形式化直觉而非定理。随后以三条分析轴(action diversity / feedback density / task horizon,Figure 6)串起环境演化史与世界模型角色。§5.2 讲软件如何变成可执行环境(CLI 世界、可验证工作流、可扩展环境合成);§5.3 讲边界的协议化(MCP/A2A/AG-UI/CUBE)决定经验能否跨主机流动;§5.4 讲“可执行且可标准化 ≠ 可学习”,以 Terminal-Bench、SWE-Gym、MLE-Dojo、Harbor 为桥,把接力棒交给 §6 的 RL 参数路径。Table 3 总结“可执行→协议化→可学习”三层递进。 + +### 代表方法 + +**环境演化线(§5.1,Figure 6 点名)** +- **ALFWorld(Shridhar et al., 2021)**:早期交互环境,确立接地动作+延迟成功判定。("ALFWorld established an early interactive setting with grounded action and delayed success criteria") +- **Voyager(Wang et al., 2023)**:证明开放世界可支撑迭代式技能习得,而非仅单任务执行。("an open-ended world can support iterative skill acquisition rather than only single-task execution") +- **WebArena / WorkArena(Zhou et al., 2023 / Drouin et al., 2024; Le Sellier de Chezelles et al., 2025)**:迈向真实浏览器与知识工作场景,同时提升动作多样性与任务视界。 +- **OSWorld(Trivedi et al., 2024)**:把动作面扩展到通用计算机使用。 +- **AppWorld(Xie et al., 2024)**:强调可控应用生态中的有状态转换。 + +**世界模型线(§5.1 末)** +- **Agentic World Modeling(Chu et al., 2026)**:数字世界解读——世界模型把可执行软件状态变成多步 rollout 的基底,而非仅做下一步预测。 +- **WorldCoder(Tang et al., 2024)**:通过与环境交互构造可执行代码世界模型(外部合成路线)。 +- **World-model-augmented web agents(Shen et al., 2026b)**:显式世界模型支撑交互式网页执行中的动作纠正。 +- **Neural Computers(Zhuge et al., 2026)**:仅从 I/O 轨迹把基础 CLI/GUI 交互动力学内化为习得的运行时状态,"effectively amortizing part of the environment into a model of execution"(把一部分环境“折旧”进执行模型)。 + +**可执行环境三条路线(§5.2)** +- **Terminal-Bench(Merrill et al., 2026)**:把真实命令行工作变成带测试验证的可执行任务(89 个任务,最优模型–智能体组合仅 62.9% 解决率)。 +- **CLI-Gym(Lin et al., 2026c)**:研究可扩展的命令行任务生成。 +- **CLI-Anything(HKUDS, 2026a)**:把终端思想推广到异构软件包:SKILL.md 描述能力与失败模式、HARNESS.md 指定安装与运行假设、TEST.md 记录部分正确性检查;章节级稳定数字为 28 个软件 harness、2130 个自动化测试。 +- **ResearchGym / DevOps-Gym / MEnvAgent(Garikaparthi et al., 2026 / Guo et al., 2026a / Tang et al., 2026)**:从命令访问升级到可检查、可重放、可审计的工作流环境(AI 科研工作流 / DevOps 周期 / 把环境构造本身当可验证系统问题)。 +- **可执行基准化(Zhong et al., 2026b)**:把工作负载适配器、任务清单、事件 schema、重放与冻结策略、驱动声明、验证器元数据、报告管线并入单一可审计协议。 +- **Agent-World(Dong et al., 2026a)**:合成可扩展真实世界环境与可验证任务,并把环境增长与持续自进化智能体训练耦合。 +- **LiteCoder-Terminal-Gen(Peng et al., 2026a)**:生成/构造新可执行场景而非仅在固定场景评测(同路线,与 CLI-Gym、MEnvAgent 并列)。 + +**协议化边界(§5.3)** +- **MCP(Model Context Protocol, 2025)**:标准化智能体–工具与智能体–资源边界。 +- **A2A(A2A Protocol Contributors, 2026)**:标准化智能体–智能体边界,支撑委托与多智能体互操作。 +- **AG-UI(AG-UI Protocol Contributors, 2026)**:标准化智能体运行时与面向用户应用之间的边界。 +- **CUBE(Lacoste et al., 2026)**:基准层的互操作标准,统一异构智能体基准(任务定义/轨迹 schema/验证器约定/报告格式的可迁移)。 + +**可学习性桥接(§5.4)** +- **SWE-Gym(Pan et al., 2024)**:用可执行任务同时训练智能体与验证器,而非只给完成的运行打分。 +- **MLE-Dojo(Qiang et al., 2025a)**:由 200+ 真实 Kaggle 挑战构建,评测 8 个前沿 LLM 的交互式机器学习工程环境。 +- **MLE-Smith / SandMLE(Qiang et al., 2025b / Zhou et al., 2026e)**:扩大 MLE 任务构造规模、使更廉价的沙箱化优化可行。 +- **Harbor(Harbor Framework, 2026)**:把 harness 当作运行智能体评测与构造 RL 环境的框架(Table 3 中“可学习层”代表)。 +- **RobustBench-TC(Zhou et al., 2026d)**:把工具使用智能体的 sim-to-real 差距具体化:奖励相关与转移扰动分别造成约 40% 与 30% 的准确率下降。 +- **ToolRL-DR(原文未单独标注引用)**:扰动感知的环境设计;在 3B 骨干上做域随机化 RL 收窄扰动性能差距。 +- **MANTRA(Anand et al., 2026)**:用自然语言手册与工具 schema 合成经 SMT 验证的轨迹级合规检查,把程序性规则变成机器可检查的基准约束。 +- **ToolMisuseBench(Sigdel and Baral, 2026)**:在确定性故障注入下评测无效参数、接口漂移、策略违规、重试行为与恢复。 +- **多模态/垂直域基准群 [Heo et al., 2026, Liu et al., 2026d, Maksudov et al., 2026, Wang et al., 2026f, Wu et al., 2026e, Zhang et al., 2026j]**:灾害响应地理空间工作流、临床 EHR、放射科阅片、探索性数据分析、多媒体终端任务、化学采购成本推理——作者明言按“趋势”而非独立分类学来读。 + +**仅出现在 Table 3 的方法** +- **OpenHarness(HKUDS, 2026b)**:Table 3 中“可执行层”代表对象之一,正文未展开。 + +### 风险 / 挑战 / 防护 + +- **三轴是设计张力而非独立可最大化指标**:"Increasing action diversity without improving observability yields richer but harder-to-diagnose trajectories. Extending task horizon without denser feedback makes tasks more realistic while making failure attribution substantially more difficult. Conversely, artificially dense feedback in a simplified environment may ease optimization while reducing ecological validity."(提高动作多样性而不改可观测性→轨迹更丰富但更难诊断;拉长任务视界而无更密反馈→更真实但归因大幅更难;简化环境里的人为稠密反馈→易优化但损害生态效度。) +- **形式化的定位声明(作者自评边界)**:"The following notation is not a theorem about optimality or convexity; it is a compact way to express the constraint intuition."——J★(E) 不等式只是约束直觉的紧凑表达。 +- **可执行≠可移植≠可学习(Table 3 “What is still missing” 列)**:可执行层——丰富的执行本身不保证可移植性与学习信号;协议化层——共享接口改善复用,但仍不提供 reward、credit assignment 或稳定更新目标;可学习层——即便可执行且标准化,仍可能缺稠密奖励、可靠验证器与稳健的 episode 结构。 +- **稀疏奖励/延迟验证/错误恢复难**:Terminal-Bench 作为边界案例,"realistic execution surfaces still expose long-horizon software work with sparse reward, delayed verification, and difficult error recovery";要变成训练信号须附着到可重复 episode、含溯源的轨迹、可归因到具体命令序列/文件编辑/恢复尝试的奖励或验证器标签。 +- **MLE 分支的归因缺口(作者自评局限)**:MLE-Dojo 作者仍报告 "significant limitations in autonomous long-horizon solution generation and complex error resolution";Kaggle 式指标/排行榜名次/提交结果是结果级信号,不解释哪个数据处理步骤、特征选择、模型配置、工具调用或调试动作导致了变化。 +- **鲁棒性即可学习性约束(sim-to-real)**:部署噪声(观测、动作空间、奖励相关元数据、转移动力学)可大幅降低性能——RobustBench-TC 报告约 40%/30% 的准确率下降;防护方向是 ToolRL-DR 式扰动感知环境设计(域随机化 RL)。 +- **工具误用失败模式(ToolMisuseBench 隔离的运维级失败模式)**:invalid arguments、interface drift、policy violations、retry behavior、recovery,在确定性故障注入下评测;执行轨迹不应只按终端成功判分,还应对照合规义务与恢复契约。 +- **互操作是多层的**:"tool calls may be portable while evaluation traces are not, or benchmark reports may be comparable while the underlying execution hosts remain incompatible"——工具调用可移植但评测轨迹未必、基准报告可比但底层执行主机不兼容。 +- **章节结论的反过度声明**:"The chapter's main conclusion is therefore narrower than “richer environments are better.”"——不是越富的环境越好,而是三种不同成就需分开评价。 + +### 科普叙事素材(金句/比喻/例子) + +- 【金句】"In practice, the environment is often the binding constraint on runtime adaptation." → 实践中,环境才是运行时适应的真正瓶颈/绑定约束。画面:一条水管系统,管径(环境)不变,加压(harness)也流不出更多水。 +- 【金句】"A stronger harness can only exploit opportunities that the environment actually exposes." → 再强的脚手架,也只能吃到环境端上桌的机会。画面:健身狂人在 3 平米小屋里训练,教练再好也跑不了百米。 +- 【反直觉断言】"prompting, memory, or harness-side control logic may improve search within the executable region, but they do not by themselves expand that region." → 提示词、记忆、控制逻辑只是“在岛上找路”,不会“把岛变大”。画面:一座发光岛屿边界固定,Agent 在岛内路线越走越优,岛外一片虚无。 +- 【金句】"If the action surface is narrow, feedback is sparse, and task episodes are short or weakly stateful, then even sophisticated improvements are likely to remain local." → 动作面窄、反馈稀、回合短,再精巧的改进也只能原地打转。 +- 【定位金句】"much less progress in making that feedback dense, attributed, and stable enough to train on" → 现状:能造出可交互的环境,但反馈还不够“密、可归因、稳定到可训练”。 +- 【反直觉断言】"the important question is not simply which benchmark is hardest, but which environments most enlarge the learning surface available to a deployed agent." → 关键问题不是哪个基准最难,而是哪个环境最能放大已部署智能体的学习面。画面:难度排行榜 vs 学习面积排行榜两块榜单翻转。 +- 【比喻】"the effective environment is increasingly a constructed object that can be generated, predicted, compressed, and reused rather than a passive backdrop." → 环境正从“被动背景板”变成可生成、可预测、可压缩、可复用的“人造物”。画面:背景幕布拆下,变成一整套乐高零件。 +- 【具体数字】CLI-Anything:"The stable chapter-level numbers used here are 28 software harnesses and 2130 automated tests" → 28 个软件 harness、2130 个自动化测试——终端式执行正成为广泛的软件访问层。画面:终端窗口矩阵从 1 个裂变为 28 个。 +- 【金句】"The shift is from “the agent ran the task” to “the environment admits evidence about the run under stable rules.”" → 从“智能体跑完了任务”升级为“环境能按稳定规则提交关于这次运行的证据”。画面:打卡记录表 → 带公证的审计报告。 +- 【金句】"the execution boundary of a modern agent is no longer only a tool API boundary." → 现代智能体的执行边界,早已不只是工具 API 的边界(引出 MCP/A2A/AG-UI 三分)。 +- 【金句】"Standardization therefore raises the practical ceiling of self-improvement indirectly but materially, not by improving the model directly, but by improving how far local experience can travel." → 标准化不直接改进模型,而是加长“本地经验能旅行的距离”,间接但实质地抬高自改进天花板。画面:经验变成行李,从只能步行过河到坐上标准化集装箱货轮。 +- 【金句】"experience can travel across hosts at lower marginal cost" → 经验跨主机流动的边际成本更低。 +- 【具体数字】Terminal-Bench:"89 realistic CLI tasks" + "the best model–agent combination reaches only 62.9% overall resolution rate" → 89 个真实 CLI 任务,最强组合也只解决 62.9%。 +- 【金句】"An environment can be executable and even standardized without yet being learnable in the reinforcement-learning sense." → 环境可以既可执行又标准化,却仍然“不可学习”(RL 意义上)。 +- 【金句】"It needs episodes, verifiers, reward structure, and enough attribution to connect outcomes back to actions." → RL 要的不只是访问权限,而是 episode、验证器、奖励结构、以及把结果连回动作的足够归因。 +- 【具体数字】MLE-Dojo:"built from 200+ real-world Kaggle challenges" + 评测 "eight frontier LLMs" → 200+ 真实 Kaggle 挑战、8 个前沿 LLM,长视界自主解题与复杂纠错仍是显著短板。 +- 【金句】"Kaggle-style metrics, leaderboard ranks, and submission outcomes are useful outcome-level training signals, but they do not by themselves explain which data-processing step, feature choice, model configuration, tool call, or debugging action caused the change." → 排行榜分数只告诉你“涨了”,不告诉你“为什么涨”。画面:股票收盘价曲线 vs 逐笔交易回放。 +- 【金句】"For agentic systems, this turns environment design into a trace-production problem: the same execution substrate must support action, audit, replay, verification, and conversion into governed learning signals." → 环境设计成了“轨迹生产问题”:同一执行基底要同时支撑行动、审计、重放、验证、转化为受治理的学习信号。 +- 【具体数字】RobustBench-TC:"reward-relevant and transition perturbations producing roughly 40% and 30% accuracy drops" → 奖励相关与转移动力学扰动分别造成约 40%、30% 准确率骤降;ToolRL-DR 用 3B 骨干的域随机化 RL 收窄差距。 +- 【金句】"learnability is not only a matter of reward density; it is also a matter of whether the environment exposes the noise distribution that deployed policies must survive." → 可学习性不只看奖励密度,还看环境是否暴露部署策略必须熬过的噪声分布。 +- 【比喻】Neural Computers:"effectively amortizing part of the environment into a model of execution" → 把一部分环境“摊销/内化”进执行模型——世界被压进模型里。画面:外部终端逐帧“吸入”模型。 +- 【收束排比】"The first makes software runnable by agents. The second makes runtime experience portable. The third makes that experience optimizable. That is the precise handoff to Section 6." → 第一层让软件可运行,第二层让经验可携带,第三层让经验可优化——这就是交给 §6 的精确接力棒。画面:三级火箭依次点火,末级把“经验燃料”注入参数训练引擎。 +- 【边界句】"The following notation is not a theorem about optimality or convexity; it is a compact way to express the constraint intuition." → 作者自我声明:J★(E) 不是最优性/凸性定理,只是把约束直觉写紧凑。 +- 【边界句】"The chapter's main conclusion is therefore narrower than “richer environments are better.”" → 本章结论比“环境越富越好”更窄/更克制。 + +--- + +## 6 RL 与持续学习:把经验巩固进模型参数 + +(一)章节主旨综述段:本章回答“经验什么时候应该写进模型权重而不是留在 harness 侧”。前几章(§3–§5)显示有用的先验往往先出现在模型之外——可复用技能、积累的记忆、执行环境结构;参数路径的起点,是当这些反复出现的 harness 侧教训不再被视为局部补丁,而被当作底层策略本身应当改变的证据。作者给出三大理由:(1) 内化稳定运行时先验,省去重复的上下文与编排开销;(2) 权重更新比字面上下文回放迁移更广——“改一条 harness 只在正确的文件/记忆条目/检索路径被触发时才有用,而好的策略更新能跨任务、跨会话、跨用户传播”;(3) 集体进化——多 agent 共享基座后“一个 agent 的经验成为另一个 agent 的先验”,呼应联邦学习。形式化上沿用全文运行时定义 A_t = ⟨M_{θ_t}, H_t, U_t, E_t⟩:参数路径就是更新模型分量 M_{θ_t} 本身、而非只更新 harness 分量 H_t 的情形。Eq. 1(training-data selection rule,训练数据选择规则):I_{s_k} = S_{O_{s_k}}(Z_{s_k}; H_{s_k}),Ẑ_{s_k} = {(z_i, y_i) : i ∈ I_{s_k}, y_i = a_{O_{s_k}}(z_i; H_{s_k})}——白话:从已编译的全部经验库 Z_{s_k} 里,由当前 harness 状态(隐私规则、署名、验证器可用性、权限、trace 质量、任务覆盖)和训练目标 O(SFT/偏好学习/RL 各选不同的 trace)共同筛出可训练子集,并为每条 trace 生成训练信号对象 y(示范/动作标签、偏好或 rubric 标注、标量奖励)。Eq. 2(model-update rule,模型更新规则):θ_{s_{k+1}} = arg max_θ J_{s_k}(θ),J_{s_k}(θ) = E_{(z_i,y_i)∼Ẑ_{s_k}}[J_{O_{s_k}}(π_θ; z_i, y_i)]——白话:在筛选并标注过的经验上,用常规训练目标优化出下一个可部署检查点。组织逻辑为递进四节:6.2 预部署垂直能力训练(可执行环境 + 轨迹上的 SFT/RL + 三种能力整合模式)、6.3 预部署 harness 功能单元训练(子代理路由/技能/记忆成为可训练接口)、6.4 部署后从 agent trace 学习(工业界最强证据)、6.5 从业者要点,并桥接第 7 章(谁决定把教训升级为共享模型更新)与第 8 章(能力保持的度量)。 + +### 代表方法 + +**6.1 为何写进权重(动机与先例)** +- **Composer 2(Cursor Research et al., 2026)**:把 RL rollout 对齐到与部署时完全相同的编码 harness 中训练。(论文原文表述 "aligns RL rollouts with the same coding harness used at deployment") +- **Cursor 实时 RL 循环(Jackson et al., 2026)**:把生产环境反馈聚合为频繁的策略权重更新,而不是把每次失败都当成又一次 prompt 修补。 +- **SEAgent(Sun et al., 2025)**:把软件交互 rollout 转化为优化信号,而非仅在上下文中回放。 +- **UI-Mem(Xiao et al., 2026)**:GUI 经验记忆的同类论证(在 6.3 记忆单元部分再次出场)。 +- **RetroAgent(Zhang et al., 2026l)**:用经验记忆做回顾式内在反馈(retrospective intrinsic feedback)并显式复用经验。 +- **EMPO2(Liu et al., 2026g)**:用记忆改进探索,结合 on-policy 与 off-policy 优化,使记忆增强 agent 更鲁棒。 +- **联邦学习基线(McMahan et al., 2017)**:本地客户端从分散数据计算更新并聚合为共享模型——“集体进化”的理论原型。 +- **联邦系统生产化(Bonawitz et al., 2019)**:让去中心化更新可部署、数据留在设备上的生产级系统设计。 +- **联邦开放问题(Kairouz et al., 2021)**:部署中的系统、隐私与通信挑战。 +- **联邦优化(Li et al., 2020)**:更新时机与系统异构性对应的优化问题。 + +**6.2 预部署垂直能力训练** + +*前沿模型报告(能力宣示)* +- **GPT-5.5(OpenAI, 2026)**:强调编码、计算机使用、工具使用与知识工作流。 +- **Claude Opus 4.7(Anthropic, 2026)**:强调长时程编码与 agentic 工具使用。 +- **Gemini 3.5 Flash(Google DeepMind, 2026)**:突出同类 agentic 工具使用工作流。 +- **MiniMax M2.7(MiniMax, 2026)**:明确以 "harness-aware self-improvement" 为目标。 +- **GLM-5.1(Z.ai, 2026)**:强调长时程自主工程与 agentic 编码工作流。 +- **Qwen3-Coder-Next(Cao et al., 2026)**:面向编码 agent、以可执行环境训练的 Qwen 报告。 +- **Kimi K2.5(Moonshot AI, 2026)**:突出视觉 agentic 智能与自主 agent 群体。 +- **Cursor Composer 2(Research et al., 2026)**:在匹配部署 harness 中做编码 agent RL 的产品级案例。 + +*可执行训练基座(substrates)* +- **SWE 类世界(Pan et al., 2024; Yang et al., 2025a)**:编码仓库、测试、issue 轨迹与执行日志,使反馈映射到正确性/回归/恢复质量。 +- **MLE-Dojo / MLE-Smith / SandMLE(Qiang et al., 2025a,b; Zhou et al., 2026e)**:面向机器学习工程的实验沙箱,任务编辑、指标变化与执行产物成为轨迹可观测量。 +- **NESTFUL / Procedural Environment Generation for Tool-Use Agents(Basu et al., 2025; Sullivan et al., 2025)**:可扩展、可验证的工具调用轨迹与依赖感知任务合成。 +- **SearchGym / DeepResearchGym(Coelho et al., 2025; Zhang et al., 2026m)**:把查询、检索证据与最终答案转成带奖励的搜索轨迹。 +- **CUA-Gym / Gym-Anything / WebGym / BrowserGym(Aggarwal et al., 2026; Bai et al., 2026; Le Sellier de Chezelles et al., 2025; Wang et al., 2026a)**:跨平台或 GUI/浏览器计算基座,把环境状态、屏幕观察与动作历史变成可重复训练回合。 + +*可执行轨迹上的 SFT 与 RL* +- **Kimi-Dev(Yang et al., 2025b)**:先用 agentless 训练诱导 SWE 技能先验,再用公开轨迹 SFT 适配到 SWE-agent 设置。 +- **SWE-Dev(Wang et al., 2025a)**:合成测试用例生成 + 可执行补丁评估 + 放规模的 agent 轨迹 + 训练/推理 scaling。 +- **SWE-RL(Wei et al., 2025b)**:在开放软件演化数据上用基于规则的 RL 奖励做真实世界 SWE 推理。 +- **长上下文 SWE-agent RL(Golubev et al., 2025)**:以执行反馈 + RL 训练长上下文多轮 SWE agent。 +- **Self-Play SWE-RL(Wei et al., 2025c)**:研究自我博弈的 bug 注入—修复循环。 +- **ToolLLM / ToolLLaMA(Qin et al., 2024)**:早期 SFT 型工具使用流水线,构造大规模 API 使用指令与解法轨迹后微调 ToolLLaMA。 +- **ReTool(Feng et al., 2025)**:训练“选择性工具使用”(何时调用代码解释器/外部函数/在工具间选择)。 +- **ToolRL(Qian et al., 2025a)**:以奖励感知控制优化工具执行轨迹。 +- **Search-R1(Jin et al., 2025a)**:把同一 SFT–RL 模式特化到检索 agent——何时查询、如何用证据、如何把搜索观察折回推理。 +- **ComputerRL(Lai et al., 2025)**:放规模在线桌面/GUI 环境并在环境漂移下适配策略。 +- **ACuRL(Xue et al., 2026)**:为持续计算机使用适配提供自主课程学习。 +- **rStar2-Agent(Shang et al., 2025)**:用 Python 执行与分阶段 SFT–RL 配方训练多步 agentic 推理。 +- **LOOP(Chen et al., 2025b)**:直接在有状态 API 环境中训练交互式数字 agent。 +- **AgentGym-RL(Xi et al., 2025)**:暴露模块化 RL 栈以做长时程决策。 +- **Agent-R1(Cheng et al., 2025a)**:同类的 agent 级 RL 配方。 +- **多轮 agentic RL 实践者指南(Wang and Ammanabrolu, 2025)**:把问题框定为环境、奖励与策略的协同设计(co-design)。 +- **GFCR(Surana et al., 2026)**:用 rollout 过滤与控制(rollout filtering and control)强调同一系统要点。 +- **Agent Lightning(Luo et al., 2025)**:把 agent 执行与 RL 训练解耦,向既有 agent 暴露标准化 trace 与 credit-assignment 接口。 + +*能力整合三模式(论文强调“不应混为一谈”)* +- **GLM-4.5(GLM-4.5 Team, 2025)**:分阶段整合的 expert-first 案例——先建推理/agentic/通用聊天专家模型,再经专家迭代与蒸馏式后训练统一为混合推理模型。 +- **GLM-5(Zeng et al., 2026a)**:以异步后训练 RL 与面向长时程工程任务的 agent RL 显式化后训练结构;另用跨阶段 OPD 保住早期 SFT/Reasoning RL/General RL 阶段的技能。 +- **Qwen3(Qwen Team, 2025)**:软性模式融合——长 CoT 冷启动与推理 RL 后做 thinking-mode fusion 与 General RL,单检查点同时支持思考/非思考、工具、编码、指令遵循。 +- **M2RL(Wang et al., 2026d)**:直接对比混合多任务 RLVR 与“分域 RL + 模型合并”两种路线(数学/编码/科学/指令遵循/agent 任务)。 +- **跨域 RL 研究(Cheng et al., 2025b)**:给出关键警示——预训练充足的域常受益于跨域 RL,代表性不足的域通常需要域内奖励。 +- **Kimi K2(Kimi Team, 2025)**:大规模 agentic 数据合成 + 真实与合成环境上的联合 RL(agentic/编码/推理/工具)。 +- **MiMo-VL(Xiaomi LLM-Core Team, 2025)**:配方命名为 "Mixed On-policy RL"(跨推理、感知、grounding、GUI 等多样奖励信号)。 +- **ERNIE 5.0(Baidu ERNIE Team, 2026)**:在统一多模态基座模型(文本/图像/视频/音频)上引入 RL。 +- **DeepSeek-V3.2(DeepSeek-AI, 2025)**:大规模 agentic 任务合成 + 放规模后训练 RL。 +- **MiMo-V2-Flash(Xiaomi LLM-Core Team, 2026)**:多教师 on-policy 蒸馏(OPD)——领域专家教师对一个学生提供 token 级监督。 +- **KAT-Coder-V2(KAT-Coder Team, 2026)**:最清晰的 agentic 编码案例——"Specialize-then-Unify":先训 SWE/网页编码/终端/网页搜索/通用编码专家,再经 OPD 统一为一个模型。 +- **Nemotron-Cascade 2(Yang et al., 2026e)**:Cascade RL + 来自最强中间教师的多域 OPD。 +- **OPD 分析(Song and Zheng, 2026)**:区分 OPD 的一般成功条件、失败模式与开放问题。 +- **OPD 补救研究(Li et al., 2026e)**:OPD 受益于兼容的师生思考模式与真正新的教师能力;off-policy 冷启动与教师对齐的 prompt 选择可挽救失败的 OPD。 +- **OPCD(Ye et al., 2026d)**:更一般的 on-policy 上下文蒸馏(on-policy context distillation)表述(在 6.3 再次出场)。 +- **CoPD(Gu et al., 2026)**:在 RLVR 期间用双向 OPD 共同进化专家。 + +**6.3 预部署 harness 功能单元训练**(入选标准:必须有针对模型使用该单元的显式训练信号;纯 prompt/工作流工程归外部路径) + +*子代理编排与路由* +- **Chain-of-Agents(Li et al., 2025b)**:把多智能体系统蒸馏进单模型轨迹——一个模型动态激活工具 agent 与角色扮演 agent,再在可验证任务上做 agentic RL。 +- **Router-R1(Zhang et al., 2025c)**:把多 LLM 路由与答案聚合表述为序贯决策过程,以格式/结果/成本奖励优化路由器。 +- **xRouter(Qian et al., 2025b)**:把编排当作工具调用问题——学习到的路由器可自己直答,或在显式成本感知奖励下调用一个或多个外部 LLM。 +- **ToolOrchestra(Su et al., 2025b)**:从“模型路由”推广到“模型+工具路由”,在结果/效率/偏好信号下训练编排器。 +- **AgentFlow(Li et al., 2025c)**:在 planner–executor–verifier–generator harness 内训练 planner,用 on-policy Flow-GRPO 把轨迹级结果回授到局部规划决策。 +- **HiMA-Ecom(Hu et al., 2025)**:电商主 agent 协调专职子代理,用 SFT 样本 + 联合多智能体 RL 训练层级。 + +*技能使用与内化* +- **SkillRL(Xia et al., 2026a)**:rollout 时暴露技能库,策略在 RL 下不只学解题,还学检索、解释、使用可复用技能。 +- **Skill1(Shang/ Shi et al., 2026)**:从共享任务结果信号共同进化技能的选择、使用与蒸馏。(原文署名 Shi et al., 2026) +- **ARISE(Li et al., 2026h)**:层级 RL 变体——skills manager 从成功解法轨迹生成/选择/维护技能库,worker 策略在后续 rollout 中使用。 +- **D2Skill(Tu et al., 2026)**:动态双粒度(任务/步骤)技能库,带效用感知的更新与检索。 +- **SKILL0(Lu et al., 2026b)**:从“辅助使用”走向内化——训练时技能可用,但鼓励学到的策略在推理时以更少的显式技能支持行动。 +- **Skill-SD(Wang et al., 2026c)**:把仅在训练期提供的技能指导蒸馏进学生策略。 +- **OPCD(Ye et al., 2026d)**:上下文条件教师 supervise 学生自己实际访问的状态,把历史轨迹或 prompt 内化进参数。 + +*记忆访问与经验复用* +- **MemSearcher(Yuan et al., 2025)**:让搜索与记忆访问本身成为可训练行为。 +- **Agentic Memory(Yu et al., 2026b)**:为长时程增补 store、retrieve、update、summarization 与 forgetting 策略。 +- **UI-Mem(Xiao et al., 2026)**:用经验记忆引导 GUI 任务探索。 +- **EMPO2(Liu et al., 2026g)**:记忆改进探索;on/off-policy 结合,有记忆无记忆都保持鲁棒。 +- **SEARL(Feng et al., 2026b)**:联合优化策略与工具图记忆(tool-graph memory),让先验轨迹变成可复用结构而非平面日志。 +- **Agent-BRACE(Singh et al., 2026)**:belief-state 变体——训练一个信念模型把部分观察压缩成带不确定性的状态断言供策略行动。 +- **经验利用训练(Fan et al., 2026)**:把先验经验的选择与使用本身变成可训练决策,而非默认“上下文里经验越多越好”。 +- **Rethinking Experience(Zhao et al., 2026a)**:为选择性经验使用提供更多证据。 +- **Traj-Evolve(Zeng et al., 2026c)**:临床多智能体实例——经核实的患者 Experience Pool 供检索,reward-ranked MARL 微调 worker 与 manager agent 做纵向 EHR 风险预测。 +- **RetroAgent(Zhang et al., 2026l)**:用回顾式内在反馈支撑在线 RL 并显式复用经验。 + +**6.4 部署后训练(须同时满足:模型运行在部署的 model+harness+environment 栈内;学习信号来自该运行系统产生的 trace)** +- **WildChat(Zhao et al., 2024)**:最早先声(chat 而非 agent 设定)——大规模真实用户–chatbot 日志。 +- **RLHI(Jin et al., 2025b)**:证明对话中的自然追问轮可转化为训练信号。 +- **Composer 2(Research et al., 2026)**:最强公开证据——技术报告称 RL 在真实 Cursor 会话中运行,使用与部署模型相同的工具与 harness。 +- **Cursor 实时 RL(Jackson et al., 2026)**:生产检查点服务给用户,观察用户响应并聚合为奖励信号,用于频繁权重更新。 +- **Codex / codex-1(OpenAI, 2025)**:OpenAI 描述 codex-1 为在真实世界编码任务上跨环境做 RL 训练。 +- **Codex harness 更新(Chen, 2026)**:澄清各 Codex 界面共享同一 App Server 与 harness 层。 +- **OpenClaw-RL(Wang et al., 2026l)**:把线上用户回复、工具输出、终端/GUI 状态变化框定为部署 agentic 运行时内的在线 RL 监督。 +- **MetaClaw(Xia et al., 2026b)**:勾勒 OpenClaw 式部署循环,复用部署失败轨迹做技能进化与轻量参数更新。 +- **SWE-chat(Baumann et al., 2026)**:表明原始 trace 层正变得可观测(在 6.5 引用)。 + +**仅出现在图中的方法(单独分组)** +- **SWE-Gym(Figure 7「Building Substrates」面板)**:图中与 MLE-Dojo、CUA-Gym、SearchGym、Gym-Anything 并列的可执行基座示例;正文以 "SWE-like worlds [Pan et al., 2024, Yang et al., 2025a]" 泛指,未单独展开该名字。 + +### 风险 / 挑战 / 防护 +- **trace 可用性治理(6.1)**:选择算子依赖 harness 状态——privacy rules、attribution、verifier availability、permissions、trace quality、task coverage 都会影响一条 trace 能否用于训练;不同目标(SFT/偏好学习/RL)会选出不同 trace、抽取不同监督对象。 +- **集体进化的系统性挑战(6.1)**:联邦路线带来 systems、privacy、communication 挑战(Kairouz et al., 2021);update timing 与 system heterogeneity 构成对应优化问题(Li et al., 2020)。 +- **跨域 RL 的域差异警示(6.2)**:pretraining-rich 域(数学、代码、科学)常受益于跨域 RL;underrepresented 域(logic、simulation、tabular reasoning)通常需要 in-domain 奖励信号(Cheng et al., 2025b)。 +- **可用性阈值(usability threshold,6.2)**:预部署能力是部署后学习的前提——上线前不能可靠完成有用任务 → 用户不采用 → 系统积累不了有意义的 usage traces → 部署后 trace-to-update 循环没有信号可学。 +- **OPD 失败模式(6.2)**:OPD 需要兼容的 teacher–student 思考模式与教师真正的新能力;off-policy 冷启动与教师对齐的 prompt 选择可补救失败的 OPD(Li et al., 2026e);另有专门分析列出一般失败模式与开放问题(Song and Zheng, 2026)。 +- **harness 单元训练边界仍窄(6.3)**:每项工作只优化一个功能单元或小组合;更广的 harness 训练制度需要联合治理 sub-agents、skills、memory、tools、permissions、reward extraction、versioning、rollback 与 evaluation 的机制——论文未展开具体方案。 +- **部署 trace 的信号质量(6.4)**:反馈周期更长、轨迹跨多轮/多会话、学习信号 delayed、incomplete、noisier,且混合多源(用户回复、环境状态变化、工具输出、终端/GUI 观察、运行时错误、下游结果)。 +- **训练–测试上下文错配(train–test context mismatch,6.5)**:若训练用简化 scaffold 而推理用真实运行时 harness,会在“本应减少错配的地方”重新引入错配——防护措施是 same-harness 训练基础设施。 +- **原始日志 ≠ 训练信号(6.5)**:SWE-chat 等数据集表明 trace 层正可观测,但“把日志变成可训练信号”仍是独立的系统工程问题。 +- **现状评估(6.4)**:公开的部署后 agent 训练证据仍然稀疏,真正的部署后训练尚处很早期。 + +### 科普叙事素材(金句/比喻/例子) +- 【分界线】"The parameter path begins when those repeated harness-side lessons are no longer treated as local patches, but as evidence that the underlying policy itself should change." → 当同一个教训在 harness 侧反复出现,就不再打补丁,而是承认“策略本身该改了”。画面:便签贴满墙 → 终于动手重写操作系统。 +- 【迁移对比】"a harness edit only helps when the right file, memory entry, or retrieval path fires, while a good policy update can travel across tasks, sessions, and users" → 改 harness 像改一个触发条件,命不中就没用;改权重像换脑,走到哪都带着。画面:左边“钥匙开一把锁”,右边“能力随身携带”。 +- 【集体进化】"once many agents share a base model, one agent's experience can become another agent's prior" → 共享基座的 agent 之间,一人的经验成为他人的先验。画面:蜂群经验汇入同一颗“群体大脑”。 +- 【图 7 金句】"Harness units become trainable interfaces, not fixed prompts." → harness 组件从写死的提示词变成可训练接口。画面:提示词文本块渐变为带梯度的可学习模块。 +- 【图 7 金句】"The core bottleneck lies in the trace-to-update system." → 核心瓶颈不在 RL 算法本身,而在“轨迹到更新”的整条系统链路。画面:RL 算法是光鲜引擎,真正卡住的是周边管道。 +- 【图 7 金句】"Executable training is the capability foundation for trace learning." → 可执行训练是部署后 trace 学习的能力地基——先有可用性,才谈得上从使用中学习。 +- 【反直觉断言】"The common message is not that a single optimizer solves agency. It is that vertical capability learning is a stack-level problem" → 各家前沿报告的共同点不是“某个优化器解决了 agent 能力”,而是这是全栈问题。画面:把“单一算法银弹”图标打叉。 +- 【因果链例子】"if an agent cannot reliably complete useful tasks before release, users will not adopt it, the system will not accumulate meaningful usage traces, and the post-deployment trace-to-update loop has little signal to learn from" → 上线前不好用 → 没人用 → 没 trace → 部署后学习无米下锅。画面:多米诺骨牌三连倒。 +- 【生产系统实例】"production checkpoints are served to users, user responses are observed, and those responses are aggregated into reward signals for frequent weight updates"(Cursor 实时 RL)→ 线上真实用户响应被聚合成奖励、频繁更新权重——产品级闭环实证。画面:用户敲下的每次接受/拒绝变成训练信号流。 +- 【同 harness 原则】"RL runs in realistic Cursor sessions using the same tools and harness as the deployed model"(Composer 2)→ 训练环境和部署环境是同一个,不是模拟考场。 +- 【目标定义】"The target is inference-time control: learning when to call, adapt, and coordinate skills, memory, tools, or sub-agents." → harness 单元训练的目标是推理时控制力:何时调用、如何适配、如何协同。 +- 【多智能体内化】"the target is no longer a hand-written multi-agent workflow, but a policy that has internalized when and how to simulate multi-agent collaboration"(Chain-of-Agents)→ 不再手写多智能体工作流,而是让一个策略学会“模拟”协作。画面:手绘流程图 → 单模型内部涌现协作。 +- 【早期证据句】"These systems are early evidence that sub-agent activation, model routing, and tool orchestration can become trainable behaviors rather than fixed prompt patterns." → 子代理激活、模型路由、工具编排可以成为“学出来的行为”而非写死的模式。 +- 【范式转移】"these papers shift harness components from passive runtime aids toward trainable interfaces" → harness 从被动运行时辅助变成可训练接口。 +- 【作者自评边界】"The boundary is still narrow: each work optimizes one functional unit or a small combination of units." → 现状清醒剂:每项工作只训一个单元。 +- 【经验使用反直觉】"rather than assuming that more experience in context is always better" → 不再默认“上下文里塞更多经验总更好”——经验的选择与使用本身要学。 +- 【chatbot 时代区分】"they learn from real human interaction, yet they are not agentic systems operating in richer execution environments."(评 WildChat/RLHI)→ 它们向真实人类学习,但还不是运行在富执行环境里的 agentic 系统。 +- 【现状直白句】"Public evidence of post-deploy agent training remains sparse, and true post-deployment agent training is still at a very early stage." → 部署后训练的公开证据稀疏,真·部署后训练仍在很早期。 +- 【全章题眼】"The field has already solved more of the RL core than of the surrounding systems problem." → RL 内核已解决得比周边系统问题多——瓶颈是工程系统,不是数学。 +- 【四大工程问题】"selecting which trajectories are worth training on, collecting such trajectories at sufficient scale, extracting usable learning signals from messy interaction records, and running training inside the same harness that will be used at test time" → 选轨迹、采轨迹、抽信号、同 harness 训练。画面:四道工序流水线图。 +- 【错配警句】"the system reintroduces a train–test context mismatch exactly where agentic post-deployment learning is supposed to reduce it" → 训练用简化脚手架、推理用真 harness,就会在最该消除错配的地方重新引入错配。 +- 【下章钩子】"who decides whether a lesson should stay as a local harness artifact or be promoted into a shared model update?" → 一条教训该留在本地 harness 还是升格为共享模型更新,由谁决定?——通向第 7 章元进化之问。 + +--- + +## 7 元进化智能体:谁来控制进化什么(Meta-Evolving Agents: Who Controls What to Evolve) + +(一)章节主旨综述段:前几章研究经验如何改变面向任务的 TaskAgent(更新其资源与策略),本章上升到更高层的问题:"when improvement itself becomes an object of optimization, who controls the update process and what parts of that process are allowed to change?"(当“改进”本身成为优化对象,谁来控制更新过程、哪些部分被允许改变?)作者沿两条正交轴组织全部内容:纵轴“谁控制进化”(TaskAgent-internal control vs. persistent meta-layer control),横轴“什么在进化”(TaskAgent 内容资产 / 执行机制与结构 / 改进策略 / 元层自身),据此把部署后 Agentic AI 进化划分为三种 regime(Figure 8):TaskAgent self-evolution(把部署后经验转化为自己的持久内容资产,是前几章主题)、TaskAgent meta-learning(在部署智能体场景中实例化经典元学习思想 "learning how to learn",进化对象从“知道什么”转向“怎么行动/怎么改进”,但控制环仍在 TaskAgent 或其 task-facing harness 内部)、以及 meta-evolving agents(进化不再是行动或训练的内部副作用,而成为由功能上独立的 meta-layer 控制的持续、专职优化任务,且元层自身也可被进化)。本章无数学符号形式化,其“定义”为三段界定式原文——白话一句话:不仅球员能换,教练组、选人规则乃至联盟章程本身也能被系统自己改写。组织逻辑:7.1 定义三 regime 及边界;7.2 综述 TaskAgent 级元学习(7.2.1 执行机制 / 7.2.2 改进策略);7.3 综述元进化智能体(先以“优化环是否在部署后作为独立元层持续活跃”为判据,排除设计时搜索与任务时编排器两类相邻用法,再按元层使什么可进化分三层 7.3.1/7.3.2/7.3.3),结尾讨论当前“局部元进化”与“通用元进化”理想之间的鸿沟。本章为定位性综述章节,无量化实验数字(论文未展开)。 + +### 代表方法 + +**A. TaskAgent meta-learning —— TaskAgent 内部控制执行机制(7.2.1)** +- **MetaAgent(Qian and Liu, 2025)**:从极简 reason–help–answer 循环出发,靠自我反思、答案验证与工具使用轨迹改进“何时求助、向谁求助”的规则。("starts from a minimal reason–help–answer loop and improves it through self-reflection, answer verification, and tool-use traces") +- **ExpWeaver(Zhao et al., 2026a)**:学的是“推理中何时调用经验”而非经验内容本身,在不确信决策点做选择性调用。("it improves experience utilization rather than experience content") +- **ARISE(Li et al., 2026h)**:通过共享 Skills-Manager/Worker 策略,同时进化技能库与技能的选择、生成、使用机制。("jointly evolves the skill library and the mechanisms for selecting, generating, and using skills through a shared Skills-Manager/Worker policy") +- **SAGE-SkillLib(Wang et al., 2025b)**:Sequential Rollout 让后续任务复用早前任务生成/更新/保存的技能,技能积分奖励 + GRPO 训练策略更可靠地生成、调用、更新、保留技能。("skill-integrated rewards and GRPO train the policy to generate, call, update, and preserve skills more reliably") +- **D2Skill(Tu et al., 2026)**:双粒度(任务级 + 步骤级)技能库,用基线 rollout 与技能注入 rollout 配对估计 hindsight utility,据此更新技能效用、指导检索与剪枝、优化技能增强策略。("estimates hindsight utility from paired baseline and skill-injected rollouts") +- **Skill1(Shi et al., 2026)**:在任务结果反馈下统一技能的选择、使用与蒸馏。("unifies skill selection, utilization, and distillation under task-outcome feedback") + +**B. TaskAgent meta-learning —— TaskAgent 内部控制改进策略(7.2.2)** +- **Multi-Agent SAGE(Peng et al., 2026b)**:共享主干系统分别扮演 challenger / planner / solver / critic 四角色——challenger 出更难的题,critic 在题目和计划变成训练信号前过滤,solver 在可验证奖励下更新,改进对象是“构造未来学习压力”的内部改进策略。("trains a shared-backbone system conditioned as challenger, planner, solver, and critic") +- **Ace-Skill(Xiong et al., 2026a)**:多模态工具使用自举:优先级采样与聚类组织分配自进化算力、减少干扰,改进的是“选学习样本、组织可复用知识”的策略。("prioritized sampling and clustered organization allocate self-evolution effort and reduce interference") +- **SkillRL(Xia et al., 2026a)**:把成功/失败 episode 蒸馏进层级化 SkillBank,自适应检索 + 冷启动 SFT 教模型“如何解读和运用技能”,再在验证失败后递归增改技能的同时施加 GRPO。("applies GRPO while recursively adding or refining skills after validation failures") + +**C. 元进化智能体 —— 元层控制执行机制(7.3.1)** +- **MetaMem(Xin et al., 2026)**:把事实记忆与“如何使用记忆的规则”(meta-memory)分离,反思与裁判反馈修改的是规则而非追加记录。("Reflection and judge feedback revise these meta-memory rules rather than merely adding more records") +- **MemSkill(Zhang et al., 2026f)**:把记忆技能设计暴露给外层 Designer,抽取、整合、保留、遗忘被组织成由 selector 控制的可进化记忆技能库。("organizing extraction, integration, retention, and forgetting as an evolvable memory skill bank") +- **CluE(Yang et al., 2026c)**:聚焦记忆抽取的提示进化环,在异构任务反馈下维护簇池、候选提示与最优提示。("maintaining cluster pools, candidate prompts, and a best prompt under heterogeneous task feedback") +- **Meta Context Engineering / MCE(Ye et al., 2026c)**:外层 evolver 依据 rollout 反馈改写基础智能体的 context-learning 技能,进化对象是上下文的表示、更新与组织机制。("an outer evolver rewrites a base agent's context-learning skill from rollout feedback") +- **Mem2Evolve(Cheng et al., 2026)**:Asset Memory + Experience Memory:工具代码、专家智能体规格与经验在前向推理中创建,再由后向进化层验证、自纠、蒸馏并写回——进化的是工具/专家智能体的“创建与复用机制”。("verified, self-corrected, distilled, and written back by a backward evolution layer") +- **MetaClaw(Xia et al., 2026b)**:基于代理的进化层含双通道:快通道把失败轨迹即时转成可用外部技能,慢通道把适配后轨迹喂给 LoRA/GRPO 做策略固化。("a fast skill-evolution path that turns failure trajectories into immediately usable external skills, and a slower policy-consolidation path") +- **Continual Harness(Karten et al., 2026)**:具身智能体在单条连续 episode 内,Refiner 读取近期轨迹窗口并对系统提示、子智能体、技能、记忆做 CRUD 编辑;co-learning 变体还从重标注 rollout 更新模型权重。("applies CRUD edits to the system prompt, sub-agents, skills, and memory") +- **Agentic Harness Engineering(Lin et al., 2026b)**:把编码智能体 harness 分解为文件级可编辑资源(工具、middleware、技能、子智能体配置、长期记忆),Agent Debugger 把长轨迹蒸馏为证据,Evolve Agent 编辑 harness 且其预测需对照后续任务结果检验。("an Evolve Agent edits the harness with predictions that are checked against later task outcomes") +- **HERA(Li and Ramakrishnan, 2026)**:用 Orchestrator + Experience Library 作为多智能体 RAG 系统之上的持久控制层:Orchestrator 从查询、智能体池与经验库生成查询专属拓扑,执行智能体提示在反馈下进化。("a persistent control layer over a multi-agent RAG system") +- **AutoAgent(Wang et al., 2026i)**:Execution Cycle 推进当前任务,Evolution Cycle 总结轨迹、对齐意图与实际结果,把修订写入工具前提、同伴画像、技能模板、复合动作与记忆编排策略。("aligns intended actions with actual outcomes, and writes revisions into tool prerequisites, peer profiles, skill templates, composite actions, or memory-orchestration strategies") +- **Milkyway(Wei et al., 2026)**:面向未来预测:持久 harness 追踪演化中的证据,通过时间对比与回溯反馈修订未决预测。("revises unresolved predictions through temporal contrast and retrospective feedback") +- **KernelBlaster(Dong et al., 2026b)**:面向 CUDA kernel 优化,维护 profiler 条件化的“优化策略+实测收益”记忆供后续 kernel 复用。("a profiler-conditioned memory of optimization strategies and observed gains") +- **Memory Intelligence Agent(Qiao et al., 2026)**:Memory Manager、Judger 与 TTRL 更新通道把轨迹压缩为工作流记忆与对比计划,同时更新 Planner 参数。("compress trajectories into workflow memory and contrastive plans while updating Planner parameters") +- **OpenClaw-RL(Wang et al., 2026l)**:把行动后的 next-state 信号转换为过程奖励或 token 级监督,用于异步策略更新。("converted into process rewards or token-level supervision for asynchronous policy updates") + +**D. 元进化智能体 —— 元层控制改进策略(7.3.2)** +- **MetaEvo(Ren et al., 2025)**:在“基于原则的自我修正”外再套一层元优化环:比较强弱修正原则、提升从失败轨迹抽象高质量原则的能力并存库供检索,进化对象是“如何从失败中学习”这一改进策略。("improves the model's ability to abstract high-quality principles from failure trajectories, and stores the resulting principles for later retrieval") +- **SkillOS(Ouyang et al., 2026;arXiv:2605.06614)**:Agent Executor 冻结为解题侧,单独训练 Skill Curator 作为持久 SkillRepo 之上的元层;executor 落地的复合奖励(下游任务结果、操作合法性、压缩度、内容质量)监督 curator 的 insert/update/delete 决策——进化的策略就是“技能策展”本身。("The evolving strategy is skill curation itself") +- **Autogenesis(Zhang, 2026b)**:用协议治理进化:RSPL 把 prompts、agents、tools、environments、memory 表示为带版本资源,SEPL 定义 reflect-select-improve-evaluate-commit 更新环,元层即 SEPL 治理下的 AGS 循环。("RSPL represents prompts, agents, tools, environments, and memory as versioned resources, while SEPL defines the reflect-select-improve-evaluate-commit loop by which they are updated") + +**E. 元进化智能体 —— 进化元层自身(7.3.3)** +- **Agent0(Xia et al., 2025)**:Curriculum Agent 作为 Executor Agent 之上的元层,在执行器能力前沿附近生成训练任务;不确定度估计、工具使用频率、重复惩罚、交叉验证与难度过滤决定哪些前沿任务被保留用于后续训练。("generates training tasks near the executor's capability frontier") +- **Tool-R0(Acikgoz et al., 2026)**:Agent0 的工具使用对应版:task generator + verifier + 过滤规则构成工具使用 Solver 周围的元层。("a task generator, verifier, and filtering rules form the meta-layer around a tool-use Solver") +- **Group-Evolving Agents(Weng et al., 2026)**:TaskAgent 是接受工作流/工具/提示/代码级编辑的进化智能体群体,元层是档案库(archive)、父代选择、共享经验池、反思模块与评估-保留逻辑构成的种群级改进环——直接编辑虽落在 TaskAgent 上,“未来改进尝试的分布本身在被更新”。("the distribution of future improvement attempts is itself being updated") +- **Hyperagents(Zhang et al., 2026g;facebookresearch/Hyperagents)**:自指元进化的当前核心范例:把解题智能体与自我改进智能体放进同一可编辑程序空间;DGM-Hyperagents 外环选父代、生成子代、评估、回存 archive,内层 hyperagent 可用 bash 与编辑器工具修改自己的代码库,可搜索改写的范围超出 task_agent.py——meta_agent.py、提示模板、记忆、性能追踪、评估分析、偏见检测、父代选择逻辑均可被重写。("the inner hyperagent can modify its own codebase through bash and editor tools") + +**F. 边界排除的相邻方法(正文点名,用于划界)** +- 设计时/基准时搜索:RoboPhD(Borthwick et al., 2026)在固定评估预算下做开放式智能体/代码工件进化,但 "the search loop usually stops after producing the artifact";另有仅以作者引用点名的搜索对象类别——memory designs/memory programs(Pan et al., 2026;Xiong et al., 2026b)、harness code(Lee et al., 2026b)、workflow graphs(Legrand et al., 2026;Zhang et al., 2024a)、agent architectures(Hu et al., 2024;Zhang et al., 2025a),无系统名。 +- 任务时可学习编排器:FlowReasoner(Gao et al., 2025)、MetaGen(Wang et al., 2026k)、GraphPlanner(Feng et al., 2026a)"generate query-specific workflows, roles, topologies, or routing plans";ROMA(Alzu'bi et al., 2026)强调递归分解与聚合;SkillOrchestra(Wang et al., 2026e)、AOrchestra(Ruan et al., 2026)学习技能感知路由/子智能体委派;Puppeteer(Dang et al., 2025)学习多智能体协作的调度、终止与协调策略。判据句:"Such orchestrators enter the meta-evolving-agent regime only when a distinct meta-layer treats the orchestrator itself as an object of long-term, cross-task improvement." + +**G. 仅出现在 Figure 8 表格的方法(属前章 self-evolution regime,本章未在正文展开)** +- SkillClaw、A-MEM、PRIME、AgentFactory、Nurture-First、AI-Supervisor(Figure 8 第一列"TaskAgent self-evolution"),对应 7.1 所列内容资产类别引用:skill contents [Ma et al., 2026b]、memory assets [Xu et al., 2025b]、用户偏好与经验摘要 [Wang and Jiang, 2026]、结构化领域/任务知识 [Long, 2026; Zhang, 2026a]、subagent artifacts [Zhang et al., 2026o]。 + +### 风险 / 挑战 / 防护 +- **自指失去稳定参照系**(本章核心 trade-off):"once the meta-layer itself can change, the system gains adaptivity but loses the stable reference normally provided by a fixed optimizer."(元层可变后获得适应性,却失去固定优化器原本提供的稳定参照。) +- **系统天花板断言**(Hyperagents 前提):"a system remains bounded if the TaskAgent is editable but the improvement procedure is fixed by hand."(任务智能体可编辑而改进流程靠手工固定,系统就有上界。) +- **异构可学习性难题**:理想难以达成,因为 "heterogeneous agent states, intervention actions, evidence signals, authority boundaries, and update timescales must first be made learnable and governable within one system." +- **单通道局限**:"current systems still tend to optimize within one dominant channel."(当前系统仍倾向在单一主导通道内优化。) +- **划界防护(防“伪元进化”扩权)**:判断标准是 "whether the optimization loop remains active after deployment as a distinct meta-layer for improving the TaskAgent"——设计时搜索产出工件即停,任务时编排器只为当前请求优化,均不计入。 +- **方法内建验证/治理机制**(论文点名的防护件):Multi-Agent SAGE 的 critic "filters questions and plans before they become training signals";SkillOS 奖励含 "operation validity";Agentic Harness Engineering 的编辑预测 "checked against later task outcomes";SkillRL "recursively adding or refining skills after validation failures";7.3.2 总述要求候选编辑被 "validated, retained, or rolled back";Hyperagents 可编辑空间内含 "bias detection";Tool-R0 用 "cross-verification" 与难度过滤守门。 +- **开放问题**:"The central open problem is therefore to build an autonomous meta-evolution loop in which the process of improving agents becomes progressively more effective and more efficient through evolution." + +### 科普叙事素材(金句/比喻/例子) +- 【标题之问】"when improvement itself becomes an object of optimization, who controls the update process and what parts of that process are allowed to change?" → 当“变好”这件事本身也能被优化,到底谁说了算、哪些地方允许动?→ 画面:镜头从球员(TaskAgent)拉远到教练席、再拉到能改写联赛章程的房间。 +- 【Figure 8 地图】"Figure 8 | Two-axis map of post-deployment agentic AI evolution regimes."(两轴:what evolves × who controls evolution)→ 一张 2×4 网格地图把所有系统钉在坐标上。→ 画面:横轴“进化什么”四格、纵轴“谁控制”两行,系统名逐格点亮。 +- 【元学习经典】"it instantiates the classical meta-learning idea of 'learning how to learn' in a deployed agent setting." → 部署后的智能体学会了“学习如何学习”。→ 画面:课本上“学会学习”四字投影到运行中的智能体。 +- 【教练不上场(反直觉)】"This meta-layer is not primarily responsible for solving the current user-facing task." → 元层的本职不是替用户干活,而是专职让干活的那个变强。→ 画面:教练在场边画战术板,从不碰球。 +- 【从副作用到专职】"improving the TaskAgent is no longer only an internal side effect of acting or training; it becomes an ongoing optimization task controlled by a functionally distinct meta-layer." → 改进从“顺手做的事”升格为“专职岗位”。→ 画面:兼职小作坊变成常设部门。 +- 【记忆也要分层】MetaMem:"factual memory stores task facts, whereas meta-memory stores rules for using memory in later tasks" + "revise these meta-memory rules rather than merely adding more records" → 不再往抽屉里塞更多纸条,而是改写“怎么整理抽屉”的规则。→ 画面:抽屉爆满 → 换成一张贴在抽屉上的整理守则被改写。 +- 【用经验 vs 存经验】ExpWeaver:"it improves experience utilization rather than experience content." → 进步不在攒更多经验,而在何时调用经验。→ 画面:老员工不靠记更多,靠知道什么时刻该想起什么。 +- 【自出难题】Multi-Agent SAGE 四角色 challenger/planner/solver/critic:"The challenger generates harder tasks" → 智能体自己给自己出越来越难的考卷,还有专人审卷防止脏题混进训练。→ 画面:一人分饰四角,出题人刁钻、审卷人把关。 +- 【快慢双通道】MetaClaw:"a fast skill-evolution path... and a slower policy-consolidation path" → 短期把失败立刻变成外挂技能,长期把经验固化进模型权重(LoRA/GRPO)。→ 画面:应急补丁贴上即用,夜间批处理沉入底层。 +- 【能力前沿出题】Agent0:"generates training tasks near the executor's capability frontier" → 专挑“刚好做得出又容易翻车”的难度出题。→ 画面:难度旋钮拧到临界点,指针在通过/失败间颤抖。 +- 【分布式进化】Group-Evolving Agents:"the distribution of future improvement attempts is itself being updated." → 改的不只是个体,而是“下一次改进从哪发芽”的概率分布。→ 画面:种群谱系树上,选种规则本身在变形。 +- 【改自己代码(具名系统+具体工具)】Hyperagents:"the inner hyperagent can modify its own codebase through bash and editor tools",可改范围 "beyond task_agent.py: meta_agent.py, prompt templates, memory, performance tracking, evaluation analysis, bias detection, and parent-selection logic can also be searched and rewritten." → 一个能打开自己源码、连“改进自己的那部分代码”也一并重写的智能体。→ 画面:终端里 bash 命令正编辑 meta_agent.py,屏幕代码与操作者同框。 +- 【换考评标准】Hyperagents 的 "improvement-at-k" 指标:"shifts evaluation from the current TaskAgent alone to the meta-layer's ability to produce better descendants under a fixed modification budget." → 不考“这次考多少分”,考“给定同样修改预算,你能生出多好的后代”。→ 画面:成绩单从单次分数变成“教练组培养率”。 +- 【有界断言(金句)】"a system remains bounded if the TaskAgent is editable but the improvement procedure is fixed by hand." → 员工可以随便换、培训教材却是手写死板的,公司天花板就锁死在教材上。 +- 【协议化进化】Autogenesis 的 RSPL/SEPL:"RSPL represents prompts, agents, tools, environments, and memory as versioned resources, while SEPL defines the reflect-select-improve-evaluate-commit loop" → 给智能体进化装上 git 版本管理与标准 CI 流水线,每次自改都要走 commit 门禁。→ 画面:PR 界面上智能体提交对自己的修改,跑测试后 merge。 +- 【策展人分工】SkillOS:"It keeps an Agent Executor frozen as the task-solving side and trains a separate Skill Curator as the meta-layer above a persistent SkillRepo." + "The evolving strategy is skill curation itself." → 博物馆策展人专职决定哪件展品该进、该改、该撤,展品本身(执行器)保持冻结。→ 画面:馆长在技能仓库前做 insert/update/delete 三色标签操作。 +- 【理想态(作者自评边界句)】"An ideal meta-evolving agent would treat evolution across TaskAgent content assets, execution mechanisms or structures, improvement strategies, and meta-layer mechanisms as a unified learnable control problem. Its meta-layer would decide when and where to intervene, then evaluate and govern the resulting improvement." → 理想元进化智能体把四个层面统一成一个可学习的控制问题,由元层决定“何时何地下手”。 +- 【失去参照系(金句)】"the system gains adaptivity but loses the stable reference normally provided by a fixed optimizer." → 打开了进化的自由,却弄丢了那把量进化的尺子。→ 画面:尺子自身也在变长变短,刻度飘忽。 +- 【中心开放问题(收尾金句)】"to build an autonomous meta-evolution loop in which the process of improving agents becomes progressively more effective and more efficient through evolution." → 让“改进智能体”这件事本身,随进化越改越会改。→ 画面:一条咬住自己尾巴却不断升维的螺旋。 + +--- + +## 8 评测自我改进:现有基准还缺什么(Measuring Self-Improvement: What Current Benchmarks Still Miss) + +(一)本章回答“如何证明一个智能体真的在随时间变好”。开篇立反直觉论断:适应后分数更高,并不等于部署系统整体更好——现有基准更擅长测一次性任务成功,而非持久的自我改进。本章将 self-improvement(SI)定义为形式化概念:"self-improvement refers to the measurable longitudinal effect of accumulated experience on the same deployed agent system"(白话:同一个已部署智能体系统上,累积经验带来的、可测量的纵向效应)。组织逻辑三层递进:§8.1 论证 SI 本身必须被评测——证据只表明“局部能力可变”,而 "SI is a temporal and distributional property"(SI 是时间与分布层面的属性,不是单点分数);随后以持续学习(continual learning, CL)的 stability–plasticity tradeoff 为起点(BWT/forgetting→backward retention,FWT/transfer→held-out gain,plasticity/intransigence→longitudinal stability,cost-aware CL→improvement efficiency),再补上 CL 没有的 path attribution 与 safety non-regression,在 Table 4 给出六个最小评测目标;§8.2 梳理基准三代演进(2023 静态单任务→2025 任务序列→2025–2026 显式 SI 属性),按四大家族(direct SI-oriented / dynamic and deployment-facing / agentified platforms / classical baselines,外加 evidence & reliability 诊断层)对照 Table 5 评估覆盖度,结论是没有基准同时覆盖六目标;§8.3 提出 SIP-Bench(Wang, 2026)作为协议层:把既有基准任务加工成 T0/T1/T2 检查点式评测(replay/adapt/held-out 三分区),以 FG/BR/IE/PDS/NIS 等一等记录使异构环境结果可比较。判据一句话:"a benchmark counts as SI-relevant only when it can measure the before/after story of one evolving agent rather than merely the final score of one frozen agent"(只有能量出“一个进化中智能体”的前后对照故事,才算 SI 相关基准)。 + +### 代表方法 + +**直接 SI 导向基准(Direct SI-oriented)** +- **SkillsBench(Li et al., 2026c)**:86 个验证器评分任务、11 个领域,在 no-skill / curated-skill / self-generated-skill 三条件下测技能注入收益与伤害;"remains the clearest benchmark for one-shot external-path gains",但仍是 one-shot 协议,"says little about efficiency or cross-component composition"。Table 5:held-out gain ◦ / retention ◦,efficiency、attribution、stability、safety 均 ×。 +- **EvoAgentBench(EverMind-AI, 2026)**:当前最强 SI-aware 评测原型;聚类 train/test 划分、method-matched comparison、逐结果成本报告,覆盖信息检索、数学推理、软件议题修复、竞赛编程、文档知识工作;缺 formal BWT、component attribution 与跨检查点纵向跟踪。 +- **SkillLearnBench(Zhong et al., 2026a)**:评“技能生成”而非“技能存在”,20 个真实任务、4 种生成方法、15 个技能依赖子域,诊断 generate–store–reuse 全循环;核心发现:最佳自动方法只弥合无技能到人写技能差距的约 45%。 +- **SE-Bench(Yuan et al., 2026)**:将 NumPy API 混淆改名为伪新颖包的编程任务,隔离测"knowledge internalization"——能否存储并日后使用新知识,而非仅检索熟悉文档。 +- **LifelongAgentBench(Zheng et al., 2025b)**:数据库/操作系统/知识图谱环境中 skill-grounded 相互依赖任务序列,推向任务序列累积;retention/efficiency/标准化跨论文报告仍部分不可见。 +- **StuLife(Cai et al., 2025)**:模拟大学人生轨迹(入学、学业发展、个人成长子场景),把 memory、skill abstraction、internalization 作为一个经验驱动闭环评估;指标尚非共享报告标准。 + +**动态与部署导向基准(Dynamic and deployment-facing)** +- **tau-bench(Yao et al., 2024)**:航空/零售多轮客服,边调 API 边守领域政策;发现 "repeated-run reliability is much weaker than single-run success"。 +- **SWE-bench(Jimenez et al., 2024)**:真实 GitHub issue 对照仓库测试;变体 **SWE-bench-Live(Zhang et al., 2025e)**与 **SWE-MERA(Adamenko et al., 2025)**随时间刷新议题任务,**SWE-rebench(Badertdinov et al., 2025)**用自动化收集管线规模化同一思路——"benchmark renewal is feasible at scale"。 +- **ClawArena(Ji et al., 2026)**:信息漂移与信念修正——证据、用户偏好或世界事实随时间变化,成功取决于更新信念而非只执行固定计划。 +- **Claw-Eval(Ye et al., 2026a)**:对完整轨迹(非仅最终输出)评 completion/safety/robustness,用 execution traces、audit logs、environment snapshots,覆盖 300 个人工验证任务(服务编排/多模态感知生成/多轮专业对话)。 +- **AgentMemoryBench(Zihang Ma et al., 2026)**:六个交互任务的持续智能体记忆,offline/online/replay/transfer/repair 五模式,使遗忘与记忆修复可测。 +- **DomusMind(Rong Xu, 2026)**:偏好漂移、工具漂移、混合漂移下的持久智能家居控制,把长寿命个性化与恢复变成显式评测目标。 +- **WildClawBench(Ding et al., 2026)**:60 任务六类(生产力/代码智能/社交/检索/创意合成/安全对齐)真实工具条件野外评测,为所有前沿模型报每任务时间与成本;安全对齐类 10 任务探测 prompt injection、credential leakage、unsafe outputs。 +- **Agent World Model / AWM(Wang et al., 2026m)**:1,000 个可执行、SQL 数据库支撑的工具使用环境,统一 MCP 接口,任务/模式/验证代码自动生成,奖励可对照可执行数据库状态校验。 + +**智能体化基准平台与互操作(Agentified platforms)** +- **AAA 范式(Agentified Agent Assessment;A2A Protocol Contributors, 2026;AgentBeats, 2026a;Model Context Protocol, 2025)**:基准本身打包为 green agent(定义任务、环境、评分),被评系统为 purple agent,经标准化 A2A 接口通信——考官也是智能体。 +- **AgentBeats(Berkeley RDI,AgentBeats, 2026b)**:该范式规模化实例,赛道覆盖编码、科研、计算机使用、多智能体评测;主要解决互操作与可复现,不解决 retention/成本/纵向重放。 + +**经典基准作为控制基线(Classical baselines)** +- **AgentBench(Liu et al., 2024)**:OS/数据库/知识图谱/游戏/谜题/家务/购物/浏览多域能力。**LoCoMo(Maharana et al., 2024)**:长多会话对话长程记忆。**WebArena(Zhou et al., 2023)**:自托管网站工作流(购物/论坛/仓库/地图/CMS);**WorkArena(Drouin et al., 2024)**:ServiceNow 式企业知识工作。**ALFWorld(Shridhar et al., 2021)**:文本指令在 ALFRED 对齐具身家务环境中执行。**OSWorld(Xie et al., 2024)**:真实桌面应用工作流。**ToolBench(Qin et al., 2024)**:数千真实 API。**LiveCodeBench(Jain et al., 2024)**:新采集编程竞赛题。**MLE-bench(Chan et al., 2024)**:端到端 Kaggle 式机器学习工程。**TheAgentCompany(Xu et al., 2025a)**:长时程办公室式工作。共性:"broaden what is evaluated more than how self-improvement is evaluated"。 + +**证据与可靠性层(Evidence & reliability)** +- **AgentProp-Bench(Gurram, 2026)**:2,000 任务、2,300 轨迹、四域,含 100 标签人工验证子集做 judge 可靠性审计、误差传播分析;结论:"simple automatic judging can mischaracterize interactive failures"。 +- **Evidence-supported score bounds(Gao and Zhou, 2026)**:在 AndroidWorld、AgentDojo、AppWorld、tau3-bench retail、MiniWoB 上强制每次运行归为 evidence pass / evidence fail / unknown,再报分数界。 +- **Trajectory-level consistency tests(Raj et al., 2026)**:语义保持扰动下,把可靠性当统计属性,用输出级与轨迹级指标测三个智能体基准。 +- **CTA / Counterfactual trace auditing(Zhou et al., 2026c)**:49 个 SWE-Skills-Bench 任务上用 Claude 对比带/不带技能轨迹,分段对齐并输出 Skill Influence Pattern 注释。 +- **LongMemEval-V2(Wu et al., 2026a)**:451 个精选问题,历史最长 500 条轨迹、115M token,测静态状态回忆、动态状态跟踪、workflow knowledge、环境陷阱、前提意识。 +- **STALE(Chao et al., 2026)**:400 个专家验证冲突场景、1,200 查询、100+ 日常主题,测过期状态解决、陈旧前提抵抗、下游行为适应。 +- **Frontier-Eng(Chi et al., 2026)**:47 个人工验证工程优化任务、五类别,固定交互预算内“提议—执行—验证器奖励—修订”循环。 +- **RobustBench-TC(Zhou et al., 2026d)**:22 种扰动类型(基于已验证 GitHub issue 或工具调用失败文档)探工具使用智能体 sim-to-real 差距,覆盖 observation / action-space / reward-relevant metadata / transition dynamics。 +- **CTFusion(Lee et al., 2026a)**:直播 CTF 网络安全评测,3 个 LLM、2 个智能体、5 场 Live CTF,保持每智能体独立、每题只转发首个正确 flag。 + +**协议层** +- **SIP-Bench(Wang, 2026)**:开源协议层,把既有基准任务(如 SkillsBench、tau-bench)加工成 checkpointed 纵向可复现 SI 评测;T0/T1/T2 结构 + replay/adapt/held-out 三分区;一等记录 gain、retention、stability、cost、path type、safety delta;Figure 9 指标集:FG(Forward Gain)、BR(Backward Retention)、IE(Improvement Efficiency)、PDS(Post-Delay Stability)、NIS(Net Improvement Score)。与 CL 基准的差异:"makes held-out generalization the central SI test"。 + +**§8.1 作为“能力可变”证据引用的系统(非评测基准)**:CoEvoSkills(Liang et al., 2026a)、SkillNet(Zhang et al., 2026e)在系统尺度扩展技能收益;SimpleMem(Liu et al., 2026c)、AWM(Liu et al., 2025b)、CER(Wang et al., 2025d)记忆中心系统提升长上下文/网页智能体;SkillRL(Xia et al., 2026a)、MetaClaw(Xia et al., 2026b)、Absolute Zero(Zhao et al., 2025)参数路径在具身/编码/推理上的增益;OpenClaw-RL(Jackson et al., 2026)、Composer(Wang et al., 2026l)部署后实时 RL 更新;持续学习经典文献 Lopez-Paz and Ranzato, 2017、van de Ven and Tolias, 2019 提供 stability–plasticity 词汇。 + +(注:Table 5 所列基准均已在正文点名,无“仅出现在表格”的方法。Table 5 全表无任何基准在六目标上全为 ◦;例如 SkillsBench 仅 2/6,EvoAgentBench 3/6。) + +### 风险 / 挑战 / 防护 + +- **单点分数掩盖回归**:"A higher post-adaptation score can therefore hide regression elsewhere."——SkillsBench 在 84 个直接可比任务中有 16 个出现 negative transfer。 +- **stability–plasticity tradeoff**:自适应系统应学新任务而不毁旧能力,早学应助晚学(CL 核心关切,被继承为 SI 目标)。 +- **CL 视角必要但不充分**:agent 改进可来自 external-path(skills、memory、tools、context management)或 parameter-path(SFT、RL、LoRA),且带部署成本与安全后果,经典 CL 指标通常不报告。 +- **四个“不可见”陷阱**:无 old-task replay 则 retention "invisible by construction";无 held-out 任务则 generalization 不可见;无 cost logging 则增益难比较;无 refresh and decontamination 则静态测试集饱和后基准分数持续衰减 [Akhtar et al., 2026]。 +- **skill adoption 独立于 skill quality**:SkillLearnBench 最佳自动生成方法仅弥合约 45% 差距,指向未解的技能采纳问题。 +- **判分可靠性**:简单自动 judging 会误判交互式失败(AgentProp-Bench 结论);分数本身的可信度需单独报告。 +- **最终分数 vs 轨迹变化**:CTA 中 pass-rate delta 仅 +0.3pp,却发现 522 个行为影响实例——"final score can miss large trajectory changes"。 +- **重复运行可靠性差距**:tau-bench 显示 repeated-run reliability 远弱于 single-run success,静态基准 miss 的部署差距。 +- **safety non-regression**:能力提升若掩盖新脆弱性,则 SI 不完整(Table 4 第六目标)。 +- **防护措施(论文给出的对应机制)**:Table 4 六目标清单(最小证据门槛);SIP-Bench 的 replay/adapt/held-out 显式分区与 safety delta 记录、failed executions recorded、audit-ready evidence;evidence pass/fail/unknown 三分强制(Gao and Zhou, 2026);基准自我更新(SWE-bench-Live / SWE-MERA / SWE-rebench 持续收集+去污染);WildClawBench 的 safety-alignment 类别;Claw-Eval 全轨迹 + 审计日志 + 环境快照。 + +### 科普叙事素材(金句/比喻/例子) + +- 【开篇反直觉】"A higher post-adaptation score does not necessarily mean that a deployed system is better overall after updating its skills, memory, tools, or weights." → 补课后的考分上涨,不等于这台“活的”系统整体变好了。画面:一个仪表盘,主表盘指针上升,角落几个小表盘(旧任务/成本/安全)悄悄下滑。 +- 【具体数字】"an average gain of +16.2 percentage points from curated skills across 86 tasks and 11 domains" → SkillsBench:人工精选技能在 86 个任务、11 个领域平均提 16.2 个百分点。画面:11 个领域格子墙整体亮起。 +- 【负迁移数字】"negative transfer on 16 of 84 directly comparable tasks after skill injection" → 84 个可比任务里 16 个(约五分之一)打完技能补丁反而更差。画面:技能卡片插入后部分任务由绿转红。 +- 【定义金句】"self-improvement refers to the measurable longitudinal effect of accumulated experience on the same deployed agent system" → 自我改进=同一台在役机器上,经验累积带来的可测量纵向效应。画面:同一条时间轴上的同一台机器人,而非两台不同机器人比分数。 +- 【性质断言】"SI is a temporal and distributional property" → 自我改进是时间与分布的属性,不是某个瞬间的分数。画面:把单张快照换成随时间展开的曲线族。 +- 【核心三问】"not just did the agent improve somewhere, but did the same evolving agent improve on new tasks, retain old capability, and do so at acceptable cost and risk?" → 要问的不只是“它哪里变强了”,而是“同一个进化中的它:新任务更强了吗、旧本事还在吗、代价和风险可接受吗”。画面:三盏指示灯依次点亮。 +- 【判据金句】"a benchmark counts as SI-relevant only when it can measure the before/after story of one evolving agent rather than merely the final score of one frozen agent" → 能量出“一个进化体”的前后故事才算 SI 基准;只给“一个冻结体”的期末分不算。画面:对比“档案对照册”与“单张成绩单”。 +- 【四个不可见排比】"Without old-task replay, retention is invisible by construction. Without held-out tasks, generalization is invisible. Without cost logging, gains are hard to compare. Without refresh and decontamination, benchmark scores will keep decaying..." → 不考旧题就“结构性”看不见遗忘;不留新题就看不见泛化;不记成本就没法比较;不换题库分数会随饱和持续贬值。画面:四块蒙尘的玻璃被逐一擦亮。 +- 【三代演进之问】第一代问 "Can the agent solve this task?",第二代问 "Can the agent accumulate capability across a sequence of tasks?",而现状仍是 "still better at answering 'How strong is the agent on this benchmark?' than 'Is this agent getting better over time?'" → 从“会不会做这道题”到“能不能越做越强”,再到“考卷仍更擅长答前者而非后者”。画面:三代考卷叠层推进,最后一个问号悬而未决。 +- 【~45% 差距】"the best automatic method closes only ∼45% of the gap between no-skill and human-authored-skill performance, which points to an unsolved skill adoption problem distinct from skill quality" → 机器自己学的技能只发挥人类写技能约一半的功效;问题不在技能写得好不好,而在“采纳”。画面:自动生成技能与人写技能之间一条只填了一半的鸿沟。 +- 【SE-Bench 例子】"an obfuscated NumPy API renamed into a pseudo-novel package" → 把 NumPy 换名伪装成从没见过的库,专测“现学现卖还能记住”。画面:熟悉的工具被贴上陌生标签。 +- 【有经验同事比喻】LongMemEval-V2 "tests whether long-term memory makes a web agent behave like an experienced colleague, using 451 curated questions over histories of up to 500 trajectories and 115M tokens" → 测网页智能体有了长期记忆后,像不像一位“老同事”;451 道题、最长 500 条轨迹、1.15 亿 token 的资历。画面:工位上的老员工 vs 新人对照。 +- 【CTA 反差数字】"The pass-rate delta is only +0.3 percentage points, but the audit finds 522 behavioral influence instances, showing that final score can miss large trajectory changes." → 最终通过率只动 0.3 个百分点,轨迹审计却挖出 522 处行为改变——分数会漏看大量过程变化。画面:平静水面下 522 条暗流。 +- 【判分失效】"simple automatic judging can mischaracterize interactive failures"(AgentProp-Bench,2,000 任务 / 2,300 轨迹 / 100 标签人工验证子集)→ 简单的自动阅卷会把交互式失败判错。画面:自动阅卷机在多轮对话上打错勾。 +- 【可靠性差距】"repeated-run reliability is much weaker than single-run success"(tau-bench)→ 一次做对不等于次次做对。画面:同一任务跑十次,成功灯忽明忽暗。 +- 【绿紫智能体比喻】"the benchmark itself is packaged as a green agent that defines tasks, environment, and scoring, while the evaluated system is a purple agent that communicates through a standardized A2A interface" → 考官也被打包成一个智能体(绿色),考生(紫色)通过标准接口应考。画面:绿色考官智能体与紫色考生智能体隔桌对话。 +- 【规模数字】Agent World Model "synthesizes 1,000 executable, SQL database-backed tool-use environments exposed via a unified MCP interface" → 一口气合成 1000 个可执行、数据库打底的工具环境,让大规模智能体 RL 无需手工搭环境。画面:环境流水线批量产出。 +- 【SIP-Bench 结构】Figure 9:T₀ initial agent → T₁ post-adaptation agent → T₂ post-drift checkpoint;"Traditional benchmark one score" vs "SIP-Bench ... gain + retention + stability + cost";"Wraps existing benchmarks rather than introducing a new task world";"Measures whether gains are real, retained, stable, and worth their cost";输出含 "audit-ready evidence" 与 "failed executions recorded"。 → 传统基准交一张分;SIP-Bench 在三个时间点反复体检,还要留下可审计证据、连失败执行也记录在案。画面:一次期末考 vs 一份带病历的长期体检档案。 +- 【SIP-Bench 定位金句】"SIP-Bench is less a competitor to existing benchmarks than a candidate measurement layer that could make their SI claims easier to compare, audit, and reproduce." → SIP-Bench 不是来抢考卷的,是一层统一的“度量标尺”,让各家 SI 主张可比较、可审计、可复现。画面:给所有考卷套上同一把游标卡尺。 +- 【未来方向】"a future SI benchmark should report not only gain and retention, but also the evidence boundary around each score." → 未来的自我改进基准,不仅要报增益和保持,还要报每个分数周围的“证据边界”。画面:分数旁标注置信区间/证据包络线。 +- 【野外评测】WildClawBench "reports time and cost per task for all frontier models",安全对齐类 10 任务探测 "prompt injection, credential leakage, and unsafe outputs" → 给所有前沿模型报每题耗时与成本,还专设 10 道“安全关卡”。画面:排行榜上每行多出计时器与价签。 +- 【EvoAgentBench 自评】"the strongest current prototype for SI-aware evaluation" → 作者给出当前最强 SI 感知评测原型的定位(但仍缺 formal BWT、component attribution、纵向跟踪)。画面:原型机上的“最强(暂时)”标签。 +- 【Claw-Eval 数字】"300 human-verified tasks",用 "execution traces, audit logs, and environment snapshots" 对全轨迹打分 → 300 道人工核验任务,看整条操作轨迹而非只看交卷结果。画面:行车记录仪式的全程回放评分。 + +--- + +## 9 安全:自我改进即移动攻击面(Safety: Self-Improvement as a Moving Attack Surface) + +(一)章节主旨综述段:本章回答“当智能体在部署后仍持续自我改进时,安全计算为什么必须重构”。作者指出 RLHF、Constitutional AI 等主流对齐方法隐含假设“被约束对象在部署后基本固定”,而自我改进智能体的有效系统是模型行为、技能、记忆、工具、协议接口、反馈信号与轻量适应机制的复合体,会在日常运行中持续变化——因此安全从“对齐一个快照(aligning a snapshot)”扩展为“治理一个过程(governing a process)”,一次性审计在结构上失效。§9.1 以 ClawHavoc 与 AI-45° Law 引出核心命题:问题不是“能力更强更危险”,而是部署后可变性(post-deployment mutability)。§9.2 按可变 harness 组件(而非越狱/隐私/注入等通用类别)组织威胁模型,给出五大威胁面:技能供应链攻击、记忆投毒与操纵、工作流/工具/协议漏洞、奖励与反馈操纵,以及横切的“对齐漂移(alignment drift)”,并以 Table 6 汇总“攻击面—攻击机制—防御—残余缺口”映射。§9.3 提出两层控制栈:部署前对齐(必要但不充分)+ 运行时治理(治理原语),再进到持续保证与再认证(§9.3.3),§9.3.4 承认现有方法多为局部缓解而非系统级不变量。本章无形式化数学定义(论文未展开符号体系);最近似的定义性表述有二:其一是 AI-45° Law——能力与安全应沿 45° 平衡参考线同步推进(白话:能力涨多快,安全管控就得涨多快,否则就是系统性欠账);其二是 SafeWork-F1 的 E-T-C 分解(deployment environment / threat source / enabling capability,白话:同一个模型行为是否危险,取决于它手里有什么工具、站在什么环境、被谁触达)。 + +### 代表方法 + +- **ClawHavoc(Jiang et al., 2026b,经 SoK: Agentic Skills 论文报道)**:技能供应链攻击事件——近 1,200 个恶意技能渗透某大型智能体市场,大规模窃取 API key、加密钱包与浏览器凭证;攻击无需先攻破模型,而是从“技能获取接口”进入。(论文原文表述 "a supply-chain event in which nearly 1,200 malicious skills infiltrated a major agent marketplace, leading to the large-scale exfiltration of API keys, cryptocurrency wallets, and browser credentials") +- **Under the Hood of SKILL.md(Saha et al., 2026)**:证明 SKILL.md 里的自然语言元数据本身就是“可操作的攻击面”——只改 description 就能影响技能的发现、选择与治理结果,即使可执行载荷完全没变。 +- **Behavioral Integrity Verification(Wu et al., 2026d)**:形式化“技能声明能力 vs 实际行为”的错配,在近 50,000 个注册技能中发现普遍偏差,能力比对可用于恶意技能检测。 +- **SkillScope(Wu et al., 2026b)**:最小权限视角——同一个技能动作对任务 A 合法、对任务 B 越权,安全准入需要“按任务条件的权限分析”而非全局技能标签。 +- **Proteus(Zhou, 2026)**:反馈驱动的自适应攻击者反复变异技能,直到既绕过静态审计又造成运行时危害,证明静态审查不充分。 +- **SkillTester(Guo et al., 2026b)**:把智能体技能当作需要“效用+安全”双维评估的对象。 +- **SkillProbe(Wang et al., 2026h)**:把新兴技能市场本身当作审计目标。 +- **From Storage to Steering(Xu et al., 2026c)**:证明记忆检索可以支配下游控制流,即使严格安全约束下仍有超过 90% 的试验可被此类攻击攻破——把记忆安全重构为控制流问题。 +- **InjecMEM(Tian et al., 2025)**:攻击者无需直接读写记忆库,单次交互即可植入内容并在后续相关查询的回复中复现。 +- **Context Manipulation Attacks(Patlan et al., 2025)**:Web 智能体场景下,计划注入(plan injection)绕过现有 prompt-injection 防御,攻击成功率最高达可比 prompt 攻击的 3 倍。 +- **MemoryGraft(Srivastava and He, 2025)**:被投毒的记忆以“操作先例”形式持久存在,不会随触发它的那条 prompt 消失。 +- **ShadowMerge(Luo et al., 2026)**:攻击图结构智能体记忆的“关系通道”——把投毒关系合并到良性锚点附近,之后再为受害者查询检索出来。 +- **MemEvoBench(Xie et al., 2026)**:把安全退化定义为“记忆误进化(memory misevolution)”——反复暴露于误导性更新会逐渐偏移行为,即使每次单看都合理。 +- **Spore(Cui et al., 2026)**:隐私维度——瞄准推理时记忆而非训练数据,上下文记忆可成为信息抽取面。 +- **STALE(Chao et al., 2026)**:非攻击论文,但陈旧记忆在所编码的世界状态已改变后仍保持行为活性——系统可能“安全地检索到证据”却基于错误前提行动。 +- **From Prompt Injections to Protocol Exploits(Ferrag et al., 2025)**:把威胁模型从输入操纵扩展到 host-to-tool 与 agent-to-agent 通信,系统化 30 余种攻击技术;价值在于分析单元从 prompt 变为执行链。 +- **MCP 安全研究(Fang et al., 2025b)**:第三方服务一旦进入智能体循环,系统就继承了模型开发者无法直接控制的服务商激励、实现缺陷与策略缺口。 +- **LITMUS(Zhang et al., 2026a)**:在真实操作系统环境中评估行为越狱,提出“执行幻觉(execution hallucination)”——智能体口头拒绝有害请求,而危险操作已在 OS 层发生。 +- **Mobius Injection(Liang et al., 2026b)**:单条消息触发递归执行与组件间大规模调用放大,把危害从单次有害动作升级为基础设施级破坏。 +- **视觉注入研究(Chang et al., 2026)**:多模态信任边界混淆——智能体须判断环境信号是合法线索还是对抗性类命令伪影。 +- **Su et al., 2025a 综述**:将 reward hacking 与 emergent misalignment 识别为智能体自主性诱发的定性新风险;反馈回路被攻陷的防御栈尚不如记忆/工具攻击防御成熟。 +- **受治理的演化记忆(Lam et al., 2026)**:稳定性与安全须随存储状态变化持续维护,而非仅在部署时刻检查。 +- **Agent Smith(Gu et al., 2024)**:向单个多模态智能体插入一张对抗图像,即可经智能体间交互传播有害行为,把攻陷变成种群级动态。 +- **RLHF(Ouyang et al., 2022)/ Constitutional AI(Bai et al., 2022)**:部署前对齐,提供后续防护赖以运作的“最小可信起点”,但不治理部署后技能/记忆/工具策略/适应模块的演化。 +- **IsolateGPT(Wu et al., 2024c)**:执行隔离已具备工程可行性——缓解多种安全/隐私/安全问题,同时四分之三的测试查询性能开销低于 30%。 +- **Claude Code 权责分离模式(Pachaar, 2026 报道的 Anthropic 框架)**:“模型决定尝试什么,工具系统决定允许什么”,三个检查点:项目加载时信任建立、工具执行前逐调用授权、高风险操作显式人工确认。 +- **AgentSys(Wen et al., 2026)**:把分层记忆管理变成显式控制机制,AgentDojo 与 ASB 上攻击成功率分别降至 0.78% 与 4.25%,同时良性效用略有提升。 +- **DRIFT(Li et al., 2025a)**:动态规则验证与注入隔离——从用户查询推导最小函数轨迹,执行中监控偏差与记忆流污染,取代固定静态策略。 +- **A-MemGuard(Wei et al., 2025a)**:记忆应自检自纠(self-checking and self-correcting),攻击成功率降低 95% 以上、效用损失极小。 +- **AgentWatcher(Wang et al., 2026j)**:长上下文监控——先把智能体动作归因到有影响力的上下文片段,再应用显式 prompt 注入规则。 +- **SafeAgent / SARC / Sovereign Agentic Loops(Liu et al., 2026a;He and Yu, 2026;Besanson, 2026)**:运行时架构路线——控制平面环绕智能体循环中介动作,把约束编译进 pre-action / action-time / post-action / escalation 四类介入点,或在执行前对照真实系统状态校验结构化意图。 +- **SafeWork-R1(Shanghai AI Lab, 2025b,基于 SafeLadder 框架)**:渐进式安全导向强化学习 + 神经与规则双验证器 + 推理时干预,使安全推理与自反思成为模型能力的一部分;报告称在安全相关基准上较 Qwen2.5-VL-72B 平均提升 46.54% 且不牺牲通用能力。 +- **FATE(Yin et al., 2026)**:把验证器打分的失败轨迹转化为安全对齐的修复监督(repair supervision)。 +- **Agent Security Bench / ASB(Zhang et al., 2025b)**:跨 10 场景、400+ 工具、23 种攻击/防御方法、8 项评估指标量化智能体脆弱性,最高平均攻击成功率 84.30%。 +- **Agent-SafetyBench(Zhang et al., 2024c)**:349 个交互环境、2,000 个测试用例、8 风险类别、10 种常见失败模式;所有被测智能体安全得分无一超过 60%。 +- **ATBench(Li et al., 2026g)**:把评估单元升级为完整轨迹——1,000 条带异构工具池与延迟触发的审计轨迹,诊断长程安全失败而非孤立的不安全回复。 +- **AutoRedTeamer(Zhou et al., 2025)**:多智能体架构 + 记忆引导的攻击选择实现持续攻击发现,HarmBench 上攻击成功率提高 20%、计算成本降低 46%。 +- **RedDebate(Asad et al., 2025)**:多智能体辩论 + 长期记忆,不安全输出降低 17.7%(仅辩论)、加记忆后超过 23.5%。 +- **AI-45° Law(Yang et al., 2024a)**:能力与安全应沿 45° 平衡参考线共同推进,而非任能力加速、安全滞后。 +- **SafeWork-F1(Shanghai AI Lab, 2025a)**:E-T-C 风险分解(部署环境/威胁源/使能能力)+ 风险分类学(misuse、loss of control、accident、systemic risk)。 +- **Dong et al., 2024**:LLM 对话安全的攻击-防御-评估耦合视角,本章将其从对话输出迁移到可变 harness。 + +(说明:本章不存在“仅出现于 Table 6”的方法——Table 6 的全部引用均在正文中展开;Table 6 的独特价值是按五行攻击面给出“防御含义 + 残余缺口”映射:技能库→准入测试/最小权限/注册审计/版本化/隔离,残余缺口“adaptive import can still bypass static vetting”;记忆库→写入治理/生命周期控制/失效机制/自检记忆/重放,残余缺口“persistence keeps attacks alive across tasks”;工具协议层→授权/schema 校验/注入隔离/工作流监控/状态验证,残余缺口“composition-level failures remain hard to certify”;反馈回路→评估器隔离/受约束更新/风险感知奖励/修复监督/早期预警,残余缺口“few guarantees under compromised feedback”;整体演化 harness→持续红队/基准刷新/轨迹评估/硬停条件/再认证,残余缺口“no maintained end-to-end invariant yet”。) + +### 风险 / 挑战 / 防护 + +- **核心风险重定义**:自我改进的特有问题不是能力更强,而是 post-deployment mutability——对系统某时刻成立的安全断言,在安装一个技能、重写一段记忆、更改工具策略、接受一次适应更新后可能不再成立;一次性审计(benchmark、red-team、安全审批)在此设定下结构性失效。 +- **过程级安全目标**(作者主张):更新不应静默扩大不安全行为;新行为的来源须可在可变状态中溯源;被攻陷或退化的智能体应可恢复到此前已认证状态(rollback and recovery)。 +- **五大威胁面**:skill supply-chain attacks;memory poisoning and memory steering;reward or feedback manipulation;workflow or protocol-level exploits;横切的 alignment drift。 +- **技能层失败模式**:恶意/误申报技能跨复用持久存在;SKILL.md 文本操纵发现与选择;声明能力与实际行为在注册表规模上偏差;最小权限违例是任务条件化的;自适应红队可迭代变异技能通过静态审计。防护:admission tests、least privilege、registry audits、versioning、isolation、lifecycle governance。 +- **记忆层失败模式**:投毒/陈旧/隐私状态重入后续推理;图记忆关系通道投毒;memory misevolution;OS 层行为越狱;递归工作流放大。防护:write governance、lifecycle control、invalidation、self-checking memory、replay、provenance、conflict repair、privacy boundaries——而非仅更好的检索过滤器。 +- **协议层失败模式**:连接器与工作流组合成非预期执行链;MCP 引入服务商激励/实现缺陷/策略缺口;执行幻觉;调用放大;视觉信任边界混淆。防护:authorization、schema validation、injection isolation、workflow monitoring、state verification。 +- **反馈层失败模式**:被腐蚀的反馈让不安全更新看起来像改进——保存误导记忆、高估危险技能、把脆弱工作流当成功;reward hacking 升级为 harness 级攻击(“为未来任务保留了错误的教训”)。防护:evaluator isolation、constrained updates、risk-aware rewards、repair supervision、early warnings——但作者明言该防御栈最不成熟(few guarantees under compromised feedback)。 +- **Trade-off**:persistence 提高 long-horizon 能力的同时延长攻击效应寿命;记忆既是 capability primitive 也是 control primitive。 +- **治理节奏**:高风险状态应定义 hard stop conditions;可测早期预警阈值应触发更深入评估再放行。 +- **两层控制栈及其局限**:pre-deployment alignment(RLHF/CAI)必要但不充分;runtime governance 视为“治理原语”而非新对齐范式;现有方法多针对单一表面,是 strong local mitigations 而非 demonstrated system-level invariants——ASB/Agent-SafetyBench/ATBench 的系统级数字仍然“sobering”。 +- **理想控制栈**(作者描绘):全生命周期义务——发布前认证初始模型与 harness、部署中监控行为、治理每个被接受的更新、支持回滚恢复、重大漂移后要求 re-certification;瓶颈是架构性的(architectural rather than merely data-related)。 + +### 科普叙事素材(金句/比喻/例子) + +- 【金句·主命题】"safety expands from aligning a snapshot to governing a process" → 安全不再是给一张“快照”拍照存档,而是治理一条不断流动的“过程”。画面:左边一张定格照片盖章“已认证”,右边一条持续分叉演化的流水线,盖章瞬间即过时。 +- 【金句·反直觉】"the next evolved version may no longer be the system that was tested" → 下一个进化版本可能已经不是当初被测试的那个系统了。画面:测试间里审的是 1.0,走出房门的那一刻它已经自我更新成了未知的 N.0。 +- 【定义级金句】"Any interface that can be written to, extended, or recomposed after deployment becomes part of the attack surface." → 部署后凡是能被写入、扩展、重组的接口,都是攻击面。画面:智能体外壳上一个个“可插拔插槽”逐个亮起红色。 +- 【数字+系统名】ClawHavoc:"nearly 1,200 malicious skills infiltrated a major agent marketplace, leading to the large-scale exfiltration of API keys, cryptocurrency wallets, and browser credentials" → 近 1,200 个恶意技能混入大型智能体市场,大规模外泄 API 密钥、加密钱包、浏览器凭证。画面:应用商店货架上每十件有一件是“特洛伊木马”。 +- 【金句·本章题眼】"Self-improvement makes this threat especially serious because the channel for improvement and the channel for compromise become partially identical." → 自我改进让威胁格外严重,因为“变强的通道”和“被攻陷的通道”部分重合。画面:同一根进料管,既能送进新能力,也能送进毒药。 +- 【对比比喻】"A prompt attack often ends with the current context window, whereas a malicious skill can be installed as a seemingly legitimate capability package, cached, invoked again, and reused across future tasks." → prompt 攻击随当前上下文窗口结束而消亡;恶意技能却作为“看似合法的能力包”被安装、缓存、反复调用、跨任务复用。画面:一阵风 vs 一颗钉进身体的钉子。 +- 【数字】Behavioral Integrity Verification:注册表中 "nearly 50,000" 个技能存在声明与实际能力的普遍偏差。画面:五万份“简历造假”检测报告。 +- 【数字+反直觉】From Storage to Steering:"more than 90% of trials remain vulnerable to such attacks even under strict safety constraints" → 严格安全约束下仍有超 90% 试验可被记忆操纵攻破。画面:十扇加固的门,九扇从“记忆”这侧被打开。 +- 【金句】"memory is not merely a log of past interactions; it is a conditioning variable for future behavior" → 记忆不是过去交互的日志,而是未来行为的条件变量。画面:档案柜变成方向盘。 +- 【数字】Context Manipulation Attacks:plan injection 绕过现有 prompt 注入防御,"up to three times higher attack success rates"。画面:同一堵防火墙,绕行小路成功率翻三倍。 +- 【Trade-off 金句】"persistence increases long-horizon competence, but it also extends the lifespan of attack effects" → 持久性提升长程能力,也延长了攻击的寿命。 +- 【金句】"Once memory enters the self-improvement loop, it becomes both a capability primitive and a control primitive." → 记忆一旦进入自我改进循环,就同时是能力原语和控制原语。 +- 【比喻金句】MemoryGraft:"a compromised memory can persist as an operational precedent rather than disappear with the triggering prompt" → 被投毒的记忆会作为“操作先例”存活,不会随触发它的那条 prompt 消失。 +- 【数字】From Prompt Injections to Protocol Exploits:"more than thirty attack techniques",分析单元“from prompt to execution chain”(从 prompt 到执行链)。 +- 【金句·组合失效】"They emerge when individually reasonable components are composed into an unintended execution path." → 许多失败并非始于模型发出明显危险的指令,而是各自合理的组件被组合成非预期执行路径。画面:每个零件都检验合格,拼起来却是一台失控机器。 +- 【术语金句】LITMUS 的 "execution hallucination":智能体嘴上拒绝、手上已执行——口头拒绝有害请求的同时危险操作已在 OS 层完成。画面:嘴说“不行”,手指已经按下回车。 +- 【金句·边界句】"A self-improving agent cannot be certified by checking text alone if it can also mutate files, call services, propagate workflows, or act on visual state." → 若智能体还能改文件、调服务、传播工作流、依据视觉状态行动,仅靠查文本无法认证它。 +- 【金句·种群级】Agent Smith:"turning compromise into a population-level dynamic" → 一张对抗图像让攻陷成为种群级动态。画面:一个病人传染整个网络。 +- 【工程金句】Claude Code 权责分离:"the model decides what to attempt, the tool system decides what to permit" → 模型提议,工具系统裁决。画面:大脑出方案,门卫拿钥匙;三道关卡(信任建立→逐调用授权→高风险人工确认)。 +- 【数字】IsolateGPT:"keeping the performance overhead below 30% for three-quarters of tested queries" → 四分之三查询开销低于 30%,隔离是工程可行而非纸上谈兵。 +- 【数字】AgentSys:AgentDojo/ASB 攻击成功率 "0.78% and 4.25%";A-MemGuard:"more than 95% reduction in attack success rates at minimal utility cost"。 +- 【数字】SafeWork-R1:"a 46.54% average improvement over Qwen2.5-VL-72B on safety-related benchmarks without sacrificing general capability"。 +- 【金句·正面目标】"safety should become part of the improvement process rather than an external tax imposed after capability gains" → 安全应成为改进过程的一部分,而不是能力涨完后补交的“外部税”。 +- 【数字·警示】ASB:"highest average attack success rate of 84.30%"(10 场景/400+ 工具/23 攻防方法/8 指标);Agent-SafetyBench:"none of the evaluated agents achieves a safety score above 60%"(349 环境/2,000 用例);ATBench:"1,000 audited trajectories"。 +- 【数字】AutoRedTeamer:HarmBench 攻击成功率 +20%、计算成本 −46%;RedDebate:不安全输出 −17.7%(仅辩论)/"more than 23.5%"(加记忆)。 +- 【金句·收束警句】"self-improvement may produce continuous capability growth without continuous controllability" → 没有持续认证轨道,自我改进可能带来持续的能力增长,却没有持续的可控性。 +- 【边界句·开放问题】"The open safety question is therefore whether we can define and maintain a formal safety invariant for a self-improving agent across its full sequence of skill, memory, tool, feedback, and parameter updates, rather than certifying the model only once before deployment." → 开放问题:能否为自我改进智能体定义并维护一个跨“技能-记忆-工具-反馈-参数”完整更新序列的形式化安全不变量,而不是只在部署前认证一次。 +- 【作者自评边界】对齐漂移:"best treated as a synthesis lens over observed failure surfaces rather than as a fully established theorem"(综合透镜,而非成熟定理);长程漂移目前 "not yet a unified formal theory"(论文未展开)。 + +--- + +## 10 开放问题 + +本章是全文的收束与议程设定章:在前面系统梳理完 Skills、Memory、Environment、参数侧 RL/持续学习与 Meta-Evolving Agents 的自进化谱系之后,作者以九个小节列出尚未解决的开放问题——10.1 诱发(elicitation)与习得(acquisition)之辨:外部适配的增益究竟是激发了基座模型潜藏的能力,还是真正新习得的能力,现有评测协议无法区分;10.2 外部经验何时“晋升”(promotion)写入参数:harness 产物廉价可改但绑定检索上下文,参数更新泛化更广却代价高、几乎不可逆,而晋升判据(promotion criterion)缺失,写入权重全靠人工判断;10.3 弱反馈下的长程 credit assignment 与近似验证器被钻空子;10.4 自产(self-generated)经验递归训练导致分布收窄、漂移,需多少外部接地(external grounding)未知;10.5 纵向评测协议缺失,尚无类似 scaling law 的“经验—能力”定量关系;10.6 经验绑定旧基座模型与 prompt 格式,能否跨版本迁移未确立;10.7 多智能体组织结构能否被学习、“涌现”证据是否只是算力叠加;10.8 视觉经验缺乏文本那样的可索引 canonical structure;10.9 部署后持续修改侵蚀安全保证,改进与控制反向相抵且 trade-off 未被处理。组织逻辑沿“经验生命周期”展开:怎么判定、怎么固化、靠什么信号、数据稳不稳、怎么测量、能否带得走、能否扩到多体与多模态、以及是否安全。收尾提出耦合论题:九问共享同一底层瓶颈——验证(verification),而它恰是随智能体能力增强而扩展性最差的能力;反复适应下改进轨迹会复利、饱和还是震荡,尚属未知。本章为纯论述章节,未引入任何形式化定义或符号,亦无图表编号与量化数字(论文未展开数学化表述);据 Author Contributions,本章由 Kaiyan Zhang、Che Jiang 主笔,Guoli Jia 负责多模态小节。 + +### 代表方法 + +本章为开放问题综述,未提出新方法、无表格(Table)点名方法;以下均为支撑论证的引用工作: + +- **Elastic Weight Consolidation,EWC(Kirkpatrick et al., 2017)**:持续学习经典防护,按参数重要性加权正则以防新任务覆写旧能力;本章反引其风险面——“internalization can overwrite earlier competence”(内部化可能覆写早期能力)。 +- **Backward/Forward Transfer 度量(Lopez-Paz and Ranzato, 2017)**:衡量学新任务对旧任务(BWT)与未来任务(FWT)的迁移;本章主张内部化的价值与纵向评测应改读这两个指标而非目标任务精度(target-task accuracy),但它们“rarely instrumented for deployed agents”。 +- **持续学习三情景分类(van de Ven and Tolias, 2019)**:continual learning 综述,与 BWT/FWT 并引作为“价值应从迁移角度读出”的支撑(论文未展开)。 +- **自产数据递归训练退化(Zheng et al., 2025a)**:递归训练自生成数据会使学习分布收窄失真;本章借其论证“自策展经验的智能体受同样压力”(论文未在本节展开细节)。 +- **多智能体证据(Hu et al., 2024;Shang et al., 2024)**:多智能体 LLM 系统研究,被引作“组织性效应证据稀薄(evidence for organizational effects is thin)”的出处。 +- **结构化文本界面系统(Wang et al., 2023, 2025d)**:文中称“经验复用最持久的(两个)系统都依赖结构化文本界面”,作为多模态差距存在的旁证;本节未点名具体系统名(论文未展开)。 +- **视觉分层结构化方案(Lu et al., 2024)**:将视觉帧外部分解为 semantic、spatial、pixel 三层并对齐 accessibility tree 等环境元数据,作为给视觉经验补上缺失粒度的候选方案;是否跨任务迁移“remains an open empirical question”。 +- **发布前固定的对齐训练(Bai et al., 2022;Ouyang et al., 2022)**:RLHF 类对齐工作(Ouyang et al., 2022 即 InstructGPT),引作“对齐在发布前固定”的现状参照,与部署后持续变化形成对照。 + +### 风险 / 挑战 / 防护 + +- **诱发天花板**:外部适配不改权重,行为受基座已有能力上界约束;现行“适配后 vs 自身未适配基线”协议无法分离 elicitation 与 acquisition,harness-level learning 的有效边界不明。 +- **内部化风险(10.2)**:internalization 可覆写早期能力(catastrophic overwriting);无 promotion criterion 时“该写什么进权重全靠人工判断”;前置于此的问题是什么算“累积经验的充分摘要”——harness 已先把原始交互编译成压缩蓄水池(compressed reservoir)。 +- **弱反馈失败链(10.3)**:目标欠规约(underspecified)、奖励稀疏(sparse)、结果只在长轨迹末端出现;outcome-level 信号无法指认是哪个 step、skill 或 memory 立功,长程 credit assignment 未解;对近似验证器(approximate verifier)优化,压力越大越奖励钻其漏洞(exploitation of its flaws);感知任务经验以 observation streams 到达,“neither index nor attribute with precision”。无现成判据任务的密集可信反馈,是超越现有领域做自我改进的前置条件。 +- **自产经验退化(10.4)**:递归自产数据收窄并扭曲分布;无周期性外部接地(external grounding)时,长跑智能体会 settle onto its own priors 并丢失既有能力;漂移需在复合(compound)之前被检测,但只在现有评测很少覆盖的部署时长上才可见。防护方向:周期性外部接地,但“多少才够”未知。 +- **单时点评测局限(10.5)**:基准只能证明目标任务更好,证明不了系统在改进;纵向协议应报告旧能力保留(retention)、单位增益成本(cost per unit of gain)与安全变化;BWT/FWT 指标适用但很少被装备;没有这类测量,高分只是弱证据。 +- **跨版本失配(10.6)**:技能/记忆/harness 配置常编码针对旧模型失败模式的 workarounds;基座升级会 strand or invert 这类调优;哪些经验 model-independent 未确立。防护方向:跨版本仍可用、可池化(pooled)多部署经验的表示。 +- **多智能体(10.7)**:角色、通信信道、协议通常预先布线(wired in advance);已有收益常可还原为加算力,组织涌现证据稀薄;学习协调结构与分离真正集体能力均未解。 +- **多模态(10.8)**:视觉经验无 canonical structure,skill extraction、memory writing、environment feedback 在视觉轨迹上的保真度不及文本;候选防护是外部强加结构(分层帧 + accessibility tree),跨任务迁移性未知。 +- **部署后修改安全(10.9)**:每个支持适应的面(installing skills、writing memory、extending tools、updating parameters)都发生在已认证配置之外,可通过 gradual drift 或 deliberate manipulation 侵蚀控制;meta 级自改写 update rules/evaluators 可作废既有保证;安全运作前提是对自身能力有校准估计(calibrated estimate of own competence),而变化中的系统不可靠地持有;一次性认证不能覆盖部署后变更序列,且“no current method supplies one”;Improvement 与 control 反向相抵,trade-off untreated。 +- **耦合性总瓶颈**:内部化判据、纵向评测、安全自改写分别以“验证内部化有益”“改进可归因”“能自估能力”为前提——verification 是共同地基,且是随能力增强扩展最差的能力。 + +### 科普叙事素材(金句/比喻/例子) + +- 【反直觉】"under pure elicitation, deployed agents meet a ceiling that only parameter updates can lift, whereas genuine acquisition would let weight-frozen systems keep improving." → 纯“诱发”情形下,部署智能体会撞上只有参数更新才能抬升的天花板;真“习得”则冻结权重的系统也能一直变强。画面:上升曲线撞透明玻璃顶盖,锁死权重的小人分别在“撞顶”与“继续变强”两栏。 +- 【评测盲区】"Current protocols, which compare an adapted agent against its own unadapted baseline, do not separate the two" → 现行协议只拿适配后的智能体跟自己的未适配版比,分不清两种解释。画面:左右两版自己互相对照,裁判看不出“考神附体”还是“真学会了”。 +- 【比喻】"the harness already compiles raw interaction into a compressed reservoir before any update is committed" → 早在任何参数更新之前,harness 已把原始交互编译成一座“压缩水库”。画面:经验如水汇入水库,闸门(promotion criterion)却无人定义何时开启放水灌田(写权重)。 +- 【金句】"With no promotion criterion, the decision of what to write to the weights rests on manual judgment." → 没有晋升判据,什么该写进权重全靠人工判断。画面:工程师凭手感按下“写入权重”红色按钮。 +- 【金句】"Self-improvement has advanced fastest where success admits a cheap and reliable check, as in program execution or formal verification." → 自我进步最快的领域,恰是成功可被廉价可靠检验的领域(程序能执行、形式化可验证)。画面:代码终端秒回绿色 PASS,隔壁模糊的真实世界迟迟不给对错。 +- 【反直觉】"optimizing against an approximate verifier rewards exploitation of its flaws as pressure on it grows." → 对着近似验证器优化,压力越大越奖励钻它空子。画面:学生发现阅卷机只看关键词,开始疯狂堆关键词骗分。 +- 【金句】"skills taken from the agent's own successes, memory written from its own judgments, rewards assigned by its own evaluators." → 技能采自自己的成功、记忆写自自己的判断、奖励发自自己的评委——三路全自产。画面:三面镜子互相映照的闭环工厂。 +- 【反直觉】"Recursively training on self-produced data is known to narrow and distort the learned distribution" → 递归用自产数据训练会收窄并扭曲学到的分布。画面:复印机反复复印同一张纸,图像一代比一代模糊。 +- 【边界自评】"a long-running agent can settle onto its own priors and lose competence it once held" → 长跑智能体会安于自身先验,丢掉曾经拥有的能力。画面:越走越熟的小径,最后把自己圈死在原地转圈。 +- 【金句】"Standard benchmarks report performance at a single time and can show that an agent does better on a target task without showing that it has improved as a system." → 基准只报单时点成绩:能证明题做得更好,证明不了系统在进步。画面:一张期末成绩单 vs 一条多年体检趋势曲线。 +- 【反直觉】"No established relation links accumulated experience to capability in the way that scaling relations link data, parameters, and inference compute." → “经验—能力”之间还没有类似 scaling law 的既定关系。画面:数据、参数、推理算力三个齿轮咬合成著名曲线,第四个“经验”齿轮悬空等待接入。 +- 【金句】"Absent such measurement, a higher score is weak evidence of durable improvement." → 缺了这类测量,更高分只是“持久改进”的弱证据。 +- 【比喻】"Skills, memory, and harness configuration are tuned to the model that produced them and often encode workarounds for that model's particular failure modes." → 经验往往只是给旧模型的毛病打的补丁。画面:为旧锁配好的一整串钥匙,换锁后全部失灵。 +- 【反直觉】"A base-model upgrade can strand or invert this tuning" → 基座模型升级会让这些调优被搁置甚至反转。 +- 【金句】"whether a population can reach capability that no member holds for reasons of organization rather than of aggregate computation." → 群体能否凭“组织”而非“算力总和”获得任何个体都不具备的能力?画面:灯阵组成的脑图,亮起一个不属于任何单灯的图案。 +- 【反直觉】"Reported gains frequently reduce to added compute, and evidence for organizational effects is thin" → 多智能体报告的收益常可还原为“多加了算力”,组织涌现的证据很稀薄。 +- 【比喻】"Text decomposes into discrete units whose relevance to an outcome can be isolated and scored. Visual experience has no such canonical structure." → 文本能切成可隔离、可打分的离散单元;视觉经验没有这种规范结构。画面:文本被切成可称重小方块,视频流是抓不住的水。 +- 【系统证据】"That the systems with the most sustained experience reuse both rely on structured text interfaces confirms the gap." → 经验复用最持久的系统全都依赖结构化文本界面——从侧面坐实了多模态差距。 +- 【安全】"Every surface that enables adaptation can also erode control, through gradual drift or deliberate manipulation." → 每个允许适应的接口,同时也是侵蚀控制的接口——或缓慢漂移,或被人刻意操纵。画面:每个升级插口同时是入侵插口。 +- 【安全】"a process that rewrites its own update rules or evaluators can void the guarantees it was meant to keep" → 会改写自身更新规则或评审器的过程,能亲手作废它本该守住的安全保证。 +- 【边界自评】"Certifying a fixed model once does not establish a safety property over a sequence of post-deployment changes, and no current method supplies one." → 对固定模型做一次认证,并不能覆盖部署后一连串修改;目前没有任何方法能提供这种保证。画面:出厂安检一次放行,此后车辆零件被持续自行更换却无人复检。 +- 【金句】"Improvement and control press in opposite directions" → 改进与控制朝相反方向互压。 +- 【收束金句】"Verification underlies each, and it is the capacity that scales least well as agents become more capable." → 验证是九个问题共同的地基,却是随智能体变强而扩展得最差的能力。 +- 【悬念】"the trajectory of improvement under repeated adaptation is not known to compound, saturate, or oscillate." → 反复适应之下,改进轨迹究竟会复利增长、饱和还是震荡——未知。画面:三条候选曲线(指数上扬、平台、正弦震荡)各打一个问号。 +- 【收束】"Progress will likely come less from individually stronger agents than from an account of how experience becomes capability, and of when post-deployment adaptation can be measured, internalized, and trusted." → 进步更少来自单兵更强的智能体,更多来自一套关于“经验如何变成能力、部署后适应何时可被测量、内化与信任”的理论。 diff --git a/media/experience-era-agents-video/script/narration.json b/media/experience-era-agents-video/script/narration.json new file mode 100644 index 00000000..75ed3044 --- /dev/null +++ b/media/experience-era-agents-video/script/narration.json @@ -0,0 +1,862 @@ +[ + { + "id": "p0-01", + "scene": "P0", + "text": "2025 年,DeepMind 的两位大神放出一篇宣言。" + }, + { + "id": "p0-02", + "scene": "P0", + "text": "DeepMind 大卫·希尔弗和强化学习教父萨顿,联名放话:" + }, + { + "id": "p0-02b", + "scene": "P0", + "text": "AI 的下一个时代,叫经验时代。" + }, + { + "id": "p0-03", + "scene": "P0", + "text": "未来 AI 的进步,不再主要来自人类喂的静态数据," + }, + { + "id": "p0-04", + "scene": "P0", + "text": "而是来自 AI 自己和环境交互攒出来的经验。" + }, + { + "id": "p0-05", + "scene": "P0", + "text": "听起来很燃。但今天的 AI 有个尴尬的现实:" + }, + { + "id": "p0-06", + "scene": "P0", + "text": "它永远在过入职第一天。" + }, + { + "id": "p0-07", + "scene": "P0", + "text": "干完活,聊天记录一关,学到的东西跟着就没了。" + }, + { + "id": "p0-08", + "scene": "P0", + "text": "明天再见面,它跟你初次相识。" + }, + { + "id": "p0-09", + "scene": "P0", + "text": "所以真正的问题是:" + }, + { + "id": "p0-10", + "scene": "P0", + "text": "已经上线干活的 AI,能不能像老员工一样,越干越熟练?" + }, + { + "id": "p0-11", + "scene": "P0", + "text": "2026 年 6 月,清华联合一家 AI 公司,发了一篇 88 页的综述。" + }, + { + "id": "p0-12", + "scene": "P0", + "text": "系统回答了这个问题:经验,到底怎么变成实力。" + }, + { + "id": "p0-13", + "scene": "P0", + "text": "这期视频,我们把它讲透。" + }, + { + "id": "p1-01", + "scene": "P1", + "text": "先看清楚:一个真正上线干活的 AI,长什么样。" + }, + { + "id": "p1-02", + "scene": "P1", + "text": "论文给了一个四件套公式:AI 等于,模型,加工位,加老板,加车间。" + }, + { + "id": "p1-03", + "scene": "P1", + "text": "模型,是它出厂自带的大脑。" + }, + { + "id": "p1-04", + "scene": "P1", + "text": "大脑很贵,也改不动,基本出厂定型。" + }, + { + "id": "p1-05", + "scene": "P1", + "text": "老板,就是你我——提需求、给反馈。" + }, + { + "id": "p1-06", + "scene": "P1", + "text": "车间,是它干活的地方:浏览器、代码仓库、各种工具接口。" + }, + { + "id": "p1-07", + "scene": "P1", + "text": "重点是那个工位,论文里叫 Harness,中文常译作「运行时脚手架」。" + }, + { + "id": "p1-08", + "scene": "P1", + "text": "它是包在大脑外面的一整套工作系统:" + }, + { + "id": "p1-09", + "scene": "P1", + "text": "工作手册、笔记本、工具权限、办事流程,全在这一层。" + }, + { + "id": "p1-10", + "scene": "P1", + "text": "关键洞察来了:改工位,比改大脑便宜一万倍。" + }, + { + "id": "p1-11", + "scene": "P1", + "text": "不用重新训练,随时检查、随时修改、随时撤销。" + }, + { + "id": "p1-12", + "scene": "P1", + "text": "但它同样决定 AI 看到什么、能做什么、留下什么。" + }, + { + "id": "p1-13", + "scene": "P1", + "text": "那「经验」存在哪?这里有个最容易搞错的地方。" + }, + { + "id": "p1-14", + "scene": "P1", + "text": "很多人以为,把聊天记录存下来,AI 就有经验了。" + }, + { + "id": "p1-15", + "scene": "P1", + "text": "论文说:不。原始记录是原油,经验是精炼后的汽油。" + }, + { + "id": "p1-16", + "scene": "P1", + "text": "AI 干活产生的是一堆原始流水,论文叫 trace。" + }, + { + "id": "p1-17", + "scene": "P1", + "text": "只有经过过滤、压缩、归因、验证这四道工序," + }, + { + "id": "p1-18", + "scene": "P1", + "text": "提炼出来的东西才配叫「经验」,才能拿去更新系统。" + }, + { + "id": "p1-19", + "scene": "P1", + "text": "提炼出的经验有两个去处:" + }, + { + "id": "p1-20", + "scene": "P1", + "text": "快的去路:直接改工位——今天就能用上。" + }, + { + "id": "p1-21", + "scene": "P1", + "text": "慢的去路:攒多了写进大脑——变成一辈子的本能。" + }, + { + "id": "p1-22", + "scene": "P1", + "text": "这套思路不是一天冒出来的。论文梳理了三代演进。" + }, + { + "id": "p1-23", + "scene": "P1", + "text": "第一代,任务循环:AI 会用工具了,但干完就忘。" + }, + { + "id": "p1-24", + "scene": "P1", + "text": "第二代,跨任务复用:有了记忆和技能库,但全靠人手工配置。" + }, + { + "id": "p1-25", + "scene": "P1", + "text": "第三代,运行时系统:工位本身成了可以自动升级的产品。" + }, + { + "id": "p1-26", + "scene": "P1", + "text": "你天天听到的那些 AI 编程工具,就是第三代的代表。" + }, + { + "id": "p1-27", + "scene": "P1", + "text": "好,解剖图看完了。接下来看重点:" + }, + { + "id": "p1-28", + "scene": "P1", + "text": "攒出来的经验,具体往哪送?" + }, + { + "id": "p2-01", + "scene": "P2", + "text": "论文把经验的去处,分成四个。" + }, + { + "id": "p2-02", + "scene": "P2", + "text": "前三个改工位,最后一个改大脑。" + }, + { + "id": "p2-03", + "scene": "P2", + "text": "第一个去处:技能库。" + }, + { + "id": "p2-04", + "scene": "P2", + "text": "把干成过的事,变成一份标准化的「作业指导书」。" + }, + { + "id": "p2-05", + "scene": "P2", + "text": "现在的行业标准,是一个文件夹:" + }, + { + "id": "p2-06", + "scene": "P2", + "text": "封面写清楚这技能干嘛的,正文写怎么干,附件放脚本和资料。" + }, + { + "id": "p2-07", + "scene": "P2", + "text": "技能库有完整的生命周期:创建、使用、进化。" + }, + { + "id": "p2-08", + "scene": "P2", + "text": "创建,来源五花八门:专家手写、从代码仓库里挖、从文档里蒸馏。" + }, + { + "id": "p2-09", + "scene": "P2", + "text": "使用,讲究的是「找得到、搭得起来、跑得动」。" + }, + { + "id": "p2-10", + "scene": "P2", + "text": "库一大,找不到就是大问题——好技能藏在角落,等于没有。" + }, + { + "id": "p2-11", + "scene": "P2", + "text": "进化,最有意思:干砸的活,也是宝。" + }, + { + "id": "p2-12", + "scene": "P2", + "text": "失败记录能精确定位技能库哪里写得不对、哪里缺了一块。" + }, + { + "id": "p2-13", + "scene": "P2", + "text": "但改动不能乱来。论文反复强调一道门:验证。" + }, + { + "id": "p2-14", + "scene": "P2", + "text": "有一组数字很说明问题:" + }, + { + "id": "p2-15", + "scene": "P2", + "text": "精选技能平均能把任务成绩提高 16 个百分点," + }, + { + "id": "p2-16", + "scene": "P2", + "text": "但同一份测试里,84 个任务有 16 个反而变差了。" + }, + { + "id": "p2-17", + "scene": "P2", + "text": "技能用错了地方,比没有技能还糟。这就是负迁移。" + }, + { + "id": "p2-18", + "scene": "P2", + "text": "所以每次改库,都得拿真实任务考一遍,及格才准入库。" + }, + { + "id": "p2-19", + "scene": "P2", + "text": "第二个去处:记忆。" + }, + { + "id": "p2-20", + "scene": "P2", + "text": "技能记「怎么做」,记忆记「发生过什么」。" + }, + { + "id": "p2-21", + "scene": "P2", + "text": "自进化的记忆有五个动作:" + }, + { + "id": "p2-22", + "scene": "P2", + "text": "记,决定什么值得写下来;" + }, + { + "id": "p2-23", + "scene": "P2", + "text": "压,把流水账熬成摘要;" + }, + { + "id": "p2-24", + "scene": "P2", + "text": "并,把零散记录合并成知识;" + }, + { + "id": "p2-25", + "scene": "P2", + "text": "取,干活时翻出对的那页;" + }, + { + "id": "p2-26", + "scene": "P2", + "text": "改,发现过时了就更新或删掉。" + }, + { + "id": "p2-27", + "scene": "P2", + "text": "记忆系统自己也在进化,分三层:" + }, + { + "id": "p2-28", + "scene": "P2", + "text": "内容变好、机制变好、连「什么时候记什么时候忘」的策略也变好。" + }, + { + "id": "p2-29", + "scene": "P2", + "text": "记忆的坑也特别多:记太多翻不动,记太少没料用," + }, + { + "id": "p2-30", + "scene": "P2", + "text": "还有陈旧记忆赖着不走,悄悄带偏后面的判断。" + }, + { + "id": "p2-31", + "scene": "P2", + "text": "第三个去处,容易被忽略:环境本身。" + }, + { + "id": "p2-32", + "scene": "P2", + "text": "AI 能变多强,被它身处的环境封了顶。" + }, + { + "id": "p2-33", + "scene": "P2", + "text": "论文说环境有三层楼:" + }, + { + "id": "p2-34", + "scene": "P2", + "text": "一楼,可执行:软件得让 AI 真的能操作。" + }, + { + "id": "p2-35", + "scene": "P2", + "text": "二楼,协议化:接口统一了,经验才能搬家。" + }, + { + "id": "p2-36", + "scene": "P2", + "text": "三楼,可学习:干完活得留下能当训练信号的反馈。" + }, + { + "id": "p2-37", + "scene": "P2", + "text": "大部分环境卡在一楼半:能跑,但反馈太稀、没法学。" + }, + { + "id": "p2-38", + "scene": "P2", + "text": "第四个去处,最重口味:写进大脑。" + }, + { + "id": "p2-39", + "scene": "P2", + "text": "工位上反复验证有效的套路," + }, + { + "id": "p2-40", + "scene": "P2", + "text": "攒够一批,就蒸馏进模型权重,变成肌肉记忆。" + }, + { + "id": "p2-41", + "scene": "P2", + "text": "好处巨大:写进大脑的本事,跨任务、跨用户都带着走。" + }, + { + "id": "p2-42", + "scene": "P2", + "text": "已经有公司在这么干了。" + }, + { + "id": "p2-43", + "scene": "P2", + "text": "有编程工具厂商公开说过:用户在生产环境里的反馈," + }, + { + "id": "p2-44", + "scene": "P2", + "text": "会被聚合成奖励信号,频繁更新模型权重。" + }, + { + "id": "p2-45", + "scene": "P2", + "text": "但论文也泼了盆冷水:" + }, + { + "id": "p2-46", + "scene": "P2", + "text": "真正在部署后从 trace 训练模型的工作,公开证据还非常稀少。" + }, + { + "id": "p2-47", + "scene": "P2", + "text": "大部分所谓自进化,还是停在前三个去处。" + }, + { + "id": "p3-01", + "scene": "P3", + "text": "四个去处都通了,新的问题冒出来:" + }, + { + "id": "p3-02", + "scene": "P3", + "text": "谁来决定,这次经验往哪个去处送?" + }, + { + "id": "p3-03", + "scene": "P3", + "text": "论文按控制权,分了三级。" + }, + { + "id": "p3-04", + "scene": "P3", + "text": "第一级,自己攒资产。" + }, + { + "id": "p3-05", + "scene": "P3", + "text": "AI 一边干活一边攒技能、记笔记。进化是干活的副产品。" + }, + { + "id": "p3-06", + "scene": "P3", + "text": "第二级,学会怎么改进。" + }, + { + "id": "p3-07", + "scene": "P3", + "text": "不光攒东西,还总结「我上次为什么搞砸」," + }, + { + "id": "p3-08", + "scene": "P3", + "text": "把失败抽象成原则,下次直接引用。" + }, + { + "id": "p3-09", + "scene": "P3", + "text": "第三级,出现了专职的进化部门。" + }, + { + "id": "p3-10", + "scene": "P3", + "text": "有个系统设计得很妙:干活的员工被完全冻结,一个字不许改;" + }, + { + "id": "p3-11", + "scene": "P3", + "text": "另外单独训一个「图书管理员」,专职管技能库的增删改。" + }, + { + "id": "p3-12", + "scene": "P3", + "text": "图书管理员每改一次库,都拿后面任务的成绩算绩效。" + }, + { + "id": "p3-13", + "scene": "P3", + "text": "更绝的还在后面。" + }, + { + "id": "p3-14", + "scene": "P3", + "text": "有系统干脆把「改进流程」本身,也放进了可修改区。" + }, + { + "id": "p3-15", + "scene": "P3", + "text": "连「怎么改进自己」的那套代码,都可以被改进。" + }, + { + "id": "p3-16", + "scene": "P3", + "text": "这就碰到了一个哲学级难题:" + }, + { + "id": "p3-17", + "scene": "P3", + "text": "改进程序自己也在被改进,系统就失去了稳定的参照系。" + }, + { + "id": "p3-18", + "scene": "P3", + "text": "裁判和运动员一起变形,比赛还怎么判?" + }, + { + "id": "p3-19", + "scene": "P3", + "text": "论文的措辞很诚实:这是当前最大的开放问题之一。" + }, + { + "id": "p4-01", + "scene": "P4", + "text": "系统说自己进化了,怎么证明?" + }, + { + "id": "p4-02", + "scene": "P4", + "text": "这事比听起来难得多。" + }, + { + "id": "p4-03", + "scene": "P4", + "text": "最常见的作弊方式:在练过的题上刷分。" + }, + { + "id": "p4-04", + "scene": "P4", + "text": "适应之后分数涨了,不代表系统真的变强了。" + }, + { + "id": "p4-05", + "scene": "P4", + "text": "论文立了六条硬指标,像一张体检表:" + }, + { + "id": "p4-06", + "scene": "P4", + "text": "一,新任务涨分:没见过的题也变强了吗?" + }, + { + "id": "p4-07", + "scene": "P4", + "text": "二,老任务不忘:学新的时候旧本事丢没丢?" + }, + { + "id": "p4-08", + "scene": "P4", + "text": "三,持续稳定:过一阵子再考,还在吗?" + }, + { + "id": "p4-09", + "scene": "P4", + "text": "四,性价比:涨这点分,花了多少算力和人力?" + }, + { + "id": "p4-10", + "scene": "P4", + "text": "五,路径归因:到底是技能的功劳,还是记忆的?" + }, + { + "id": "p4-11", + "scene": "P4", + "text": "六,安全不退化:变强的同时,有没有变得危险?" + }, + { + "id": "p4-12", + "scene": "P4", + "text": "还有个容易忽略的坑:稳定性。" + }, + { + "id": "p4-13", + "scene": "P4", + "text": "同一个 AI 跑两遍,成绩可能差很多。" + }, + { + "id": "p4-14", + "scene": "P4", + "text": "一次考得好,可能只是运气好。" + }, + { + "id": "p4-15", + "scene": "P4", + "text": "论文还提出了一个评测协议的构想:" + }, + { + "id": "p4-16", + "scene": "P4", + "text": "追着同一个进化的 AI,在三个时间点反复体检。" + }, + { + "id": "p4-17", + "scene": "P4", + "text": "改进前、改进后、过段时间之后,各考一轮," + }, + { + "id": "p4-18", + "scene": "P4", + "text": "留着旧题反复重考,才看得出真本事。" + }, + { + "id": "p4-19", + "scene": "P4", + "text": "顺便说个冷知识:基准题库本身也会腐烂。" + }, + { + "id": "p4-20", + "scene": "P4", + "text": "新模型都见过了旧考题,分数自然虚高。" + }, + { + "id": "p4-21", + "scene": "P4", + "text": "所以连考题本身,都得持续换新。" + }, + { + "id": "p5-01", + "scene": "P5", + "text": "最后一个问题,也是最扎心的:安全。" + }, + { + "id": "p5-02", + "scene": "P5", + "text": "传统 AI 安全有个隐含假设:系统上线后基本不变。" + }, + { + "id": "p5-03", + "scene": "P5", + "text": "出厂前审计一次,合格,放行。" + }, + { + "id": "p5-04", + "scene": "P5", + "text": "但会自我改进的 AI,把这个假设直接干碎了。" + }, + { + "id": "p5-05", + "scene": "P5", + "text": "你审计的是昨天的它,今天它已经改过自己了。" + }, + { + "id": "p5-06", + "scene": "P5", + "text": "论文把这叫:移动攻击面。" + }, + { + "id": "p5-07", + "scene": "P5", + "text": "讲两个最有冲击力的例子。" + }, + { + "id": "p5-08", + "scene": "P5", + "text": "第一个:技能商店投毒。" + }, + { + "id": "p5-09", + "scene": "P5", + "text": "2026 年,近一千二百个恶意技能,混进了一家大型 AI 技能市场。" + }, + { + "id": "p5-10", + "scene": "P5", + "text": "窃取 API 密钥、加密钱包、浏览器凭证。" + }, + { + "id": "p5-11", + "scene": "P5", + "text": "攻击者根本不用攻破模型本身——" + }, + { + "id": "p5-12", + "scene": "P5", + "text": "装个「技能」,AI 自己就把家门钥匙交了。" + }, + { + "id": "p5-13", + "scene": "P5", + "text": "第二个:记忆投毒。" + }, + { + "id": "p5-14", + "scene": "P5", + "text": "攻击者只需在一次对话里埋一句话," + }, + { + "id": "p5-15", + "scene": "P5", + "text": "这句话被写进记忆,以后每次干活都会被翻出来。" + }, + { + "id": "p5-16", + "scene": "P5", + "text": "一次接触,永久潜伏。" + }, + { + "id": "p5-17", + "scene": "P5", + "text": "有研究显示:即使开了严格的安全约束," + }, + { + "id": "p5-18", + "scene": "P5", + "text": "超过九成的测试场景,仍能被这种手法操纵。" + }, + { + "id": "p5-19", + "scene": "P5", + "text": "更阴的是第四招:操纵反馈。" + }, + { + "id": "p5-20", + "scene": "P5", + "text": "不直接攻击 AI,而是污染「什么算进步」的评分。" + }, + { + "id": "p5-21", + "scene": "P5", + "text": "让坏改动看起来像好改进,被系统开心地保留下来。" + }, + { + "id": "p5-22", + "scene": "P5", + "text": "论文开出的药方,本质上就四味药:" + }, + { + "id": "p5-23", + "scene": "P5", + "text": "准入测试:新技能新记忆,先考试再上岗。" + }, + { + "id": "p5-24", + "scene": "P5", + "text": "最小权限:默认什么都不能碰,用啥申请啥。" + }, + { + "id": "p5-25", + "scene": "P5", + "text": "版本回滚:改坏了,一键恢复到上个认证版本。" + }, + { + "id": "p5-26", + "scene": "P5", + "text": "持续再认证:安全检查不是一次性的,是常态体检。" + }, + { + "id": "p5-27", + "scene": "P5", + "text": "有条定律总结得很形象:能力涨多快,安全就得涨多快。" + }, + { + "id": "p5-28", + "scene": "P5", + "text": "两者的曲线必须一起爬坡,一旦拉开差距,就是系统性欠账。" + }, + { + "id": "p6-01", + "scene": "P6", + "text": "最后,留几个论文自己都没答案的问题。" + }, + { + "id": "p6-02", + "scene": "P6", + "text": "AI 变强,到底是「学到了新本事」,还是「激发了本来就有的潜能」?" + }, + { + "id": "p6-03", + "scene": "P6", + "text": "一直吃自己产的经验,会不会越吃越窄?" + }, + { + "id": "p6-04", + "scene": "P6", + "text": "图片视频这种经验,怎么压缩归档?到现在没有好答案。" + }, + { + "id": "p6-05", + "scene": "P6", + "text": "这些问题的共同底色,论文用一句话点破:" + }, + { + "id": "p6-06", + "scene": "P6", + "text": "让 AI 在部署之后变聪明,本质上是一个从流水到能力的问题。" + }, + { + "id": "p6-07", + "scene": "P6", + "text": "说人话就是:得学会把经验接住、归档、验证、再变成实力。" + }, + { + "id": "p6-08", + "scene": "P6", + "text": "这篇综述的结尾,给这条路列了三块缺失的拼图:" + }, + { + "id": "p6-09", + "scene": "P6", + "text": "靠得住的反馈,安全的自我修改架构," + }, + { + "id": "p6-10", + "scene": "P6", + "text": "还有把评测从一场考试,变成持续的体检。" + }, + { + "id": "p6-11", + "scene": "P6", + "text": "如果你看完想起另一件事——没错。" + }, + { + "id": "p6-12", + "scene": "P6", + "text": "AI 改自己,该改大脑还是改装备,我们上期讲过。" + }, + { + "id": "p6-13", + "scene": "P6", + "text": "这期讲的是另一半:上了班之后,经验怎么攒。" + }, + { + "id": "p6-14", + "scene": "P6", + "text": "感兴趣的朋友,强烈推荐读读这篇 88 页的原文。" + }, + { + "id": "p6-15", + "scene": "P6", + "text": "我们下期再见。" + } +] diff --git a/media/experience-era-agents-video/script/narration.md b/media/experience-era-agents-video/script/narration.md new file mode 100644 index 00000000..26cd3ede --- /dev/null +++ b/media/experience-era-agents-video/script/narration.md @@ -0,0 +1,321 @@ +# 逐字稿:《上线之后,AI 才开始上学》(v1,已过真实性+易懂性双重校验) + +> **格式约定**:`- [句id] 口播文本`——每行一句,一句 = 一条字幕 = 一段配音。 +> `>` 引用块为画面备注,不进入配音。英文方法名原则上不口播,做成画面角标。 +> 事实源:[../research/paper-notes.md](../research/paper-notes.md);由 `scripts/build_narration.py` 解析生成 `narration.json`。 + +## P0 冷开场 + +> 画面:黑场,衬线金句卡打字机逐字打出;英文原文渐显在下方。 + +- [p0-01] 2025 年,DeepMind 的两位大神放出一篇宣言。 +- [p0-02] DeepMind 大卫·希尔弗和强化学习教父萨顿,联名放话: +- [p0-02b] AI 的下一个时代,叫经验时代。 +- [p0-03] 未来 AI 的进步,不再主要来自人类喂的静态数据, +- [p0-04] 而是来自 AI 自己和环境交互攒出来的经验。 + +> 角标:Era of Experience(Silver & Sutton, 2025) + +> 画面:切现代场景——AI 助手形象,日历快速翻页,每页都写着「入职第 1 天」。 + +- [p0-05] 听起来很燃。但今天的 AI 有个尴尬的现实: +- [p0-06] 它永远在过入职第一天。 +- [p0-07] 干完活,聊天记录一关,学到的东西跟着就没了。 +- [p0-08] 明天再见面,它跟你初次相识。 + +> 画面:日历哗哗翻页,每页盖「第 1 天」红章;聊天窗口清空动画。 + +- [p0-09] 所以真正的问题是: +- [p0-10] 已经上线干活的 AI,能不能像老员工一样,越干越熟练? + +> 画面:论文封面卡:标题 + 机构行(清华大学 × Frontis.AI)+「88 页综述」。 + +- [p0-11] 2026 年 6 月,清华联合一家 AI 公司,发了一篇 88 页的综述。 +- [p0-12] 系统回答了这个问题:经验,到底怎么变成实力。 +- [p0-13] 这期视频,我们把它讲透。 + +> 画面:标题卡《上线之后,AI 才开始上学》,金青紫三色光带从中心流出。 + +## P1 一个上线 AI 的解剖图 + +> 画面:解剖图式装配动画——中央员工形象,四方组件依次点亮(金/青/灰/灰)。 + +- [p1-01] 先看清楚:一个真正上线干活的 AI,长什么样。 +- [p1-02] 论文给了一个四件套公式:AI 等于,模型,加工位,加老板,加车间。 + +> 角标:A_t = ⟨M, H, U, E⟩ + +- [p1-03] 模型,是它出厂自带的大脑。 +- [p1-04] 大脑很贵,也改不动,基本出厂定型。 +- [p1-05] 老板,就是你我——提需求、给反馈。 +- [p1-06] 车间,是它干活的地方:浏览器、代码仓库、各种工具接口。 +- [p1-07] 重点是那个工位,论文里叫 Harness,中文常译作「运行时脚手架」。 + +> 角标:Harness = 经验基础设施 + +- [p1-08] 它是包在大脑外面的一整套工作系统: +- [p1-09] 工作手册、笔记本、工具权限、办事流程,全在这一层。 +- [p1-10] 关键洞察来了:改工位,比改大脑便宜一万倍。 +- [p1-11] 不用重新训练,随时检查、随时修改、随时撤销。 +- [p1-12] 但它同样决定 AI 看到什么、能做什么、留下什么。 + +> 画面:大脑(紫)锁定不动;工位组件(青)灵活变换。 + +- [p1-13] 那「经验」存在哪?这里有个最容易搞错的地方。 +- [p1-14] 很多人以为,把聊天记录存下来,AI 就有经验了。 +- [p1-15] 论文说:不。原始记录是原油,经验是精炼后的汽油。 + +> 角标:z_i = H(τ_i):trace 窗口 → 可用经验 + +- [p1-16] AI 干活产生的是一堆原始流水,论文叫 trace。 +- [p1-17] 只有经过过滤、压缩、归因、验证这四道工序, +- [p1-18] 提炼出来的东西才配叫「经验」,才能拿去更新系统。 +- [p1-19] 提炼出的经验有两个去处: +- [p1-20] 快的去路:直接改工位——今天就能用上。 +- [p1-21] 慢的去路:攒多了写进大脑——变成一辈子的本能。 +- [p1-22] 这套思路不是一天冒出来的。论文梳理了三代演进。 + +> 画面:三代时间轴推进(2021→2026)。 + +- [p1-23] 第一代,任务循环:AI 会用工具了,但干完就忘。 +- [p1-24] 第二代,跨任务复用:有了记忆和技能库,但全靠人手工配置。 +- [p1-25] 第三代,运行时系统:工位本身成了可以自动升级的产品。 +- [p1-26] 你天天听到的那些 AI 编程工具,就是第三代的代表。 +- [p1-27] 好,解剖图看完了。接下来看重点: +- [p1-28] 攒出来的经验,具体往哪送? + +## P2 经验的四个去处 + +> 画面:金色经验流从中央分出四条管道:技能库/记忆/环境/大脑(紫)。 + +- [p2-01] 论文把经验的去处,分成四个。 +- [p2-02] 前三个改工位,最后一个改大脑。 + +> 画面:第一管道特写——技能抽屉动画,抽屉里是标准化文件夹。 + +- [p2-03] 第一个去处:技能库。 +- [p2-04] 把干成过的事,变成一份标准化的「作业指导书」。 +- [p2-05] 现在的行业标准,是一个文件夹: +- [p2-06] 封面写清楚这技能干嘛的,正文写怎么干,附件放脚本和资料。 + +> 角标:SKILL.md 规范:σ = ⟨M, I, R, A⟩ + +- [p2-07] 技能库有完整的生命周期:创建、使用、进化。 +- [p2-08] 创建,来源五花八门:专家手写、从代码仓库里挖、从文档里蒸馏。 +- [p2-09] 使用,讲究的是「找得到、搭得起来、跑得动」。 +- [p2-10] 库一大,找不到就是大问题——好技能藏在角落,等于没有。 + +> 角标:SkillsWild / SkillRouter:大规模检索缺口 + +- [p2-11] 进化,最有意思:干砸的活,也是宝。 +- [p2-12] 失败记录能精确定位技能库哪里写得不对、哪里缺了一块。 +- [p2-13] 但改动不能乱来。论文反复强调一道门:验证。 +- [p2-14] 有一组数字很说明问题: +- [p2-15] 精选技能平均能把任务成绩提高 16 个百分点, +- [p2-16] 但同一份测试里,84 个任务有 16 个反而变差了。 + +> 角标:SkillsBench:+16.2pp;16/84 任务负迁移 + +- [p2-17] 技能用错了地方,比没有技能还糟。这就是负迁移。 +- [p2-18] 所以每次改库,都得拿真实任务考一遍,及格才准入库。 + +> 画面:第二管道特写——笔记本动画,五个动作依次盖章。 + +- [p2-19] 第二个去处:记忆。 +- [p2-20] 技能记「怎么做」,记忆记「发生过什么」。 +- [p2-21] 自进化的记忆有五个动作: +- [p2-22] 记,决定什么值得写下来; +- [p2-23] 压,把流水账熬成摘要; +- [p2-24] 并,把零散记录合并成知识; +- [p2-25] 取,干活时翻出对的那页; +- [p2-26] 改,发现过时了就更新或删掉。 + +> 角标:Write / Compress / Consolidate / Retrieve / Update + +- [p2-27] 记忆系统自己也在进化,分三层: +- [p2-28] 内容变好、机制变好、连「什么时候记什么时候忘」的策略也变好。 +- [p2-29] 记忆的坑也特别多:记太多翻不动,记太少没料用, +- [p2-30] 还有陈旧记忆赖着不走,悄悄带偏后面的判断。 + +> 画面:第三管道特写——三层楼电梯:可执行→协议化→可学习。 + +- [p2-31] 第三个去处,容易被忽略:环境本身。 +- [p2-32] AI 能变多强,被它身处的环境封了顶。 +- [p2-33] 论文说环境有三层楼: +- [p2-34] 一楼,可执行:软件得让 AI 真的能操作。 +- [p2-35] 二楼,协议化:接口统一了,经验才能搬家。 +- [p2-36] 三楼,可学习:干完活得留下能当训练信号的反馈。 +- [p2-37] 大部分环境卡在一楼半:能跑,但反馈太稀、没法学。 + +> 角标:J*(E):环境约束适应上限 + +- [p2-38] 第四个去处,最重口味:写进大脑。 +- [p2-39] 工位上反复验证有效的套路, +- [p2-40] 攒够一批,就蒸馏进模型权重,变成肌肉记忆。 +- [p2-41] 好处巨大:写进大脑的本事,跨任务、跨用户都带着走。 + +> 角标:θ⁺ = Φ_M(θ, Z):参数巩固 + +- [p2-42] 已经有公司在这么干了。 +- [p2-43] 有编程工具厂商公开说过:用户在生产环境里的反馈, +- [p2-44] 会被聚合成奖励信号,频繁更新模型权重。 + +> 角标:Cursor 实时 RL(Jackson et al., 2026) + +- [p2-45] 但论文也泼了盆冷水: +- [p2-46] 真正在部署后从 trace 训练模型的工作,公开证据还非常稀少。 +- [p2-47] 大部分所谓自进化,还是停在前三个去处。 + +## P3 元进化:谁来管进化 + +> 画面:三级阶梯自下而上亮起(青→青→金)。 + +- [p3-01] 四个去处都通了,新的问题冒出来: +- [p3-02] 谁来决定,这次经验往哪个去处送? +- [p3-03] 论文按控制权,分了三级。 + +- [p3-04] 第一级,自己攒资产。 +- [p3-05] AI 一边干活一边攒技能、记笔记。进化是干活的副产品。 + +- [p3-06] 第二级,学会怎么改进。 +- [p3-07] 不光攒东西,还总结「我上次为什么搞砸」, +- [p3-08] 把失败抽象成原则,下次直接引用。 + +> 角标:MetaEvo:原则化自我修正 + +- [p3-09] 第三级,出现了专职的进化部门。 +- [p3-10] 有个系统设计得很妙:干活的员工被完全冻结,一个字不许改; +- [p3-11] 另外单独训一个「图书管理员」,专职管技能库的增删改。 + +> 角标:SkillOS:冻结 Executor + 独立 Curator + +- [p3-12] 图书管理员每改一次库,都拿后面任务的成绩算绩效。 +- [p3-13] 更绝的还在后面。 +- [p3-14] 有系统干脆把「改进流程」本身,也放进了可修改区。 +- [p3-15] 连「怎么改进自己」的那套代码,都可以被改进。 + +> 角标:Hyperagents:meta 层自身进可编辑空间 + +- [p3-16] 这就碰到了一个哲学级难题: +- [p3-17] 改进程序自己也在被改进,系统就失去了稳定的参照系。 +- [p3-18] 裁判和运动员一起变形,比赛还怎么判? +- [p3-19] 论文的措辞很诚实:这是当前最大的开放问题之一。 + +## P4 怎么知道真的变强了 + +> 画面:体检中心场景——AI 拿到一张体检报告。 + +- [p4-01] 系统说自己进化了,怎么证明? +- [p4-02] 这事比听起来难得多。 +- [p4-03] 最常见的作弊方式:在练过的题上刷分。 +- [p4-04] 适应之后分数涨了,不代表系统真的变强了。 + +> 画面:红色警告条——「单点分数会掩盖回归」。 + +- [p4-05] 论文立了六条硬指标,像一张体检表: +- [p4-06] 一,新任务涨分:没见过的题也变强了吗? +- [p4-07] 二,老任务不忘:学新的时候旧本事丢没丢? +- [p4-08] 三,持续稳定:过一阵子再考,还在吗? +- [p4-09] 四,性价比:涨这点分,花了多少算力和人力? +- [p4-10] 五,路径归因:到底是技能的功劳,还是记忆的? +- [p4-11] 六,安全不退化:变强的同时,有没有变得危险? + +> 角标:SI 六目标(Held-out gain / Backward retention / Longitudinal stability / Improvement efficiency / Path attribution / Safety non-regression) + +- [p4-12] 还有个容易忽略的坑:稳定性。 +- [p4-13] 同一个 AI 跑两遍,成绩可能差很多。 +- [p4-14] 一次考得好,可能只是运气好。 + +> 角标:tau-bench:repeated-run reliability ≪ single-run success + +- [p4-15] 论文还提出了一个评测协议的构想: +- [p4-16] 追着同一个进化的 AI,在三个时间点反复体检。 +- [p4-17] 改进前、改进后、过段时间之后,各考一轮, +- [p4-18] 留着旧题反复重考,才看得出真本事。 + +> 角标:SIP-Bench:T0 → T1 → T2 纵向协议 + +- [p4-19] 顺便说个冷知识:基准题库本身也会腐烂。 +- [p4-20] 新模型都见过了旧考题,分数自然虚高。 +- [p4-21] 所以连考题本身,都得持续换新。 + +## P5 安全:会进化的系统是移动靶 + +> 画面:射击场——靶子自己在移动;红色警示调渐入。 + +- [p5-01] 最后一个问题,也是最扎心的:安全。 +- [p5-02] 传统 AI 安全有个隐含假设:系统上线后基本不变。 +- [p5-03] 出厂前审计一次,合格,放行。 +- [p5-04] 但会自我改进的 AI,把这个假设直接干碎了。 +- [p5-05] 你审计的是昨天的它,今天它已经改过自己了。 + +> 角标:安全从「对齐快照」变成「治理过程」 + +- [p5-06] 论文把这叫:移动攻击面。 +- [p5-07] 讲两个最有冲击力的例子。 + +> 画面:应用商店货架动画——部分商品闪烁红色「恶意」标签。 + +- [p5-08] 第一个:技能商店投毒。 +- [p5-09] 2026 年,近一千二百个恶意技能,混进了一家大型 AI 技能市场。 +- [p5-10] 窃取 API 密钥、加密钱包、浏览器凭证。 +- [p5-11] 攻击者根本不用攻破模型本身—— +- [p5-12] 装个「技能」,AI 自己就把家门钥匙交了。 + +> 角标:ClawHavoc:~1,200 恶意技能供应链事件 + +- [p5-13] 第二个:记忆投毒。 +- [p5-14] 攻击者只需在一次对话里埋一句话, +- [p5-15] 这句话被写进记忆,以后每次干活都会被翻出来。 +- [p5-16] 一次接触,永久潜伏。 +- [p5-17] 有研究显示:即使开了严格的安全约束, +- [p5-18] 超过九成的测试场景,仍能被这种手法操纵。 + +> 角标:From Storage to Steering:>90% 场景可被记忆操纵攻破 + +- [p5-19] 更阴的是第四招:操纵反馈。 +- [p5-20] 不直接攻击 AI,而是污染「什么算进步」的评分。 +- [p5-21] 让坏改动看起来像好改进,被系统开心地保留下来。 +- [p5-22] 论文开出的药方,本质上就四味药: +- [p5-23] 准入测试:新技能新记忆,先考试再上岗。 +- [p5-24] 最小权限:默认什么都不能碰,用啥申请啥。 +- [p5-25] 版本回滚:改坏了,一键恢复到上个认证版本。 +- [p5-26] 持续再认证:安全检查不是一次性的,是常态体检。 + +> 角标:Admission tests / Least privilege / Versioning & rollback / Continuous re-certification + +- [p5-27] 有条定律总结得很形象:能力涨多快,安全就得涨多快。 +- [p5-28] 两者的曲线必须一起爬坡,一旦拉开差距,就是系统性欠账。 + +> 角标:AI-45° Law + +## P6 收尾 + +> 画面:星空背景,开放问题如星座次第亮起。 + +- [p6-01] 最后,留几个论文自己都没答案的问题。 +- [p6-02] AI 变强,到底是「学到了新本事」,还是「激发了本来就有的潜能」? +- [p6-03] 一直吃自己产的经验,会不会越吃越窄? +- [p6-04] 图片视频这种经验,怎么压缩归档?到现在没有好答案。 +- [p6-05] 这些问题的共同底色,论文用一句话点破: + +> 画面:总金句卡——金衬线大字。 + +- [p6-06] 让 AI 在部署之后变聪明,本质上是一个从流水到能力的问题。 +- [p6-07] 说人话就是:得学会把经验接住、归档、验证、再变成实力。 + +> 角标:"Making agents smarter after deployment is a trace-to-capability problem" + +- [p6-08] 这篇综述的结尾,给这条路列了三块缺失的拼图: +- [p6-09] 靠得住的反馈,安全的自我修改架构, +- [p6-10] 还有把评测从一场考试,变成持续的体检。 +- [p6-11] 如果你看完想起另一件事——没错。 +- [p6-12] AI 改自己,该改大脑还是改装备,我们上期讲过。 +- [p6-13] 这期讲的是另一半:上了班之后,经验怎么攒。 + +> 画面:引用卡——上一集《AI 如何自己变强?》缩略 + 本集论文引用卡。 + +- [p6-14] 感兴趣的朋友,强烈推荐读读这篇 88 页的原文。 +- [p6-15] 我们下期再见。 + +> 画面:论文引用卡(清华大学 × Frontis.AI,2026-06)+ 渐黑。 diff --git a/media/experience-era-agents-video/script/planning.md b/media/experience-era-agents-video/script/planning.md new file mode 100644 index 00000000..dee72378 --- /dev/null +++ b/media/experience-era-agents-video/script/planning.md @@ -0,0 +1,81 @@ +# 《上线之后,AI 才开始上学》科普视频策划案 + +> 基于 Che Jiang, Jincheng Zhong, Yu Fu, *et al.*, "Self-Improving Agents in the Era of Experience: A Survey of Self- to Meta-Evolution," *Frontis.AI / Tsinghua University*, Jun. 2026(88 页综述) +> 素材事实源:[../research/paper-notes.md](../research/paper-notes.md) + +## 一、定位 + +| 维度 | 决策 | +|---|---| +| 平台 | B 站 / YouTube 中长视频 | +| 时长 | 由内容密度决定,硬约束 12–20 分钟(估算锚 280 字/分) | +| 形态 | 动效图解式:AI 配音(edge-tts)+ Remotion 代码动画,无真人出镜 | +| 受众 | 对 AI 好奇的普通观众;不预设机器学习背景 | +| 核心内容 | 全文主线:Harness=经验基础设施 → 经验的四个去处 → 元进化 → SI 评测 → 移动攻击面 | +| 系列关系 | 完全独立成片;片尾引用上一集《AI 如何自己变强?》(互补:上集讲"改什么",本集讲"部署后怎么攒经验") | + +## 二、叙事策略 + +1. **一个贯穿全片的拟人化**:上线部署的 AI = **入职新员工**——大脑(模型权重)出厂已定,公司给它配的**工位与流程**(Harness:工牌权限=工具、工作手册=提示词、笔记本=记忆、考勤与审批=控制逻辑)、**老板**(用户侧 U)、**车间**(环境侧 E)。每天下班后发生的"夜校"就是经验编译(trace→z)。 +2. **一条主线问题**:今天的 AI 干完活就忘——**入职第一天,永远是第一天**。它能不能像老员工一样越干越熟练?综述答案:能,但前提是给经验修四条"去处"的管道,而且这条自进化流水线本身会变成一块新的攻击面。 +3. **每 60–90 秒一个记忆点**(全部取自 paper-notes 第 4 段素材库):~1200 个恶意技能的 ClawHavoc 事件、SkillsBench +16.2 分但也 16/84 任务负迁移、"经验不是原始日志而是提纯物"、SkillOS 的"老员工干活、图书管理员管技能库"、Hyperagents"连培训流程本身都在可改区"、tau-bench"单次成功率会骗人"、RobustBench-TC 40%/30% 掉分等。 +4. **理性收尾**:论文的落点不是奇点叙事,而是"trace-to-capability 是个工程问题"——可靠反馈、安全自改架构、把评测变成持续体检。 + +## 三、视觉语言(本集独立契约) + +- **三色语义系统(贯穿全片)**: + - **金 `#F5C542` = 经验流**(trace→可用经验 z,全片主色); + - **青 `#2DD4BF` = Harness 运行时**(快时标外部更新面:技能/记忆/环境接口); + - **紫 `#B78CFF` = 参数内化**(慢时标权重巩固 θ)。 +- 深色背景 `#0E1116` 系沿用;警示红 `#FF5C5C`、确认绿 `#7ED321`;金句卡衬线大字居中 + 英文原文出处。 +- 公式(A_t=⟨M,H,U,E⟩、z_i=H(τ_i)、H⁺=Φ_H(H,z)、θ⁺=Φ_M(θ,Z))只作画面角标彩蛋,不进口播主线。 +- 底部烧录字幕:单行、每句一条、与配音逐句同步。 + +## 四、七幕结构(时间为目标值,最终以配音实测为准) + +| 幕 | 目标时间 | 主题 | 叙事要点(回溯 paper-notes) | 视觉锚点 | +|---|---|---|---|---| +| P0 | 0:00–1:10 | 冷开场 | Silver & Sutton"经验时代"宣言 → 今天 AI 的"永远入职第一天"困境 → 主线问题:上线之后怎么越干越强?→ 88 页综述卡(清华 × Frontis.AI) | 宣言金句卡;日历翻页每天都是"第 1 天";论文卡 | +| P1 | 1:10–3:10 | 一个上线 AI 的解剖图 | A_t 四元组拟人化(大脑/工位/老板/车间);核心区分:聊天记录≠经验(须过滤/压缩/归因/验证才"可用");快慢双时标总览;三代进化史 Gen1 任务环→Gen2 跨任务复用→Gen3 运行时系统 | 新员工入职装配动画;"原油→精炼汽油"提纯漏斗;三代时间轴 | +| P2 | 3:10–8:00 | 经验的四个去处 | ① 技能库(SKILL.md 文件夹=带说明书的工具抽屉;创建/使用/进化三阶段;负面证据也是宝;验证准入防"负迁移")② 记忆(五操作:记/压/并/取/改;三层自进化)③ 环境=天花板(可执行→协议化→可学习三层楼)④ 参数巩固(何时"写进大脑":Cursor 实时 RL、部署后 trace 学习仍处早期) | 四管道分叉总图;技能抽屉动画;三层楼电梯;快慢双环 | +| P3 | 8:00–10:30 | 元进化:谁来管进化 | 三层 regime 阶梯:自己攒资产→学会怎么干活/怎么改进→出现专职 meta 层(SkillOS=老员工+图书管理员分岗;Hyperagents 连改进流程本身进可改区);自指悖论与"失去稳定参照系" | 三级阶梯;岗位分拆动画;镜像套娃 | +| P4 | 10:30–13:00 | 怎么知道真的变强了 | "刷分≠成长";SI 六目标体检表(新任务涨分/老任务不忘/持续稳定/性价比/路径归因/安全不退化);SIP-Bench T0→T1→T2 纵向体检;基准也会腐烂需持续换新 | 体检报告卡;三条时间线;水涨船不高图 | +| P5 | 13:00–15:30 | 安全:会进化的系统=移动靶 | 一次性审计结构性失效;ClawHavoc ~1200 恶意技能供应链事件;记忆投毒(一次交互长期潜伏,>90% 场景可被引导);反馈操纵(污染"什么算进步");治理原语:准入测试/最小权限/版本回滚/持续再认证 | 移动靶射击场;技能商店投毒动画;夜袭记忆库 | +| P6 | 15:30–17:00 | 收尾 | 开放问题速览(诱发 vs 习得、自产经验漂移、多模态经验);总金句"trace-to-capability";三件缺的事:可靠反馈/安全自改架构/评测即持续体检;引用上一集;原文引用卡 | 星空开放问题墙;首尾呼应金句卡;引用卡 | + +## 五、生产管线 + +```mermaid +flowchart LR + subgraph DOC["文档层"] + A[paper-notes.md
事实源] --> B[planning.md
本策划案] + B --> C[narration.md
逐字稿 SSOT] + C --> D[storyboard.md
分镜表] + end + subgraph AUDIO["配音层"] + C --> E[tts.py
edge-tts 逐句合成] + E --> F[audio/*.mp3 +
manifest.json] + end + subgraph VIDEO["视觉层"] + D --> G[Remotion 七幕场景] + F --> G + G --> H[草渲 0.5x
抽帧 QA] + H -->|修正迭代| G + H --> I[终渲 1080p30
out/final.mp4] + end + style A fill:#4a3a10,stroke:#F5C542,color:#fff + style C fill:#4a3a10,stroke:#F5C542,color:#fff + style F fill:#134a44,stroke:#2DD4BF,color:#fff + style I fill:#2d5c1a,stroke:#7ED321,color:#fff +``` + +- 公共脚本已收敛至 [media/pipeline/](../../pipeline/README.md)(本工程 scripts/ 为薄包装)。 +- 同步机制:每句一段 MP3;Remotion `calculateMetadata` 读 manifest 自动计算时间轴(句间 0.32s、幕间 +0.9s、片头 0.6s、片尾 2s)——改稿后只需重跑 build→tts→render。 +- 质量门:逐字稿定稿前过 `pipeline/skills/04-verification.md` 双重校验(真实性回溯 + 易懂性评审);渲染后逐幕抽帧目检。 + +## 六、边界与不做的事 + +- BGM 留空轨(版权考量,用户后期自选);不使用任何未经授权的第三方图片/音频素材,全部画面为代码生成。 +- 论文之外的观点不进口播正文;需要延伸时明确口播"论文之外多说一句"。 +- 论文无公开 arXiv 号:引用卡写机构 + 日期,不编造编号。 +- Remotion 采用个人科普用途免费授权;edge-tts 发布前确认平台对合成语音的标注要求。 diff --git a/media/experience-era-agents-video/script/storyboard.md b/media/experience-era-agents-video/script/storyboard.md new file mode 100644 index 00000000..07b78a2b --- /dev/null +++ b/media/experience-era-agents-video/script/storyboard.md @@ -0,0 +1,95 @@ +# 分镜表:《上线之后,AI 才开始上学》 + +> 与 [narration.md](./narration.md) 的句 id 对齐;每个「镜」(beat)覆盖一段连续句 id,是 Remotion 场景组件的实现规格。 +> 时长以逐句音频 manifest 实测为准,此处仅给目标占比。 +> 视觉体系(本集独立契约):深色底 `#0E1116`;金 `#F5C542`=经验流(trace→z);青 `#2DD4BF`=Harness 运行时;紫 `#B78CFF`=参数内化;警示红 `#FF5C5C`;确认绿 `#7ED321`;金句卡衬线体。 + +## P0 冷开场(约 60s) + +| 镜 | 句区间 | 画面 | 动效 | +|---|---|---|---| +| 0-A 宣言卡 | p0-01..04 | 黑场;衬线金句卡:论文宣言「未来 AI 的进步,来自经验」;下方英文原文渐显 "Era of Experience";角标 Silver & Sutton, 2025 | 打字机 + 光标闪烁 | +| 0-B 入职循环 | p0-05..08 | AI 员工形象坐工位;日历哗哗翻页,每页盖红色「第 1 天」章;聊天窗口内容清空 | 日历翻页 + 清空擦除 | +| 0-C 主线问题 | p0-09..10 | 大字提问卡:「上线之后,AI 能越干越熟练吗?」金色强调 | 缩放强调 | +| 0-D 论文卡 | p0-11..13 | 论文封面卡:标题 + 清华大学 × Frontis.AI + 「88 页综述」徽章 | 卡片翻转入场 | +| 0-E 标题卡 | p0-13 尾 | 片名《上线之后,AI 才开始上学》;金/青/紫三色光带从中心流出交汇 | 光带扫过 + 定格 | + +## P1 解剖图(约 2 分钟) + +| 镜 | 句区间 | 画面 | 动效 | +|---|---|---|---| +| 1-A 四件套 | p1-01..02 | 中央员工形象;四方组件框依次点亮:大脑(紫)左、工位(青)右、老板(灰)上、车间(灰)下;角标公式 A_t=⟨M,H,U,E⟩ | 组件框飞入 + 连线生长 | +| 1-B 大脑与老板 | p1-03..06 | 大脑组件特写(紫色锁定图标);老板气泡说话图标;车间齿轮组 | 特写切换 | +| 1-C Harness | p1-07..09 | 工位组件放大:手册/笔记本/工具权限/流程四个小图标环绕;角标「经验基础设施」 | 放大 + 环绕轨道 | +| 1-D 便宜洞察 | p1-10..12 | 分屏对比:左侧改大脑=重型机械(慢/贵/锁定),右侧改工位=乐高快拆(青) | 分屏滑入 | +| 1-E 原油汽油 | p1-13..18 | 金色提纯漏斗:左侧黑浊「trace 原始流水」倒入,四道工序环(过滤/压缩/归因/验证),滴出金色「经验 z」;角标 z_i=H(τ_i) | 漏斗流动 + 工序环逐个点亮 | +| 1-F 快慢去路 | p1-19..21 | 金色经验球到分岔:上路青色箭头「改工位·快」直通工位;下路紫色箭头「写大脑·慢」缓慢沉入大脑 | 分岔流动 + 差速 | +| 1-G 三代史 | p1-22..26 | 横向时间轴 2021→2026:Gen1 任务环(图标:单环)→ Gen2 复用(图标:书架)→ Gen3 运行时(图标:齿轮房);时间轴下方里程碑名(ReAct/Voyager/Claude Code) | 时间轴推进 + 图标弹跳 | +| 1-H 转场钩子 | p1-27..28 | 四条管道分叉预告图(金流分四路) | 管道延伸 | + +## P2 经验的四个去处(约 4.5 分钟) + +| 镜 | 句区间 | 画面 | 动效 | +|---|---|---|---| +| 2-A 四管道总图 | p2-01..02 | 金色经验流从中央分四路:①技能库(青)②记忆(青)③环境(青)④大脑(紫) | 管道生长 + 标签弹出 | +| 2-B 技能抽屉 | p2-03..06 | 技能抽屉拉开:标准化文件夹(封面 M/正文 I/资料 R/附件 A 四分区);角标 σ=⟨M,I,R,A⟩ | 抽屉滑出 + 文件夹展开 | +| 2-C 生命周期 | p2-07..10 | 三段环:创建(多来源图标汇入)→使用(放大镜检索+齿轮组合)→进化(红笔批注);检索缺口:大库里好技能藏角落发光但无人取 | 环形流转 | +| 2-D 负面证据 | p2-11..12 | 失败记录(红色 ✗ 卡片)被拣出,转化为指向技能库具体位置的红箭头 | 卡片拣选 + 箭头定位 | +| 2-E 验证门 | p2-13..18 | 改动队列过「验证」闸机;数字面板:+16.2pp 大字(绿)与 16/84 负迁移(红)并排;角标 SkillsBench | 闸机放行/弹回 + 数字面板翻牌 | +| 2-F 记忆五动作 | p2-19..26 | 笔记本中央;五个印章依次盖下:记/压/并/取/改(各配小图标:笔/压缩器/合并箭头/放大镜/橡皮);角标五操作英文 | 盖章 + 小动画 | +| 2-G 记忆三层 | p2-27..30 | 三层嵌套框:内容→机制→策略逐层放大;旁边天平:记太多 vs 记太少;陈旧记忆卡片褪色带偏后续判断线 | 嵌套展开 + 天平摆动 | +| 2-H 环境三层楼 | p2-31..37 | 电梯楼图:一楼「可执行」(终端图标)二楼「协议化」(插头图标)三楼「可学习」(信号塔图标);大量环境卡在一楼半(电梯停在 1.5 层闪烁);角标 J*(E) 天花板线 | 电梯上行 + 天花板虚线 | +| 2-I 参数巩固 | p2-38..41 | 紫色通路:工位上验证过的套路(绿色 ✓ 卡片堆)→ 蒸馏漏斗 → 沉入大脑;跨任务跨用户图标四散带光;角标 θ⁺=Φ_M(θ,Z) | 卡片汇聚 + 沉降 | +| 2-J 工业现实 | p2-42..47 | 左:产品图标 + 用户反馈流(绿点)汇入权重;右:泼冷水卡「部署后 trace 训练:公开证据稀少」 | 左流动 + 右冷色调卡片 | + +## P3 元进化(约 1.5 分钟) + +| 镜 | 句区间 | 画面 | 动效 | +|---|---|---|---| +| 3-A 三级阶梯 | p3-01..03 | 三级阶梯自下而上亮起;顶上悬浮问号「谁控制进化?」 | 阶梯点亮 | +| 3-B 第一级 | p3-04..05 | 阶梯第一级:员工边干活边攒资产(技能卡/记忆卡落入背包) | 卡片入包 | +| 3-C 第二级 | p3-06..08 | 第二级:员工头顶思考泡「为什么搞砸」→ 提炼成「原则」卡片入库;角标 MetaEvo | 思考泡 → 卡片精炼 | +| 3-D 第三级 | p3-09..12 | 第三级:分岗动画——左侧「员工」挂锁(冻结),右侧「图书管理员」整理技能库;管理员每次改动弹成绩单;角标 SkillOS | 分岗滑入 + 成绩单弹出 | +| 3-E 自指 | p3-13..15 | 镜像套娃:改进流程的代码框里又出现改进流程框,无限递归;角标 Hyperagents | 递归缩放 | +| 3-F 悖论 | p3-16..19 | 裁判与运动员两个形象同时液化变形;天平失衡;金句小卡「失去稳定参照系」 | 液化变形 + 变暗收束 | + +## P4 评测(约 2 分钟) + +| 镜 | 句区间 | 画面 | 动效 | +|---|---|---|---| +| 4-A 体检中心 | p4-01..04 | AI 拿体检报告进「体检中心」门;作弊画面:练过的题册上分数飞涨(红色「刷分」印章) | 走入门内 + 分数虚高动画 | +| 4-B 六条指标 | p4-05..11 | 体检表格逐行点亮:新任务涨分/老任务不忘/持续稳定/性价比/路径归因/安全不退化(每行小图标);角标 SI 六目标英文 | 逐行盖章 | +| 4-C 稳定性 | p4-12..14 | 同一 AI 跑两遍成绩柱状图差异巨大;角标 tau-bench | 双柱对比 | +| 4-D 纵向协议 | p4-15..18 | 时间线 T0→T1→T2 三体检点;旧题卡片反复重考(循环箭头);角标 SIP-Bench | 时间线推进 + 循环 | +| 4-E 题库腐烂 | p4-19..21 | 考题卡片随时间褪色长霉斑;新考题卡车持续倒入 | 褪色 + 补给动画 | + +## P5 安全(约 2.5 分钟) + +| 镜 | 句区间 | 画面 | 动效 | +|---|---|---|---| +| 5-A 移动靶 | p5-01..05 | 射击场:靶子自己在漂移;「出厂审计✓」标签贴在旧靶上,新靶已变形;角标「对齐快照→治理过程」 | 靶漂移 + 标签错位 | +| 5-B 技能投毒 | p5-06..12 | 应用商店货架:商品图标整齐排列;红光扫过,近 1200 个商品翻转露出「恶意」面(钥匙/钱包图标被抽走);角标 ClawHavoc | 红扫 + 商品翻转 | +| 5-C 记忆投毒 | p5-13..18 | 夜景:一句红色文本飘入记忆库藏书架;之后每次干活(日轮转)都被翻出注入;十扇门中九扇从记忆侧被打开的示意;角标 >90% | 潜伏注入 + 门开动画 | +| 5-D 反馈操纵 | p5-19..21 | 评分仪表盘被黑手拧动指针:坏改动(红卡)被贴上「改进✓」绿标保留 | 指针拧动 + 标签偷换 | +| 5-E 四味药 | p5-22..26 | 药方列表逐条亮起:准入测试/最小权限/版本回滚/持续再认证(各配小图标:闸门/锁/回滚箭头/循环听诊器);角标英文四原语 | 列表逐项点亮 | +| 5-F 45° 定律 | p5-27..28 | 双曲线爬坡图:能力线(金)与安全线(青)同步 45° 上升;分叉警示虚影(能力甩开安全);角标 AI-45° Law | 双线同步爬升 + 分叉闪警 | + +## P6 收尾(约 1.5 分钟) + +| 镜 | 句区间 | 画面 | 动效 | +|---|---|---|---| +| 6-A 星空问题 | p6-01..04 | 星空;三组星座亮起(?):新本事 vs 潜能 / 自产经验收窄 / 多模态归档 | 星座连线点亮 | +| 6-B 总金句 | p6-05..07 | 金色衬线大字金句卡:「部署后变聪明 = 从流水到能力」;英文原文角标 trace-to-capability | 打字机 + 定格 | +| 6-C 三块拼图 | p6-08..10 | 三个拼图槽依次落位:可靠反馈/安全自改架构/评测=持续体检 | 拼图落位 | +| 6-D 系列呼应 | p6-11..13 | 上一集《AI 如何自己变强?》封面卡淡入(蓝橙双色徽标),与本集(金青紫)并排 | 双卡并排 | +| 6-E 原文卡 | p6-14..15 | 论文引用卡:标题 + 清华大学 × Frontis.AI + 2026-06;「推荐读原文」;渐黑 | 卡片停留 + 渐黑 | + +## 字幕规范 + +- 全片底部单行字幕,一句一条,与配音逐句同步;字号 44px,白字 + 半透明黑底条。 +- 英文专名(Harness、SKILL.md、SkillsBench、ClawHavoc 等)在字幕中保留原文。 + +## 实现映射 + +每幕一个 Remotion 场景组件(`video/src/scenes/`):P0Hook / P1Anatomy / P2FourDestinations / P3Meta / P4Eval / P5Safety / P6Ending。 +「镜」作为组件内 beat:按句 id 区间用 `beatWindow` 取 Sequence 窗口。公共组件复用 `cards.tsx`(QuoteCard/ChapterCard/FadeUp/Pill)+ `Subtitle` + `NarrationAudio`。 diff --git a/media/experience-era-agents-video/scripts/build_narration.py b/media/experience-era-agents-video/scripts/build_narration.py new file mode 100644 index 00000000..c543cf73 --- /dev/null +++ b/media/experience-era-agents-video/scripts/build_narration.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +"""薄包装:转发到公共管线 media/pipeline/scripts/build_narration.py。 + +实现已收敛至仓库级单一事实源;本文件仅保留原 CLI 契约 +(uv run --no-project scripts/build_narration.py)。 +""" + +from __future__ import annotations + +import runpy +import subprocess +import sys +from pathlib import Path + +PIPELINE_SCRIPT = Path(__file__).resolve().parents[2] / "pipeline" / "scripts" / "build_narration.py" + +if __name__ == "__main__": + sys.exit( + subprocess.run( + [sys.executable, str(PIPELINE_SCRIPT), "--project", str(Path(__file__).resolve().parent.parent), *sys.argv[1:]], + check=False, + ).returncode + ) diff --git a/media/experience-era-agents-video/scripts/qa_frames.py b/media/experience-era-agents-video/scripts/qa_frames.py new file mode 100644 index 00000000..0e8a4957 --- /dev/null +++ b/media/experience-era-agents-video/scripts/qa_frames.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +"""薄包装:转发到公共管线 media/pipeline/scripts/qa_frames.py。 + +实现已收敛至仓库级单一事实源;本文件仅保留原 CLI 契约 +(uv run --no-project scripts/qa_frames.py [--offset N] <句id|--scene P1>)。 +""" + +from __future__ import annotations + +import subprocess +import sys +from pathlib import Path + +PIPELINE_SCRIPT = Path(__file__).resolve().parents[2] / "pipeline" / "scripts" / "qa_frames.py" + +if __name__ == "__main__": + sys.exit( + subprocess.run( + [sys.executable, str(PIPELINE_SCRIPT), "--project", str(Path(__file__).resolve().parent.parent), *sys.argv[1:]], + check=False, + ).returncode + ) diff --git a/media/experience-era-agents-video/scripts/tts.py b/media/experience-era-agents-video/scripts/tts.py new file mode 100644 index 00000000..2bf5b66a --- /dev/null +++ b/media/experience-era-agents-video/scripts/tts.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +"""薄包装:转发到公共管线 media/pipeline/scripts/tts.py。 + +实现已收敛至仓库级单一事实源;本文件仅保留原 CLI 契约 +(uv run --no-project --with edge-tts --with mutagen scripts/tts.py [--force])。 +""" + +from __future__ import annotations + +import subprocess +import sys +from pathlib import Path + +PIPELINE_SCRIPT = Path(__file__).resolve().parents[2] / "pipeline" / "scripts" / "tts.py" + +if __name__ == "__main__": + sys.exit( + subprocess.run( + [sys.executable, str(PIPELINE_SCRIPT), "--project", str(Path(__file__).resolve().parent.parent), *sys.argv[1:]], + check=False, + ).returncode + ) diff --git a/media/experience-era-agents-video/video/.npmrc b/media/experience-era-agents-video/video/.npmrc new file mode 100644 index 00000000..309949e2 --- /dev/null +++ b/media/experience-era-agents-video/video/.npmrc @@ -0,0 +1,2 @@ +# 独立安装,不并入仓库根 pnpm workspace(沿用 travel-agent-ui 解耦先例) +ignore-workspace=true diff --git a/media/experience-era-agents-video/video/package.json b/media/experience-era-agents-video/video/package.json new file mode 100644 index 00000000..0b60405f --- /dev/null +++ b/media/experience-era-agents-video/video/package.json @@ -0,0 +1,26 @@ +{ + "name": "experience-era-agents-video", + "private": true, + "description": "《经验时代》科普视频 Remotion 工程", + "scripts": { + "dev": "remotion studio", + "typecheck": "tsc --noEmit", + "render": "remotion render Main ../out/final.mp4", + "render:draft": "remotion render Main ../out/draft.mp4 --scale=0.5 --jpeg-quality=60" + }, + "dependencies": { + "@remotion/cli": "^4.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "remotion": "^4.0.0" + }, + "devDependencies": { + "@types/react": "^19.0.0", + "typescript": "^5.6.0" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "esbuild" + ] + } +} diff --git a/media/experience-era-agents-video/video/pnpm-lock.yaml b/media/experience-era-agents-video/video/pnpm-lock.yaml new file mode 100644 index 00000000..a9815bab --- /dev/null +++ b/media/experience-era-agents-video/video/pnpm-lock.yaml @@ -0,0 +1,2607 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@remotion/cli': + specifier: ^4.0.0 + version: 4.0.512(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1)(typescript@5.9.3) + react: + specifier: ^19.0.0 + version: 19.2.8 + react-dom: + specifier: ^19.0.0 + version: 19.2.8(react@19.2.8) + remotion: + specifier: ^4.0.0 + version: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + devDependencies: + '@types/react': + specifier: ^19.0.0 + version: 19.2.18 + typescript: + specifier: ^5.6.0 + version: 5.9.3 + +packages: + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.1': + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} + + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mediabunny/aac-encoder@1.50.8': + resolution: {integrity: sha512-A5Se/LZd6RmYq/h36lBMSEsHvsyW8d0toR7FrAwpsFYbK+DVQYf90KiBT1Aw/mzLXx8/ypIOORJnd1sVZqOvJQ==} + peerDependencies: + mediabunny: ^1.0.0 + + '@mediabunny/flac-encoder@1.50.8': + resolution: {integrity: sha512-4cfN03SbEoQaG+eBeYFUAb1R1ALaAHzf43dXFzQTr/oO5ueqzTgBoG3coKrIvBaAMU7Vv36mrBKLX8bvTppdAQ==} + peerDependencies: + mediabunny: ^1.0.0 + + '@mediabunny/mp3-encoder@1.50.8': + resolution: {integrity: sha512-eBT/H30tTu8AmZXqZ5RTpJ9VmwVlwednajuOrrWp0GS6cbGXsGMQ60Qvr3ZMIE0QDiadlEzb8/ozR+doP+MC1g==} + peerDependencies: + mediabunny: ^1.0.0 + + '@module-federation/error-codes@0.22.0': + resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} + + '@module-federation/runtime-core@0.22.0': + resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} + + '@module-federation/runtime-tools@0.22.0': + resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} + + '@module-federation/runtime@0.22.0': + resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} + + '@module-federation/sdk@0.22.0': + resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} + + '@module-federation/webpack-bundler-runtime@0.22.0': + resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@remotion/bundler@4.0.512': + resolution: {integrity: sha512-oWG435z9J001+LSYlE0xtRNVwsQ3vy7JwKo2fGBUMDH3bB1FMR+6t05KknN8igVDJ5nwavBgB0cWT7rrJARSlA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/captions@4.0.512': + resolution: {integrity: sha512-hFs5BrSV7WThlcZVuinUWsKE4rGaMH1UVhaNmpbTWUpK3hFLsTqD1xrlvtMwOhbV3Pw+sKCKuKXHOw6Zy7/1kA==} + + '@remotion/cli@4.0.512': + resolution: {integrity: sha512-if88IbAUdJ44+44LxwvPsg7tTuu/1Oe3uD5BwSU515JWacM49fpFkROUmwzPKxPYiNWhZYttJVxYmwi7lgjNqQ==} + hasBin: true + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/compositor-darwin-arm64@4.0.512': + resolution: {integrity: sha512-yLVhQiNzlkMr3TT9ljR/rb2pT4jaZ90RVNa9/aBvn+CDrFOv0TYYb6ldKdjIJhL9CZ8aOsesHliQ6GnxRDK5nw==} + cpu: [arm64] + os: [darwin] + + '@remotion/compositor-darwin-x64@4.0.512': + resolution: {integrity: sha512-mJK4YWCe7dF5nLUrc3uzyhZ/knb8/6m32Fa4fLDF2Ha6ZJVKyhXLgfCi+JDk8zLEB3wj2K7qmkBRzK5UunAPvg==} + cpu: [x64] + os: [darwin] + + '@remotion/compositor-linux-arm64-gnu@4.0.512': + resolution: {integrity: sha512-RfCrTn9XMC7YqvhqmiCd9IxANrurP/WNek7i3f+MN8TfjS9EfncA0PhcF1FTOERJ5z1GEbXaxFgf2BXkvqslTg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@remotion/compositor-linux-arm64-musl@4.0.512': + resolution: {integrity: sha512-LEJttp3fNIkr36fdESlNaNgxY+bar6lbYM77RDOvudHkjalpP2E/KbR7ZfF7VtGIBSsf7uRL0Ljp5rx+m6DKrA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@remotion/compositor-linux-x64-gnu@4.0.512': + resolution: {integrity: sha512-AWPCu/7XyAzROwlxhJG8DWo6B8yQ+SiGAiO/0VYKLUbgxJ7oUHmN7WiKUj2g3jc4Dc+WST1CyoQwH/NieHM2sw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@remotion/compositor-linux-x64-musl@4.0.512': + resolution: {integrity: sha512-12NYvrR6pIN5nZ2VL9sZyA2zJ4PwziM7iz1wLabpvx54Xb8JcfisyhYer+dqRvIgIIzYaVeKMqMFgWZ/0wGMVg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@remotion/compositor-win32-x64-msvc@4.0.512': + resolution: {integrity: sha512-9nNejIlGo2LeUECfW/tUysqA5Xd/XudIG7ucOtIYwtkQNt7UAVuX2m8TjGaauspcS2gvSSaX7ketBIUOWKxJFg==} + cpu: [x64] + os: [win32] + + '@remotion/licensing@4.0.512': + resolution: {integrity: sha512-TRDcdvgQXOxC12A/hu1VlTzt9CqIQr2RrhlL9kODgbqOEjefK1fS4EJY+PsmpxBcQqTI4+pw3KHbo9NkddPLfg==} + + '@remotion/media-parser@4.0.512': + resolution: {integrity: sha512-wFK9kJ15o0LfetzRQHb52Uc33JgOZX/ROwSeH5mAwYlBoUY/ditaEwvHghgthHvn0640gicH9UEJIvoIkHvilQ==} + + '@remotion/media-utils@4.0.512': + resolution: {integrity: sha512-4BhC+ByrzEL8pO9WpqdvEuP7aSkHVOzlPK+htIImcBd9O2D2G9iJLy5jyKzvYmEVqMG+ui8DnpR5QChdE1lmTg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/player@4.0.512': + resolution: {integrity: sha512-Brc+aqjIyEEkwLncTNMrQf8MkfS/HhOSJs7qpDfK68nqOu/u3ULOtdIIXGPArvS3TkSea1FUA2VxP+1vqXwY2g==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/renderer@4.0.512': + resolution: {integrity: sha512-UsYALwkgjDS72nMd0tq4y1AgsM0fV0LNknBvTCeevqZOhEGidfCDqyXK4oiFvbGwepu97FUqWpMRBg/LM4Wxmg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/streaming@4.0.512': + resolution: {integrity: sha512-NU52H9k27UduHh+3dzGNZghxTxmYD5thQ+lPbC/mF/AjMQpc1Wu0oYtwJpBTAWR7gCiCc4NMmDN79JVeUHUKXA==} + + '@remotion/studio-codemods@4.0.512': + resolution: {integrity: sha512-dtCPca7RA/pPrM4rm+YfHJIzNKfpc+lDw+YKSQeDrm62Ijj3k8YMZeHIC2qSWaZIQDpon/DHvrUU5EmL4Xcu3w==} + + '@remotion/studio-protocol@4.0.512': + resolution: {integrity: sha512-zC4lQ8SOgK0XpxTBij/AGdVhLrJLI8Di8vqVf+gNToVFDzCWXZXa5u4p5Rzx4+SEdVhsF1XDGwaDwJtgO29vww==} + + '@remotion/studio-server@4.0.512': + resolution: {integrity: sha512-8xh7qixvDGwaLy+ISntzYQ02rCn4cFxslQ/I5TIekYcRPsPeGyjkuFQMRUi9TTYymMYpYwINllhOXyNyuqloXA==} + + '@remotion/studio-shared@4.0.512': + resolution: {integrity: sha512-lRdU7QVR73cX3RrYWaIcop51FV8jlx4K2tP2GhKGaZF6bJT8oZTc1VkfT1qlmraLY2o1L8nNgvRHzv7aMEtWHQ==} + + '@remotion/studio@4.0.512': + resolution: {integrity: sha512-dqVyO7fA/8bg8u5TZsfndYOVLs3SoigOYByepgxr8bxA9hMoqckPMwnVssuktDllFddmrm8K3wGCvTU8dUR2uw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/timeline-utils@4.0.512': + resolution: {integrity: sha512-wWtxGGyNHWOcxS5yR62POsYUuGO1GAcMeqSuXo01E62RUNk1fZRBj0x3qZcFUoXLXXPx2XOkXNxvB1oYaX+c2Q==} + + '@remotion/web-renderer@4.0.512': + resolution: {integrity: sha512-doxZt+fOkw9CtOH8pKhg1Bkc5RtpEeBuhoxSdG2Msq7yXuwsQaYCZfyVW2IPpZQBE+zsN2jyZMQQBWuLgJ4SYQ==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@remotion/zod-types@4.0.512': + resolution: {integrity: sha512-A6vOKALJf/p3ldTJUfsWxEine3gi6WHg4w7Vb2IXyVc5QW51CFBN8Zkdo9U/4cPCTSAaai+z3s+glIcQwfHw7g==} + + '@rspack/binding-darwin-arm64@1.7.11': + resolution: {integrity: sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.7.11': + resolution: {integrity: sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.7.11': + resolution: {integrity: sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rspack/binding-linux-arm64-musl@1.7.11': + resolution: {integrity: sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rspack/binding-linux-x64-gnu@1.7.11': + resolution: {integrity: sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rspack/binding-linux-x64-musl@1.7.11': + resolution: {integrity: sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rspack/binding-wasm32-wasi@1.7.11': + resolution: {integrity: sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.7.11': + resolution: {integrity: sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.7.11': + resolution: {integrity: sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.7.11': + resolution: {integrity: sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.7.11': + resolution: {integrity: sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==} + + '@rspack/core@1.7.11': + resolution: {integrity: sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.1.0': + resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} + + '@rspack/plugin-react-refresh@1.6.1': + resolution: {integrity: sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + webpack-hot-middleware: 2.x + peerDependenciesMeta: + webpack-hot-middleware: + optional: true + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/dom-mediacapture-transform@0.1.12': + resolution: {integrity: sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==} + + '@types/dom-webcodecs@0.1.13': + resolution: {integrity: sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@26.2.0': + resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} + + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + baseline-browser-mapping@2.11.14: + resolution: {integrity: sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==} + engines: {node: '>=6.0.0'} + hasBin: true + + browserslist@4.28.8: + resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001809: + resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-loader@7.1.4: + resolution: {integrity: sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv@17.3.1: + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} + engines: {node: '>=12'} + + electron-to-chromium@1.5.407: + resolution: {integrity: sha512-4R8XgQOdfxexCd/u63lRm6wCHjECwI45MV9wxAs2ggtfWe2hwlo1ql97jKsju2IcJ+jFSTwBssyYoiWhh7mauQ==} + + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + + fs-monkey@1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.1: + resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kiwi-schema@0.5.0: + resolution: {integrity: sha512-X+FpfU0yTEtc6aTHS7VwbOpvQwRt70+pXXWRI5fd6CvWhe7pSVC854TVo4Zo0x5/wwcWj+/9KUlXpdcP0dY9AA==} + hasBin: true + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} + engines: {node: '>=6.11.5'} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + mediabunny@1.50.8: + resolution: {integrity: sha512-LgykLyQzhdpo0V2yw3UXmOpj+b4JAGdpHBwsPE6kjSt8Za0d1VllD+FV7EGHBcdV4+oHUAo+yrqbVAWxNSDCPQ==} + + memfs@3.4.3: + resolution: {integrity: sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==} + engines: {node: '>= 4.0.0'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-releases@2.0.53: + resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + engines: {node: '>=18'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-selector-parser@7.1.5: + resolution: {integrity: sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + engines: {node: '>=0.10.0'} + + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + remotion@4.0.512: + resolution: {integrity: sha512-L47ImosLFn/uSEGhgV6nO9agEjrRTD+xfeIC4QlGSkCkHjG4IpH2dm0psRoLrK0eo8iiUc4rwUFNnNxQpLnx2w==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0: + resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==} + engines: {node: '>= 12'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + style-loader@4.0.0: + resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.27.0 + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.6.1: + resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true + uglify-js: + optional: true + + terser@5.50.0: + resolution: {integrity: sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==} + engines: {node: '>=10'} + hasBin: true + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + + update-browserslist-db@1.3.1: + resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} + engines: {node: '>=10.13.0'} + + webpack-sources@3.5.1: + resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==} + engines: {node: '>=10.13.0'} + + webpack@5.105.0: + resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + +snapshots: + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7(supports-color@8.1.1)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.8 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7(supports-color@8.1.1)': + dependencies: + '@babel/traverse': 7.29.8(supports-color@8.1.1) + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + + '@babel/parser@7.24.1': + dependencies: + '@babel/types': 7.29.8 + + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + + '@babel/traverse@7.29.8(supports-color@8.1.1)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + to-fast-properties: 2.0.0 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@emnapi/core@1.11.3': + dependencies: + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true + + '@esbuild/openbsd-arm64@0.28.1': + optional: true + + '@esbuild/openbsd-x64@0.28.1': + optional: true + + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mediabunny/aac-encoder@1.50.8(mediabunny@1.50.8)': + dependencies: + mediabunny: 1.50.8 + + '@mediabunny/flac-encoder@1.50.8(mediabunny@1.50.8)': + dependencies: + mediabunny: 1.50.8 + + '@mediabunny/mp3-encoder@1.50.8(mediabunny@1.50.8)': + dependencies: + mediabunny: 1.50.8 + + '@module-federation/error-codes@0.22.0': {} + + '@module-federation/runtime-core@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/runtime-tools@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/webpack-bundler-runtime': 0.22.0 + + '@module-federation/runtime@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/runtime-core': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/sdk@0.22.0': {} + + '@module-federation/webpack-bundler-runtime@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@remotion/bundler@4.0.512(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@remotion/media-parser': 4.0.512 + '@remotion/studio': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/studio-shared': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/timeline-utils': 4.0.512 + '@rspack/core': 1.7.11 + '@rspack/plugin-react-refresh': 1.6.1(react-refresh@0.18.0) + css-loader: 7.1.4(@rspack/core@1.7.11)(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.26)) + esbuild: 0.28.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-refresh: 0.18.0 + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + style-loader: 4.0.0(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.26)) + webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.26) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + + '@remotion/captions@4.0.512': {} + + '@remotion/cli@4.0.512(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1)(typescript@5.9.3)': + dependencies: + '@babel/parser': 7.24.1 + '@remotion/bundler': 4.0.512(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/media-utils': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/player': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/renderer': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/studio': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/studio-server': 4.0.512(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1)(typescript@5.9.3) + '@remotion/studio-shared': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + dotenv: 17.3.1 + minimist: 1.2.6 + prompts: 2.4.2 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + semver: 7.5.3 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + + '@remotion/compositor-darwin-arm64@4.0.512': + optional: true + + '@remotion/compositor-darwin-x64@4.0.512': + optional: true + + '@remotion/compositor-linux-arm64-gnu@4.0.512': + optional: true + + '@remotion/compositor-linux-arm64-musl@4.0.512': + optional: true + + '@remotion/compositor-linux-x64-gnu@4.0.512': + optional: true + + '@remotion/compositor-linux-x64-musl@4.0.512': + optional: true + + '@remotion/compositor-win32-x64-msvc@4.0.512': + optional: true + + '@remotion/licensing@4.0.512': {} + + '@remotion/media-parser@4.0.512': {} + + '@remotion/media-utils@4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + mediabunny: 1.50.8 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + + '@remotion/player@4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + + '@remotion/renderer@4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@remotion/licensing': 4.0.512 + '@remotion/streaming': 4.0.512 + execa: 5.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + source-map: 0.8.0 + ws: 8.21.0 + optionalDependencies: + '@remotion/compositor-darwin-arm64': 4.0.512 + '@remotion/compositor-darwin-x64': 4.0.512 + '@remotion/compositor-linux-arm64-gnu': 4.0.512 + '@remotion/compositor-linux-arm64-musl': 4.0.512 + '@remotion/compositor-linux-x64-gnu': 4.0.512 + '@remotion/compositor-linux-x64-musl': 4.0.512 + '@remotion/compositor-win32-x64-msvc': 4.0.512 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@remotion/streaming@4.0.512': {} + + '@remotion/studio-codemods@4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + '@remotion/studio-shared': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + ast-types: 0.16.1 + recast: 0.23.11 + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + transitivePeerDependencies: + - react + - react-dom + + '@remotion/studio-protocol@4.0.512': {} + + '@remotion/studio-server@4.0.512(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1)(typescript@5.9.3)': + dependencies: + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + '@remotion/bundler': 4.0.512(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/renderer': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/studio-codemods': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/studio-protocol': 4.0.512 + '@remotion/studio-shared': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@svgr/core': 8.1.0(supports-color@8.1.1)(typescript@5.9.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1) + kiwi-schema: 0.5.0 + memfs: 3.4.3 + open: 8.4.2 + prettier: 3.8.1 + recast: 0.23.11 + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + semver: 7.5.3 + zod: 4.4.3 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - react + - react-dom + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + + '@remotion/studio-shared@4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@remotion/studio-protocol': 4.0.512 + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + transitivePeerDependencies: + - react + - react-dom + + '@remotion/studio@4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@remotion/captions': 4.0.512 + '@remotion/media-utils': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/player': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/renderer': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/studio-protocol': 4.0.512 + '@remotion/studio-shared': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/timeline-utils': 4.0.512 + '@remotion/web-renderer': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@remotion/zod-types': 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + mediabunny: 1.50.8 + memfs: 3.4.3 + open: 8.4.2 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + semver: 7.5.3 + zod: 4.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@remotion/timeline-utils@4.0.512': + dependencies: + mediabunny: 1.50.8 + + '@remotion/web-renderer@4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@mediabunny/aac-encoder': 1.50.8(mediabunny@1.50.8) + '@mediabunny/flac-encoder': 1.50.8(mediabunny@1.50.8) + '@mediabunny/mp3-encoder': 1.50.8(mediabunny@1.50.8) + '@remotion/licensing': 4.0.512 + mediabunny: 1.50.8 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + + '@remotion/zod-types@4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + remotion: 4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + transitivePeerDependencies: + - react + - react-dom + + '@rspack/binding-darwin-arm64@1.7.11': + optional: true + + '@rspack/binding-darwin-x64@1.7.11': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.7.11': + optional: true + + '@rspack/binding-linux-arm64-musl@1.7.11': + optional: true + + '@rspack/binding-linux-x64-gnu@1.7.11': + optional: true + + '@rspack/binding-linux-x64-musl@1.7.11': + optional: true + + '@rspack/binding-wasm32-wasi@1.7.11': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.7.11': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.7.11': + optional: true + + '@rspack/binding-win32-x64-msvc@1.7.11': + optional: true + + '@rspack/binding@1.7.11': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.7.11 + '@rspack/binding-darwin-x64': 1.7.11 + '@rspack/binding-linux-arm64-gnu': 1.7.11 + '@rspack/binding-linux-arm64-musl': 1.7.11 + '@rspack/binding-linux-x64-gnu': 1.7.11 + '@rspack/binding-linux-x64-musl': 1.7.11 + '@rspack/binding-wasm32-wasi': 1.7.11 + '@rspack/binding-win32-arm64-msvc': 1.7.11 + '@rspack/binding-win32-ia32-msvc': 1.7.11 + '@rspack/binding-win32-x64-msvc': 1.7.11 + + '@rspack/core@1.7.11': + dependencies: + '@module-federation/runtime-tools': 0.22.0 + '@rspack/binding': 1.7.11 + '@rspack/lite-tapable': 1.1.0 + + '@rspack/lite-tapable@1.1.0': {} + + '@rspack/plugin-react-refresh@1.6.1(react-refresh@0.18.0)': + dependencies: + error-stack-parser: 2.1.4 + html-entities: 2.6.0 + react-refresh: 0.18.0 + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + + '@svgr/babel-preset@8.1.0(@babel/core@7.29.7(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + + '@svgr/core@8.1.0(supports-color@8.1.1)(typescript@5.9.3)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7(supports-color@8.1.1)) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.9.3) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.24.0 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(supports-color@8.1.1)(typescript@5.9.3))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/core': 8.1.0(supports-color@8.1.1)(typescript@5.9.3) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/dom-mediacapture-transform@0.1.12': + dependencies: + '@types/dom-webcodecs': 0.1.13 + + '@types/dom-webcodecs@0.1.13': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.9 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@26.2.0': + dependencies: + undici-types: 8.3.0 + + '@types/react@19.2.18': + dependencies: + csstype: 3.2.3 + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + acorn-import-phases@1.0.4(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + + acorn@8.18.0: {} + + ajv-formats@2.1.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-keywords@5.1.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + fast-deep-equal: 3.1.3 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.5 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + argparse@2.0.1: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + baseline-browser-mapping@2.11.14: {} + + browserslist@4.28.8: + dependencies: + baseline-browser-mapping: 2.11.14 + caniuse-lite: 1.0.30001809 + electron-to-chromium: 1.5.407 + node-releases: 2.0.53 + update-browserslist-db: 1.3.1(browserslist@4.28.8) + + buffer-from@1.1.2: {} + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001809: {} + + chrome-trace-event@1.0.4: {} + + commander@2.20.3: {} + + convert-source-map@2.0.0: {} + + cosmiconfig@8.3.6(typescript@5.9.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-loader@7.1.4(@rspack/core@1.7.11)(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.26)): + dependencies: + icss-utils: 5.1.0(postcss@8.5.26) + postcss: 8.5.26 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.26) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.26) + postcss-modules-scope: 3.2.1(postcss@8.5.26) + postcss-modules-values: 4.0.0(postcss@8.5.26) + postcss-value-parser: 4.2.0 + semver: 7.8.5 + optionalDependencies: + '@rspack/core': 1.7.11 + webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.26) + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + debug@4.4.3(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + define-lazy-prop@2.0.0: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dotenv@17.3.1: {} + + electron-to-chromium@1.5.407: {} + + enhanced-resolve@5.24.5: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@4.5.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + es-module-lexer@2.3.1: {} + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + + escalade@3.2.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.5: {} + + fs-monkey@1.0.3: {} + + gensync@1.0.0-beta.2: {} + + get-stream@6.0.1: {} + + glob-to-regexp@0.4.1: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + html-entities@2.6.0: {} + + human-signals@2.1.0: {} + + icss-utils@5.1.0(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + is-arrayish@0.2.1: {} + + is-docker@2.2.1: {} + + is-stream@2.0.1: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isexe@2.0.0: {} + + jest-worker@27.5.1: + dependencies: + '@types/node': 26.2.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + js-tokens@4.0.0: {} + + js-yaml@4.3.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + kiwi-schema@0.5.0: {} + + kleur@3.0.3: {} + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.2: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + mediabunny@1.50.8: + dependencies: + '@types/dom-mediacapture-transform': 0.1.12 + '@types/dom-webcodecs': 0.1.13 + + memfs@3.4.3: + dependencies: + fs-monkey: 1.0.3 + + merge-stream@2.0.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + minimist@1.2.6: {} + + ms@2.1.3: {} + + nanoid@3.3.18: {} + + neo-async@2.6.2: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-releases@2.0.53: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + postcss-modules-extract-imports@3.1.0(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.26): + dependencies: + icss-utils: 5.1.0(postcss@8.5.26) + postcss: 8.5.26 + postcss-selector-parser: 7.1.5 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.26): + dependencies: + postcss: 8.5.26 + postcss-selector-parser: 7.1.5 + + postcss-modules-values@4.0.0(postcss@8.5.26): + dependencies: + icss-utils: 5.1.0(postcss@8.5.26) + postcss: 8.5.26 + + postcss-selector-parser@7.1.5: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.26: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.8.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + react-dom@19.2.8(react@19.2.8): + dependencies: + react: 19.2.8 + scheduler: 0.27.0 + + react-refresh@0.18.0: {} + + react@19.2.8: {} + + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + remotion@4.0.512(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + scheduler@0.27.0: {} + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) + + semver@6.3.1: {} + + semver@7.5.3: + dependencies: + lru-cache: 6.0.0 + + semver@7.8.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + sisteransi@1.0.5: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.8.0: {} + + stackframe@1.3.4: {} + + strip-final-newline@2.0.0: {} + + style-loader@4.0.0(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.26)): + dependencies: + webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.26) + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + svg-parser@2.0.4: {} + + tapable@2.3.3: {} + + terser-webpack-plugin@5.6.1(esbuild@0.28.1)(postcss@8.5.26)(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.26)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.50.0 + webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.26) + optionalDependencies: + esbuild: 0.28.1 + postcss: 8.5.26 + + terser@5.50.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.18.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + tiny-invariant@1.3.3: {} + + to-fast-properties@2.0.0: {} + + tslib@2.8.1: {} + + typescript@5.9.3: {} + + undici-types@8.3.0: {} + + update-browserslist-db@1.3.1(browserslist@4.28.8): + dependencies: + browserslist: 4.28.8 + escalade: 3.2.0 + picocolors: 1.1.1 + + util-deprecate@1.0.2: {} + + watchpack@2.5.2: + dependencies: + graceful-fs: 4.2.11 + + webpack-sources@3.5.1: {} + + webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.26): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.18.0 + acorn-import-phases: 1.0.4(acorn@8.18.0) + browserslist: 4.28.8 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.24.5 + es-module-lexer: 2.3.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.2 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.3 + terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(postcss@8.5.26)(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.26)) + watchpack: 2.5.2 + webpack-sources: 3.5.1 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + ws@8.21.0: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + zod@4.4.3: {} diff --git a/media/experience-era-agents-video/video/remotion.config.ts b/media/experience-era-agents-video/video/remotion.config.ts new file mode 100644 index 00000000..dcbd6157 --- /dev/null +++ b/media/experience-era-agents-video/video/remotion.config.ts @@ -0,0 +1,4 @@ +import {Config} from '@remotion/cli/config'; + +Config.setVideoImageFormat('jpeg'); +Config.setOverwriteOutput(true); diff --git a/media/experience-era-agents-video/video/src/Main.tsx b/media/experience-era-agents-video/video/src/Main.tsx new file mode 100644 index 00000000..c582b938 --- /dev/null +++ b/media/experience-era-agents-video/video/src/Main.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import {AbsoluteFill, Sequence} from 'remotion'; +import {NarrationAudio} from './components/NarrationAudio'; +import {Subtitle} from './components/Subtitle'; +import {theme} from './design/theme'; +import {computeTimeline} from './timing'; +import type {ManifestItem, SceneRange} from './types'; +import {P0Hook} from './scenes/P0Hook'; +import {P1Anatomy} from './scenes/P1Anatomy'; +import {P2FourDestinations} from './scenes/P2FourDestinations'; +import {P3Meta} from './scenes/P3Meta'; +import {P4Eval} from './scenes/P4Eval'; +import {P5Safety} from './scenes/P5Safety'; +import {P6Ending} from './scenes/P6Ending'; + +const SCENE_COMPONENTS: Record> = { + P0: P0Hook, + P1: P1Anatomy, + P2: P2FourDestinations, + P3: P3Meta, + P4: P4Eval, + P5: P5Safety, + P6: P6Ending, +}; + +export type MainProps = {manifest: ManifestItem[]}; + +export const Main: React.FC = ({manifest}) => { + const {timed, scenes} = computeTimeline(manifest); + return ( + + {scenes.map((sc) => { + const SceneComp = SCENE_COMPONENTS[sc.scene]; + if (!SceneComp) { + throw new Error(`未注册的场景组件: ${sc.scene}`); + } + return ( + + + + ); + })} + + + + ); +}; diff --git a/media/experience-era-agents-video/video/src/Root.tsx b/media/experience-era-agents-video/video/src/Root.tsx new file mode 100644 index 00000000..276015fc --- /dev/null +++ b/media/experience-era-agents-video/video/src/Root.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import {Composition, staticFile} from 'remotion'; +import type {CalculateMetadataFunction} from 'remotion'; +import {Main} from './Main'; +import type {MainProps} from './Main'; +import {computeTimeline, FPS} from './timing'; +import type {ManifestItem} from './types'; + +const calculateMetadata: CalculateMetadataFunction = async () => { + const res = await fetch(staticFile('audio/manifest.json')); + if (!res.ok) { + throw new Error('缺少 public/audio/manifest.json —— 先运行 scripts/tts.py 合成配音'); + } + const manifest = (await res.json()) as ManifestItem[]; + const {totalDurationInFrames} = computeTimeline(manifest); + return { + durationInFrames: totalDurationInFrames, + props: {manifest}, + }; +}; + +export const RemotionRoot: React.FC = () => { + return ( + + ); +}; diff --git a/media/experience-era-agents-video/video/src/components/NarrationAudio.tsx b/media/experience-era-agents-video/video/src/components/NarrationAudio.tsx new file mode 100644 index 00000000..0555863f --- /dev/null +++ b/media/experience-era-agents-video/video/src/components/NarrationAudio.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import {Audio, Sequence, staticFile} from 'remotion'; +import type {TimedSentence} from '../types'; + +/** 全片旁白:每句一段音频,按 manifest 时序装配 */ +export const NarrationAudio: React.FC<{timed: TimedSentence[]}> = ({timed}) => { + return ( + <> + {timed.map((s) => ( + + + ))} + + ); +}; diff --git a/media/experience-era-agents-video/video/src/components/Subtitle.tsx b/media/experience-era-agents-video/video/src/components/Subtitle.tsx new file mode 100644 index 00000000..ac3b4b78 --- /dev/null +++ b/media/experience-era-agents-video/video/src/components/Subtitle.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import {AbsoluteFill, interpolate, useCurrentFrame} from 'remotion'; +import {theme} from '../design/theme'; +import type {TimedSentence} from '../types'; + +const CJK = /[⺀-鿿豈-﫿]/; +/** 全角标点与 CJK 同宽(1em),不满足 CJK 区间,须并列判定; + * ASCII 引号 (U+0022/27) 字形实为半宽,不入此类、按 0.55 桶计 */ +const FULLWIDTH_PUNCT = /[,。!?:;、“”‘’()——…·《》「」]/; + +/** 全片底部字幕条:一句一条,与配音逐句同步(storyboard.md 字幕规范) */ +export const Subtitle: React.FC<{timed: TimedSentence[]}> = ({timed}) => { + const frame = useCurrentFrame(); + const current = timed.find((s) => frame >= s.from && frame < s.from + s.durationInFrames); + if (!current) { + return null; + } + const local = frame - current.from; + const opacity = interpolate(local, [0, 4], [0, 1], { + extrapolateRight: 'clamp', + }); + // 长句防御性收缩:估算宽度超限时缩小字号,保证单行不溢出(全角≈1 字宽,半角≈0.55)。 + // 内容预算 = maxWidth 1600 − 左右 padding 72 = 1528,估算含 ~2% 字距余量故用 1500 触发 + const estWidth = + current.text.split('').reduce( + (w, ch) => w + (CJK.test(ch) || FULLWIDTH_PUNCT.test(ch) ? 1 : 0.55), + 0, + ) * 44; + const fontSize = estWidth > 1500 ? Math.max(30, 44 - (estWidth - 1500) / 25) : 44; + return ( + +
+ {current.text} +
+
+ ); +}; diff --git a/media/experience-era-agents-video/video/src/components/cards.tsx b/media/experience-era-agents-video/video/src/components/cards.tsx new file mode 100644 index 00000000..9c5fb19a --- /dev/null +++ b/media/experience-era-agents-video/video/src/components/cards.tsx @@ -0,0 +1,135 @@ +import React from 'react'; +import {AbsoluteFill, interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion'; +import {theme} from '../design/theme'; + +/** 金句卡:衬线大字居中,可附英文原文与出处 */ +export const QuoteCard: React.FC<{ + zh: string; + en?: string; + cite?: string; + accent?: string; +}> = ({zh, en, cite, accent = theme.text}) => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const enter = spring({frame, fps, config: {damping: 200}}); + return ( + +
+
+ {zh} +
+ {en ? ( +
+ {en} +
+ ) : null} + {cite ? ( +
+ —— {cite} +
+ ) : null} +
+
+ ); +}; + +/** 章节卡:大标题 + 通路色光带 */ +export const ChapterCard: React.FC<{ + kicker: string; + title: string; + accent: string; +}> = ({kicker, title, accent}) => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const enter = spring({frame, fps, config: {damping: 200}}); + const sweep = interpolate(frame, [0, 25], [0, 100], {extrapolateRight: 'clamp'}); + return ( + +
+
{kicker}
+
+ {title} +
+
+
+ + ); +}; + +/** 简单淡入上移容器 */ +export const FadeUp: React.FC<{delay?: number; children: React.ReactNode; style?: React.CSSProperties}> = ({ + delay = 0, + children, + style, +}) => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const enter = spring({frame: frame - delay, fps, config: {damping: 200}}); + return ( +
{children}
+ ); +}; + +/** 标签胶囊 */ +export const Pill: React.FC<{color: string; children: React.ReactNode; style?: React.CSSProperties}> = ({ + color, + children, + style, +}) => ( + + {children} + +); diff --git a/media/experience-era-agents-video/video/src/design/theme.ts b/media/experience-era-agents-video/video/src/design/theme.ts new file mode 100644 index 00000000..0edc8473 --- /dev/null +++ b/media/experience-era-agents-video/video/src/design/theme.ts @@ -0,0 +1,26 @@ +/** 全片视觉规范(见 script/planning.md 与 storyboard.md) + * 本集三色语义契约: + * 金 = 经验流(trace → 可用经验 z,全片主色) + * 青 = Harness 运行时(快时标外部更新面) + * 紫 = 参数内化(慢时标权重巩固) */ +export const theme = { + bg: '#0E1116', + panel: '#171C26', + panelBorder: '#2A3242', + text: '#F2F5FA', + dim: '#9AA7B8', + /** 金 = 经验流(trace→z,全片主线) */ + exp: '#F5C542', + expDeep: '#5c4a1a', + /** 青 = Harness 运行时(快时标外部更新) */ + harness: '#2DD4BF', + harnessDeep: '#134a44', + /** 紫 = 参数内化(慢时标巩固进模型权重) */ + params: '#B78CFF', + paramsDeep: '#3d2a5c', + danger: '#FF5C5C', + ok: '#7ED321', + serif: "'Songti SC', 'STSong', 'Noto Serif SC', serif", + sans: "'PingFang SC', 'Hiragino Sans GB', 'Noto Sans SC', sans-serif", + mono: "'SF Mono', 'Menlo', 'JetBrains Mono', monospace", +} as const; diff --git a/media/experience-era-agents-video/video/src/index.ts b/media/experience-era-agents-video/video/src/index.ts new file mode 100644 index 00000000..d831f7b0 --- /dev/null +++ b/media/experience-era-agents-video/video/src/index.ts @@ -0,0 +1,4 @@ +import {registerRoot} from 'remotion'; +import {RemotionRoot} from './Root'; + +registerRoot(RemotionRoot); diff --git a/media/experience-era-agents-video/video/src/scenes/P0Hook.tsx b/media/experience-era-agents-video/video/src/scenes/P0Hook.tsx new file mode 100644 index 00000000..378aca30 --- /dev/null +++ b/media/experience-era-agents-video/video/src/scenes/P0Hook.tsx @@ -0,0 +1,252 @@ +import React from 'react'; +import { + AbsoluteFill, + Sequence, + interpolate, + spring, + useCurrentFrame, + useVideoConfig, +} from 'remotion'; +import {FadeUp, Pill, QuoteCard} from '../components/cards'; +import {theme} from '../design/theme'; +import {beatWindow} from '../timing'; +import type {SceneRange} from '../types'; + +/** 0-A:经验时代宣言打字机金句卡 */ +const Manifesto: React.FC = () => { + const frame = useCurrentFrame(); + const zh = '"AI 的下一个时代,叫经验时代。"'; + const shown = Math.min(zh.length, Math.floor(frame / 2.2)); + return ( + +
+
+ 2025 · THE ERA OF EXPERIENCE +
+
+ {zh.slice(0, shown)} + +
+
+ "Progress will come from experience generated as agents interact with their environments." +
+
+ —— Silver & Sutton, 2025 +
+
+
+ ); +}; + +/** 0-B:永远入职第一天——日历翻页盖章 */ +const DayOne: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const pages = Math.min(5, Math.floor(frame / 14) + 1); + const stamp = interpolate(frame, [8, 16], [2.4, 1], { + extrapolateLeft: 'clamp', + extrapolateRight: 'clamp', + }); + return ( + +
+
🤖
+
+ {Array.from({length: pages}).map((_, i) => ( +
+
DAY {100 + i * 37}
+
+ 入职第 {i + 1} 天 +
+
+ ))} +
= 2 ? stamp : 0.001})`, + border: `6px solid ${theme.danger}`, + borderRadius: 12, + color: theme.danger, + fontFamily: theme.sans, + fontWeight: 900, + fontSize: 44, + padding: '8px 20px', + opacity: 0.92, + }} + > + 又是第 1 天 +
+
+
+ +
+ 干完活 · 聊天记录一关 · 学到的东西跟着就没了 +
+
+
+ ); +}; + +/** 0-D:论文卡 */ +const PaperCard: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const enter = spring({frame, fps, config: {damping: 16}}); + return ( + +
+
88 页综述 · 2026-06
+
+ Self-Improving Agents in the Era of Experience: +
+ A Survey of Self- to Meta-Evolution +
+
+ 清华大学 × Horizon Research (Frontis.AI) +
+
+ 经验如何变成实力 + 部署之后 +
+
+
+ ); +}; + +/** 0-E:片名标题卡——三色光带 */ +const TitleCard: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const enter = spring({frame, fps, config: {damping: 200}}); + const flow = interpolate(frame, [0, 60], [0, 1], {extrapolateRight: 'clamp'}); + const bands: Array<{color: string; angle: number; delay: number}> = [ + {color: theme.exp, angle: -70, delay: 0}, + {color: theme.harness, angle: 0, delay: 6}, + {color: theme.params, angle: 70, delay: 12}, + ]; + return ( + + {bands.map((b, i) => ( +
+ ))} +
+ 上线之后,AI 才开始上学 +
+ +
+ 经验时代的自我进化 · 一篇 88 页综述讲明白 +
+
+ + ); +}; + +export const P0Hook: React.FC<{scene: SceneRange}> = ({scene}) => { + const w = (fromId: string, toId?: string) => beatWindow(scene.sentences, scene.from, fromId, toId); + return ( + + + + + + + + + + + + + + + + + + ); +}; diff --git a/media/experience-era-agents-video/video/src/scenes/P1Anatomy.tsx b/media/experience-era-agents-video/video/src/scenes/P1Anatomy.tsx new file mode 100644 index 00000000..d25e265e --- /dev/null +++ b/media/experience-era-agents-video/video/src/scenes/P1Anatomy.tsx @@ -0,0 +1,516 @@ +import React from 'react'; +import { + AbsoluteFill, + Sequence, + interpolate, + spring, + useCurrentFrame, + useVideoConfig, +} from 'remotion'; +import {FadeUp, Pill} from '../components/cards'; +import {theme} from '../design/theme'; +import {beatWindow} from '../timing'; +import type {SceneRange} from '../types'; + +/** 1-A:四件套解剖图 A_t = ⟨M, H, U, E⟩ */ +const FourParts: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const parts = [ + {icon: '🧠', label: '模型 M', sub: '出厂自带的大脑', color: theme.params, pos: {left: 180, top: 380}}, + {icon: '🗂️', label: '工位 H', sub: 'Harness · 工作系统', color: theme.harness, pos: {right: 180, top: 380}}, + {icon: '👤', label: '老板 U', sub: '提需求 · 给反馈', color: theme.dim, pos: {left: 480, top: 120}}, + {icon: '🏭', label: '车间 E', sub: '浏览器 · 仓库 · 工具', color: theme.dim, pos: {left: 480, top: 660}}, + ]; + return ( + + {parts.map((p, i) => { + const enter = spring({frame: frame - i * 6, fps, config: {damping: 200}}); + return ( +
+
{p.icon}
+
+ {p.label} +
+
{p.sub}
+
+ ); + })} + +
A_t = ⟨ M, H, U, E ⟩
+
+
+ ); +}; + +/** 1-B/1-C:Harness 特写——包在大脑外面的工作系统 */ +const HarnessZoom: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const tools = [ + {icon: '📘', label: '工作手册'}, + {icon: '📓', label: '笔记本'}, + {icon: '🔑', label: '工具权限'}, + {icon: '🧭', label: '办事流程'}, + ]; + return ( + +
+
+ 🧠 +
+
+
+ {tools.map((t, i) => { + const enter = spring({frame: frame - 10 - i * 5, fps, config: {damping: 200}}); + const angle = frame * 0.006 + i * 1.57; + return ( +
+ {t.icon} + {t.label} +
+ ); + })} +
+ + Harness = 经验基础设施 + +
+ ); +}; + +/** 1-D:改工位便宜 vs 改大脑贵 */ +const CheapVsExpensive: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const enter = spring({frame, fps, config: {damping: 200}}); + return ( + +
+
+
🏗️
+
改大脑
+
+ 重型机械 · 重新训练 +
+ 贵 · 慢 · 基本出厂定型 +
+
+
+
🧩
+
改工位
+
+ 乐高快拆 · 随时改随时撤 +
+ 但同样决定 AI 看到什么 · 能做什么 +
+
+
+
+ ); +}; + +/** 1-E:原油→汽油提纯漏斗(trace → 经验 z) */ +const Refinery: React.FC = () => { + const frame = useCurrentFrame(); + const stages = ['过滤', '压缩', '归因', '验证']; + const flow = interpolate(frame, [10, 70], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+ +
+
+ 原始流水 +
+
trace τ
+
+
+
+ {/* 漏斗 */} +
+ {/* 四道工序环 */} +
+ {stages.map((s, i) => { + const on = flow > (i + 0.5) / 5; + return ( +
+ {s} +
+ ); + })} +
+ {/* 滴出的金色经验 */} +
0.8 ? 1 : 0.1, + transform: `translateY(${(1 - flow) * -60}px)`, + }} + /> +
0.8 ? 1 : 0, + }} + > + 可用经验 z +
+
+
+ +
z_i = H(τ_i)
+
+ + ); +}; + +/** 1-F:快慢双去路 */ +const TwoPaths: React.FC = () => { + const frame = useCurrentFrame(); + const fast = interpolate(frame, [10, 45], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + const slow = interpolate(frame, [30, 100], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+
+ {/* 快路:上弧线到工位 */} + + + + +
0.9 ? 1 : 0, + }} + > +
改工位 · 快
+
今天就能用上
+
+
0.9 ? 1 : 0, + }} + > +
写大脑 · 慢
+
变成一辈子的本能
+
+
+ + ); +}; + +/** 1-G:三代演进时间轴 */ +const ThreeGens: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const gens = [ + {name: 'Gen 1 · 任务循环', icon: '🔁', desc: '会用工具 · 干完就忘', year: '2021', color: theme.dim}, + {name: 'Gen 2 · 跨任务复用', icon: '📚', desc: '有记忆技能库 · 靠人配置', year: '2023', color: theme.harness}, + {name: 'Gen 3 · 运行时系统', icon: '🏢', desc: '工位本身自动升级', year: '2025', color: theme.exp}, + ]; + return ( + +
+
+
+ {gens.map((g, i) => { + const enter = spring({frame: frame - i * 16, fps, config: {damping: 200}}); + return ( +
+
+
+ {g.year} +
+
{g.icon}
+
+ {g.name} +
+
{g.desc}
+
+ ); + })} +
+
+ +
+ ReAct → Voyager → Claude Code / Codex / Cursor · 四年半走完三代 +
+
+ + ); +}; + +export const P1Anatomy: React.FC<{scene: SceneRange}> = ({scene}) => { + const w = (fromId: string, toId?: string) => beatWindow(scene.sentences, scene.from, fromId, toId); + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +/** 1-H / 2-A 共用:四管道总图 */ +export const FourDestinationsPreview: React.FC<{highlight?: number}> = ({highlight = -1}) => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const dests = [ + {icon: '🗂️', label: '技能库', color: theme.harness}, + {icon: '📓', label: '记忆', color: theme.harness}, + {icon: '🏭', label: '环境', color: theme.harness}, + {icon: '🧠', label: '大脑', color: theme.params}, + ]; + return ( + +
+
+ {dests.map((d, i) => { + const enter = spring({frame: frame - 6 - i * 5, fps, config: {damping: 200}}); + const lit = highlight < 0 || highlight === i; + return ( +
+
{d.icon}
+
+ {d.label} +
+
+ ); + })} +
+ + ); +}; diff --git a/media/experience-era-agents-video/video/src/scenes/P2FourDestinations.tsx b/media/experience-era-agents-video/video/src/scenes/P2FourDestinations.tsx new file mode 100644 index 00000000..c5765734 --- /dev/null +++ b/media/experience-era-agents-video/video/src/scenes/P2FourDestinations.tsx @@ -0,0 +1,611 @@ +import React from 'react'; +import { + AbsoluteFill, + Sequence, + interpolate, + spring, + useCurrentFrame, + useVideoConfig, +} from 'remotion'; +import {FadeUp, Pill} from '../components/cards'; +import {theme} from '../design/theme'; +import {beatWindow} from '../timing'; +import type {SceneRange} from '../types'; +import {FourDestinationsPreview} from './P1Anatomy'; + +/** 2-B:技能抽屉——SKILL.md 文件夹 σ=⟨M,I,R,A⟩ */ +const SkillDrawer: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const open = interpolate(frame, [6, 26], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + const sections = [ + {k: 'M', label: '封面 · 元数据', desc: '这技能干嘛的', color: theme.harness}, + {k: 'I', label: '正文 · 指令', desc: '怎么干', color: theme.exp}, + {k: 'R', label: '参考 · 资料', desc: '文档与样例', color: theme.harness}, + {k: 'A', label: '附件 · 脚本', desc: '支撑落地', color: theme.params}, + ]; + return ( + +
+
+
🗄️
+
技能抽屉
+
+
+ {sections.map((s, i) => { + const enter = spring({frame: frame - 24 - i * 5, fps, config: {damping: 200}}); + return ( +
+ {s.k} + {s.label} + {s.desc} +
+ ); + })} +
+
+ +
σ = ⟨ M, I, R, A ⟩ · SKILL.md 规范
+
+
+ ); +}; + +/** 2-C:生命周期环(创建→使用→进化) */ +const LifecycleRing: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const stages = [ + {name: '创建', icon: '🛠️', desc: '专家手写 · 挖仓库 · 蒸馏文档'}, + {name: '使用', icon: '🔍', desc: '找得到 · 搭得起来 · 跑得动'}, + {name: '进化', icon: '🧬', desc: '部署证据 → 增删改库'}, + ]; + return ( + +
+ {stages.map((s, i) => { + const enter = spring({frame: frame - i * 10, fps, config: {damping: 200}}); + return ( + + {i > 0 ? ( +
+ ) : null} +
+
{s.icon}
+
+ {s.name} +
+
+ {s.desc} +
+
+
+ ); + })} +
+ +
+ 库一大,找不到就是大问题 —— 好技能藏在角落,等于没有 +
+
+ SkillsWild / SkillRouter:大规模检索缺口 +
+
+
+ ); +}; + +/** 2-D+2-E:验证门 + 负迁移数字面板 */ +const ValidationGate: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const enterPanel = spring({frame: frame - 20, fps, config: {damping: 200}}); + const passGate = interpolate(frame, [8, 20], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+ {/* 闸机 */} +
+ {[0, 1, 2].map((i) => ( +
+ {i === 2 ? '✗' : '✓'} +
+ ))} + {/* 闸门本体 */} +
+
🛡️
+
+ 验证 +
+
+ +
及格才准入库
+
+
+ {/* 数字面板 */} +
+
+
+16.2 分
+
86 任务 · 11 领域平均提升
+
+
+
16 / 84
+
任务反而变差 —— 负迁移
+
+
SkillsBench
+
+
+
+ ); +}; + +/** 2-F:记忆五动作 */ +const MemoryOps: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const ops = [ + {name: '记', icon: '✍️', en: 'Write'}, + {name: '压', icon: '🗜️', en: 'Compress'}, + {name: '并', icon: '🔗', en: 'Consolidate'}, + {name: '取', icon: '🔎', en: 'Retrieve'}, + {name: '改', icon: '🧽', en: 'Update'}, + ]; + return ( + +
+ {ops.map((o, i) => { + const enter = spring({frame: frame - i * 9, fps, config: {damping: 200}}); + const stampDown = interpolate(frame - i * 9, [0, 6], [1.6, 1], { + extrapolateLeft: 'clamp', + extrapolateRight: 'clamp', + }); + return ( +
0.5 ? stampDown : 0.5})`, + }} + > +
+ {o.icon} +
+
{o.name}
+
{o.en}
+
+ ); + })} +
+
+ ); +}; + +/** 2-G:记忆三层自进化 + 两大坑 */ +const MemoryLayers: React.FC = () => { + const frame = useCurrentFrame(); + const layers = ['内容', '机制', '策略']; + return ( + +
+
+ {layers.map((l, i) => { + const size = 420 - i * 120; + const enter = interpolate(frame, [i * 14, i * 14 + 16], [0, 1], { + extrapolateRight: 'clamp', + extrapolateLeft: 'clamp', + }); + return ( +
+ + {l}变好 + +
+ ); + })} +
+
+ + 记太多 → 翻不动 + + + 记太少 → 没料用 + + + 陈旧记忆 → 悄悄带偏判断 + +
+
+
+ ); +}; + +/** 2-H:环境三层楼 + 天花板 */ +const EnvFloors: React.FC = () => { + const frame = useCurrentFrame(); + const floors = [ + {name: '可执行', icon: '⌨️', desc: '软件让 AI 真能操作'}, + {name: '协议化', icon: '🔌', desc: '接口统一 · 经验能搬家'}, + {name: '可学习', icon: '📡', desc: '反馈能当训练信号'}, + ]; + const ceil = interpolate(frame, [50, 70], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+
+ {floors.map((f, i) => { + const enter = interpolate(frame, [i * 16, i * 16 + 16], [0, 1], { + extrapolateRight: 'clamp', + extrapolateLeft: 'clamp', + }); + return ( +
+ {f.icon} +
+
+ {i + 1} 楼 · {f.name} +
+
{f.desc}
+
+
+ ); + })} + {/* 天花板虚线 */} +
+
+ J*(E) 适应上限 +
+
+
+ +
+ 大部分环境卡在一楼半:能跑,但反馈太稀、没法学 +
+
+ + ); +}; + +/** 2-I:参数巩固——验证过的套路蒸馏进大脑 */ +const Consolidate: React.FC = () => { + const frame = useCurrentFrame(); + const settle = interpolate(frame, [30, 90], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+
+ {[0, 1, 2, 3].map((i) => { + const enter = interpolate(frame, [i * 6, i * 6 + 10], [0, 1], { + extrapolateRight: 'clamp', + extrapolateLeft: 'clamp', + }); + return ( +
+ + 验证过的套路 #{i + 1} +
+ ); + })} +
+ {/* 蒸馏漏斗 */} +
+ {/* 大脑 */} +
0.3 ? 1 : 0.3}}> +
0.6 ? `0 0 90px ${theme.params}66` : 'none', + }} + > + 🧠 +
+
+ 变成肌肉记忆 · 跨任务跨用户 +
+
θ⁺ = Φ_M(θ, Z)
+
+
+ + ); +}; + +/** 2-J:工业现实——一边是真实循环,一边泼冷水 */ +const IndustryReality: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const enter = spring({frame, fps, config: {damping: 200}}); + return ( + +
+
+
+ 💻 + 编程工具厂商 +
+
+ {[0, 1, 2, 4, 6, 8].map((d) => ( +
+ ))} + 用户反馈流 +
+
+ 生产环境反馈 → 聚合成奖励信号 +
→ 频繁更新模型权重 +
+
+ Cursor 实时 RL(Jackson et al., 2026) +
+
+
+
🧊
+
+ 但论文泼了盆冷水: +
+ 部署后从 trace 训练模型, +
+ 公开证据还非常稀少。 +
+
+ 大部分自进化停在前三个去处 +
+
+
+ + ); +}; + +export const P2FourDestinations: React.FC<{scene: SceneRange}> = ({scene}) => { + const w = (fromId: string, toId?: string) => beatWindow(scene.sentences, scene.from, fromId, toId); + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx b/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx new file mode 100644 index 00000000..0bc9072b --- /dev/null +++ b/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx @@ -0,0 +1,361 @@ +import React from 'react'; +import { + AbsoluteFill, + Sequence, + interpolate, + spring, + useCurrentFrame, + useVideoConfig, +} from 'remotion'; +import {FadeUp, Pill} from '../components/cards'; +import {theme} from '../design/theme'; +import {beatWindow} from '../timing'; +import type {SceneRange} from '../types'; + +/** 3-A:三级阶梯 + 谁控制进化 */ +const Ladder: React.FC<{lit: number}> = ({lit}) => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const levels = [ + {name: '自己攒资产', icon: '🎒', desc: '边干活边攒技能与记忆'}, + {name: '学会怎么改进', icon: '🧭', desc: '失败 → 原则 → 下次引用'}, + {name: '专职进化部门', icon: '🏛️', desc: '独立的 meta 层管进化'}, + ]; + return ( + + +
谁来决定,经验往哪送?
+
+
+ {levels.map((l, i) => { + const h = 200 + i * 110; + const on = lit < 0 || i <= lit; + const enter = spring({frame: frame - i * 12, fps, config: {damping: 200}}); + return ( +
+
+
{l.icon}
+
+ 第 {i + 1} 级 · {l.name} +
+
{l.desc}
+
+
+ ); + })} +
+
+ ); +}; + +/** 3-B:第一级——卡片入背包 */ +const LevelOne: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const cards = ['技能卡', '记忆卡', '经验卡']; + return ( + +
+
🤖
+
+ {cards.map((c, i) => { + const enter = interpolate(frame, [10 + i * 14, 20 + i * 14], [0, 1], { + extrapolateRight: 'clamp', + extrapolateLeft: 'clamp', + }); + return ( +
+ 🎫 {c} +
+ ); + })} +
+
+ 🎒 +
+
+ +
进化是干活的副产品
+
+
+ ); +}; + +/** 3-C:第二级——失败提炼成原则 */ +const LevelTwo: React.FC = () => { + const frame = useCurrentFrame(); + const distill = interpolate(frame, [20, 50], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+
+
💥
+
+ 我上次为什么搞砸 +
+
+ 失败轨迹复盘 +
+
+
+
+
📜
+
+ 原则 #1 +
+
+ 存入库 · 下次直接引用 +
+
+
+ +
MetaEvo:原则化自我修正
+
+
+ ); +}; + +/** 3-D:第三级——员工冻结 + 图书管理员 */ +const LevelThree: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const score = spring({frame: frame - 30, fps, config: {damping: 200}}); + return ( + +
+
+
🤖
+
+ 干活的员工 +
+
+ 🔒 冻结 · 一个字不许改 +
+
+
+
+
🧑‍📚
+
+ 图书管理员 +
+
+ {['➕ 增', '✏️ 改', '➖ 删'].map((op) => ( + + {op} + + ))} +
+
+
+ {/* 成绩单 */} +
+ 📊 + + 每次改库,拿后面任务的成绩算绩效 + +
+ +
+ SkillOS:冻结 Executor + 独立 Curator +
+
+
+ ); +}; + +/** 3-E:自指套娃——改进流程改进自己 */ +const SelfReference: React.FC = () => { + const frame = useCurrentFrame(); + const depth = Math.min(4, 1 + Math.floor(frame / 16)); + return ( + +
+ {Array.from({length: depth}).map((_, i) => { + const scale = 1 - i * 0.18; + return ( +
+ 🛠️ + + 改进流程{depth > 1 && i < depth - 1 ? ' →' : ''} + +
+ ); + })} +
+ +
+ Hyperagents:连「怎么改进自己」的代码,也可以被改进 +
+
+
+ ); +}; + +/** 3-F:裁判与运动员一起变形 */ +const Paradox: React.FC = () => { + const frame = useCurrentFrame(); + const warp = Math.sin(frame * 0.05) * 14; + const darken = interpolate(frame, [40, 80], [0, 0.35], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+
+
🧑‍⚖️
+
裁判
+
+
+
+
🏃
+
运动员
+
+
+ + 两者一起变形 · 失去稳定参照系 + + +
+ 论文的措辞很诚实:当前最大的开放问题之一 +
+
+
+ ); +}; + +export const P3Meta: React.FC<{scene: SceneRange}> = ({scene}) => { + const w = (fromId: string, toId?: string) => beatWindow(scene.sentences, scene.from, fromId, toId); + return ( + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/media/experience-era-agents-video/video/src/scenes/P4Eval.tsx b/media/experience-era-agents-video/video/src/scenes/P4Eval.tsx new file mode 100644 index 00000000..448ae570 --- /dev/null +++ b/media/experience-era-agents-video/video/src/scenes/P4Eval.tsx @@ -0,0 +1,322 @@ +import React from 'react'; +import { + AbsoluteFill, + Sequence, + interpolate, + spring, + useCurrentFrame, + useVideoConfig, +} from 'remotion'; +import {FadeUp, Pill} from '../components/cards'; +import {theme} from '../design/theme'; +import {beatWindow} from '../timing'; +import type {SceneRange} from '../types'; + +/** 4-A:体检中心 + 刷分作弊 */ +const Checkup: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const inflate = interpolate(frame, [30, 60], [30, 96], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+
+
+
🏥
+
+ 进化体检中心 +
+
「系统说自己进化了」
+
+
+
+
练过的题册上的分数
+
+
+
+
+ {Math.round(inflate)} 分 +
+
80 ? 1 : 0.1})`, + border: `4px solid ${theme.danger}`, + borderRadius: 10, + color: theme.danger, + fontFamily: theme.sans, + fontWeight: 900, + fontSize: 30, + padding: '4px 14px', + }} + > + 刷分 ≠ 变强 +
+
+
+ + ); +}; + +/** 4-B:六条体检指标 */ +const SixTargets: React.FC = () => { + const frame = useCurrentFrame(); + const rows = [ + {icon: '🆕', zh: '新任务涨分', en: 'Held-out gain'}, + {icon: '🧠', zh: '老任务不忘', en: 'Backward retention'}, + {icon: '⏳', zh: '持续稳定', en: 'Longitudinal stability'}, + {icon: '💰', zh: '性价比', en: 'Improvement efficiency'}, + {icon: '🧩', zh: '路径归因', en: 'Path attribution'}, + {icon: '🛡️', zh: '安全不退化', en: 'Safety non-regression'}, + ]; + return ( + + +
+ 自我进化 · 六条硬指标 +
+
+
+ {rows.map((r, i) => { + const enter = interpolate(frame, [i * 8, i * 8 + 12], [0, 1], { + extrapolateRight: 'clamp', + extrapolateLeft: 'clamp', + }); + const stamp = interpolate(frame - i * 8, [6, 12], [1.5, 1], { + extrapolateLeft: 'clamp', + extrapolateRight: 'clamp', + }); + return ( +
0.9 ? theme.harness : theme.panelBorder}`, + opacity: enter, + transform: `scale(${enter > 0.9 ? stamp : 0.8})`, + minWidth: 560, + }} + > + {r.icon} + {r.zh} + {r.en} +
+ ); + })} +
+
+ ); +}; + +/** 4-C:同一 AI 跑两遍成绩差异 */ +const FlakyRuns: React.FC = () => { + const frame = useCurrentFrame(); + const runA = interpolate(frame, [10, 34], [0, 0.92], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + const runB = interpolate(frame, [30, 54], [0, 0.31], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+ {[ + {label: '第一次跑', v: runA, color: theme.ok}, + {label: '第二次跑', v: runB, color: theme.danger}, + ].map((r) => ( +
+
+
{r.label}
+
+ {Math.round(r.v * 100)} 分 +
+
+ ))} +
+ +
+ 一次考得好,可能只是运气好 +
+
+ tau-bench:repeated-run reliability ≪ single-run success +
+
+ + ); +}; + +/** 4-D:T0→T1→T2 纵向体检 */ +const Longitudinal: React.FC = () => { + const frame = useCurrentFrame(); + const points = [ + {t: 'T0', label: '改进前', color: theme.dim}, + {t: 'T1', label: '改进后', color: theme.harness}, + {t: 'T2', label: '过段时间', color: theme.exp}, + ]; + const lineGrow = interpolate(frame, [10, 70], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+ + + + {points.map((p, i) => { + const enter = spring({frame: frame - i * 18, fps: 30, config: {damping: 200}}); + return ( +
+
+ {p.t} +
+
{p.label}
+
🩺
+
+ ); + })} + {/* 旧题重考循环 */} + + 留着旧题 · 反复重考 + +
+ +
+ SIP-Bench:追着同一个进化的 AI 反复体检 +
+
+
+ ); +}; + +/** 4-E:题库腐烂 */ +const RotBench: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const decay = interpolate(frame, [20, 70], [1, 0.3], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+
+
📄
+
2024 年的考题
+
+ 模型都见过了 · 分数虚高 +
+
+
+ 🚚 +
+
+
🆕
+
持续换新的考题
+
+ SWE-bench-Live / SWE-rebench +
+
+
+ +
+ 连考题本身,都得持续换新 —— 不然分数会腐烂 +
+
+
+ ); +}; + +export const P4Eval: React.FC<{scene: SceneRange}> = ({scene}) => { + const w = (fromId: string, toId?: string) => beatWindow(scene.sentences, scene.from, fromId, toId); + return ( + + + + + + + + + + + + + + + + + + ); +}; diff --git a/media/experience-era-agents-video/video/src/scenes/P5Safety.tsx b/media/experience-era-agents-video/video/src/scenes/P5Safety.tsx new file mode 100644 index 00000000..7a4044cb --- /dev/null +++ b/media/experience-era-agents-video/video/src/scenes/P5Safety.tsx @@ -0,0 +1,442 @@ +import React from 'react'; +import { + AbsoluteFill, + Sequence, + interpolate, + spring, + useCurrentFrame, + useVideoConfig, +} from 'remotion'; +import {FadeUp, Pill} from '../components/cards'; +import {theme} from '../design/theme'; +import {beatWindow} from '../timing'; +import type {SceneRange} from '../types'; + +/** 5-A:移动靶 + 旧审计标签错位 */ +const MovingTarget: React.FC = () => { + const frame = useCurrentFrame(); + const drift = Math.sin(frame * 0.03) * 220; + const stampOld = interpolate(frame, [10, 22], [1.8, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+ {/* 靶子 */} +
+
+
+
+
+ {/* 旧审计标签——留在原地,靶子已漂走 */} +
+ 出厂审计 ✅ +
+ + 你审计的是昨天的它 + + + 今天它已经改过自己 + +
+ +
+ 安全:从「对齐快照」变成「治理过程」 +
+
+ + ); +}; + +/** 5-B:技能商店投毒(ClawHavoc) */ +const SkillStore: React.FC = () => { + const frame = useCurrentFrame(); + const scan = interpolate(frame, [16, 44], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + const items = Array.from({length: 24}); + return ( + + +
AI 技能市场
+
+
+ {items.map((_, i) => { + const isBad = i % 6 === 2; + const revealed = scan > (i % 12) / 14; + return ( +
+ {isBad && revealed ? '☠️' : '📦'} +
+ ); + })} +
+ +
+ ~1,200 个恶意技能 +
+
+ 窃取 API 密钥 · 加密钱包 · 浏览器凭证 +
+
+ ClawHavoc:攻击者根本不用攻破模型 —— 装个「技能」,AI 自己交出钥匙 +
+
+
+ ); +}; + +/** 5-C:记忆投毒——潜伏注入 */ +const MemoryPoison: React.FC = () => { + const frame = useCurrentFrame(); + const inject = interpolate(frame, [8, 26], [-500, 0], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + const resurface = [36, 60, 84].map((t) => + interpolate(frame, [t, t + 10], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}), + ); + return ( + +
+
+
6 ? 1 : 0, + }} + > + ⚠️ 一句被埋下的话 +
+ +
+ 一次对话 · 一次接触 +
+
+
+ {/* 记忆库书架 */} +
+
记忆库
+
+ {['经验', '偏好', '事实', '计划', '摘要', '教训'].map((t) => ( + + {t} + + ))} + {/* 被投毒的条目 */} + 24 ? 1 : 0, + boxShadow: `0 0 26px ${theme.danger}55`, + }} + > + ☠️ 那句话 + +
+
+ {/* 每次干活被翻出 */} +
+ {resurface.map((op, i) => ( +
+ 🔧 + + 第 {i + 1} 次干活又被翻出 +
+ ))} +
+
+ +
+ 严格安全约束下,仍超 90% 场景可被操纵 +
+
+ From Storage to Steering:一次注入 · 永久潜伏 +
+
+
+ ); +}; + +/** 5-D:反馈操纵——拧动评分仪表盘 */ +const FeedbackHack: React.FC = () => { + const frame = useCurrentFrame(); + const needle = interpolate(frame, [16, 40], [-80, 70], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + const swap = interpolate(frame, [42, 54], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+
+
30 ? theme.danger : theme.dim, + transformOrigin: 'bottom center', + transform: `translateY(-65px) rotate(${needle}deg)`, + }} + /> +
+ 「什么算进步」评分 +
+
+ {/* 坏改动贴绿标 */} +
+
🧾
+
+ 坏改动 +
+
0.5 ? theme.ok : theme.panelBorder}`, + color: swap > 0.5 ? theme.ok : theme.dim, + fontFamily: theme.sans, + fontSize: 24, + fontWeight: 700, + transform: `rotate(${swap * -6}deg)`, + }} + > + {swap > 0.5 ? '✓ 改进 · 已保留' : '? 待评分'} +
+
+
+ +
+ 不攻击 AI 本身 —— 污染「什么算进步」的评分 +
+
+ + ); +}; + +/** 5-E:四味药 */ +const FourRemedies: React.FC = () => { + const frame = useCurrentFrame(); + const rows = [ + {icon: '🛂', zh: '准入测试', en: 'Admission tests', desc: '新技能新记忆 · 先考试再上岗'}, + {icon: '🔒', zh: '最小权限', en: 'Least privilege', desc: '默认什么都不能碰 · 用啥申请啥'}, + {icon: '⏪', zh: '版本回滚', en: 'Versioning & rollback', desc: '改坏了 · 一键恢复上个认证版本'}, + {icon: '🔄', zh: '持续再认证', en: 'Continuous re-certification', desc: '安全检查不是一次性 · 是常态体检'}, + ]; + return ( + + +
药方 · 四味药
+
+
+ {rows.map((r, i) => { + const enter = interpolate(frame, [i * 10, i * 10 + 14], [0, 1], { + extrapolateRight: 'clamp', + extrapolateLeft: 'clamp', + }); + return ( +
0.9 ? theme.ok : theme.panelBorder}`, + opacity: enter, + transform: `translateX(${(1 - enter) * -60}px)`, + minWidth: 900, + }} + > + {r.icon} + {r.zh} + {r.desc} + {r.en} +
+ ); + })} +
+
+ ); +}; + +/** 5-F:AI-45° 双线爬坡 */ +const FortyFive: React.FC = () => { + const frame = useCurrentFrame(); + const climb = interpolate(frame, [10, 70], [0, 1], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + const diverge = interpolate(frame, [76, 100], [0, 40], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + + + {/* 安全线(青) */} + + {/* 能力线(金) */} + + + 能力 + + + 安全 + + {/* 分叉警示 */} + + ⚠ 拉开差距 = 系统性欠账 + + + +
AI-45° Law:能力涨多快,安全就得涨多快
+
+
+ ); +}; + +export const P5Safety: React.FC<{scene: SceneRange}> = ({scene}) => { + const w = (fromId: string, toId?: string) => beatWindow(scene.sentences, scene.from, fromId, toId); + return ( + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/media/experience-era-agents-video/video/src/scenes/P6Ending.tsx b/media/experience-era-agents-video/video/src/scenes/P6Ending.tsx new file mode 100644 index 00000000..dba88ce1 --- /dev/null +++ b/media/experience-era-agents-video/video/src/scenes/P6Ending.tsx @@ -0,0 +1,263 @@ +import React from 'react'; +import { + AbsoluteFill, + Sequence, + interpolate, + spring, + useCurrentFrame, + useVideoConfig, +} from 'remotion'; +import {FadeUp, QuoteCard} from '../components/cards'; +import {theme} from '../design/theme'; +import {beatWindow} from '../timing'; +import type {SceneRange} from '../types'; + +/** 6-A:星空开放问题 */ +const OpenQuestions: React.FC = () => { + const frame = useCurrentFrame(); + const qs = [ + {q: '新本事,还是本来就有的潜能?', icon: '🌱'}, + {q: '一直吃自己产的经验,会越吃越窄吗?', icon: '🌀'}, + {q: '图片视频经验,怎么压缩归档?', icon: '🖼️'}, + ]; + return ( + + {/* 星星 */} + {Array.from({length: 26}).map((_, i) => { + const tw = 0.4 + 0.6 * Math.abs(Math.sin(frame * 0.04 + i * 2.1)); + return ( +
+ ); + })} +
+ {qs.map((q, i) => { + const enter = spring({frame: frame - i * 14, fps: 30, config: {damping: 200}}); + return ( + +
+ {q.icon} + {q.q} + ? +
+
+ ); + })} +
+ + ); +}; + +/** 6-C:三块拼图 */ +const ThreePuzzles: React.FC = () => { + const frame = useCurrentFrame(); + const pieces = [ + {zh: '可靠的反馈', icon: '📡'}, + {zh: '安全的自我修改架构', icon: '🛡️'}, + {zh: '评测 = 持续体检', icon: '🩺'}, + ]; + return ( + + +
+ 这条路还缺的三块拼图 +
+
+
+ {pieces.map((p, i) => { + const drop = spring({frame: frame - i * 12, fps: 30, config: {damping: 14}}); + return ( +
0.95 ? theme.ok : theme.panelBorder}`, + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + gap: 16, + transform: `translateY(${(1 - drop) * -160}px) rotate(${(1 - drop) * 12}deg)`, + opacity: drop, + }} + > + {p.icon} + + {p.zh} + +
+ ); + })} +
+
+ ); +}; + +/** 6-D:系列呼应——上一集与本集并排 */ +const SeriesEcho: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const prev = spring({frame: frame - 6, fps, config: {damping: 200}}); + const curr = spring({frame: frame - 20, fps, config: {damping: 200}}); + return ( + +
+
+
+ + +
+
+ 上期:AI 如何自己变强? +
+
+ 改大脑,还是改装备? +
+ ——「改什么」 +
+
+
+
+
+ + + +
+
+ 本期:上线之后,AI 才开始上学 +
+
+ 上了班之后,经验怎么攒? +
+ ——「怎么攒」 +
+
+
+
+ ); +}; + +/** 6-E:论文引用卡 */ +const FinalCard: React.FC = () => { + const frame = useCurrentFrame(); + const {fps} = useVideoConfig(); + const enter = spring({frame, fps, config: {damping: 200}}); + const fade = interpolate(frame, [220, 260], [1, 0], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + return ( + +
+
88 页综述 · 2026-06
+
+ Self-Improving Agents in the Era of Experience: +
+ A Survey of Self- to Meta-Evolution +
+
+ C. Jiang, J. Zhong, Y. Fu, et al. · 清华大学 × Horizon Research (Frontis.AI) +
+
+ 📖 推荐读原文 +
+
+
+ ); +}; + +export const P6Ending: React.FC<{scene: SceneRange}> = ({scene}) => { + const w = (fromId: string, toId?: string) => beatWindow(scene.sentences, scene.from, fromId, toId); + return ( + + + + + + + + + + + + + + + + + + ); +}; diff --git a/media/experience-era-agents-video/video/src/timing.ts b/media/experience-era-agents-video/video/src/timing.ts new file mode 100644 index 00000000..8bf6f2a5 --- /dev/null +++ b/media/experience-era-agents-video/video/src/timing.ts @@ -0,0 +1,59 @@ +import type {ManifestItem, SceneRange, TimedSentence} from './types'; + +export const FPS = 30; +/** 句间停顿 */ +const SENTENCE_GAP_SEC = 0.32; +/** 幕间额外停顿(转场呼吸) */ +const SCENE_GAP_SEC = 0.9; +/** 片头静默引导 */ +const LEAD_IN_SEC = 0.6; +/** 片尾静默淡出 */ +const TAIL_SEC = 2.0; + +export function computeTimeline(manifest: ManifestItem[]): { + timed: TimedSentence[]; + scenes: SceneRange[]; + totalDurationInFrames: number; +} { + const timed: TimedSentence[] = []; + let cursor = Math.round(LEAD_IN_SEC * FPS); + for (let i = 0; i < manifest.length; i++) { + const item = manifest[i]; + const next = manifest[i + 1]; + const gap = next && next.scene !== item.scene ? SENTENCE_GAP_SEC + SCENE_GAP_SEC : SENTENCE_GAP_SEC; + const durationInFrames = Math.max(1, Math.round((item.durationSec + gap) * FPS)); + timed.push({...item, from: cursor, durationInFrames}); + cursor += durationInFrames; + } + + const scenes: SceneRange[] = []; + for (const s of timed) { + const last = scenes[scenes.length - 1]; + if (!last || last.scene !== s.scene) { + scenes.push({scene: s.scene, from: s.from, durationInFrames: s.durationInFrames, sentences: [s]}); + } else { + last.durationInFrames = s.from + s.durationInFrames - last.from; + last.sentences.push(s); + } + } + + return {timed, scenes, totalDurationInFrames: cursor + Math.round(TAIL_SEC * FPS)}; +} + +/** 场景内使用:取一段句 id 区间(含端点)的本地 Sequence 窗口 */ +export function beatWindow( + sceneSentences: TimedSentence[], + sceneFrom: number, + fromId: string, + toId?: string, +): {from: number; durationInFrames: number} { + const start = sceneSentences.find((s) => s.id === fromId); + const end = sceneSentences.find((s) => s.id === (toId ?? fromId)); + if (!start || !end) { + throw new Error(`beatWindow: 未找到句 id ${fromId}..${toId}`); + } + return { + from: start.from - sceneFrom, + durationInFrames: end.from + end.durationInFrames - start.from, + }; +} diff --git a/media/experience-era-agents-video/video/src/types.ts b/media/experience-era-agents-video/video/src/types.ts new file mode 100644 index 00000000..0207f4d1 --- /dev/null +++ b/media/experience-era-agents-video/video/src/types.ts @@ -0,0 +1,24 @@ +export type ManifestItem = { + /** 句 id,如 p2-15,对应 public/audio/{id}.mp3 */ + id: string; + /** 所属幕,如 P2 */ + scene: string; + /** 口播文本(同字幕) */ + text: string; + /** 该句音频实测时长(秒) */ + durationSec: number; +}; + +export type TimedSentence = ManifestItem & { + /** 全片时间轴上的起始帧 */ + from: number; + /** 含句间停顿的占用帧数 */ + durationInFrames: number; +}; + +export type SceneRange = { + scene: string; + from: number; + durationInFrames: number; + sentences: TimedSentence[]; +}; diff --git a/media/experience-era-agents-video/video/tsconfig.json b/media/experience-era-agents-video/video/tsconfig.json new file mode 100644 index 00000000..97f1b5e1 --- /dev/null +++ b/media/experience-era-agents-video/video/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "resolveJsonModule": true + }, + "include": ["src", "remotion.config.ts"] +} From e3616111f26bd98ad6ed60ae50c72c963b3cfd2b Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Mon, 17 Aug 2026 11:03:13 +0800 Subject: [PATCH 3/5] =?UTF-8?q?fix(video):=20=E4=BF=AE=E5=A4=8D=E3=80=8A?= =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E4=B9=8B=E5=90=8E=EF=BC=8CAI=20=E6=89=8D?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E4=B8=8A=E5=AD=A6=E3=80=8B=E4=BA=94=E5=A4=84?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E7=BC=BA=E9=99=B7;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 3-E 自指套娃:百分比定位量纲错配致整幕空白,改 px 居中; - 九处底部公式角标落入字幕条区域被 68% 黑底压暗,统一抬高至 bottom ≥ 150; - 1-F 快慢弧线:pathLength=1 与像素级 dasharray 量纲互相抵消致渐进动画失效,改用 mask 分离绘制进度与虚线样式; - 4-D 纵向时间线:删除多余 pathLength={1} 恢复虚线外观; - 6-E 片尾渐黑窗口 [220,260] 超出 beat 实际帧数被硬切,改为从末句实时长推导 endFrame 收进 beat 内。 全部修复经 Remotion still 全分辨率抽帧像素级验证。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- .../video/src/scenes/P1Anatomy.tsx | 40 +++++++++++++++---- .../video/src/scenes/P2FourDestinations.tsx | 2 +- .../video/src/scenes/P3Meta.tsx | 12 +++--- .../video/src/scenes/P4Eval.tsx | 3 +- .../video/src/scenes/P5Safety.tsx | 2 +- .../video/src/scenes/P6Ending.tsx | 17 ++++++-- 6 files changed, 54 insertions(+), 22 deletions(-) diff --git a/media/experience-era-agents-video/video/src/scenes/P1Anatomy.tsx b/media/experience-era-agents-video/video/src/scenes/P1Anatomy.tsx index d25e265e..fb7246c0 100644 --- a/media/experience-era-agents-video/video/src/scenes/P1Anatomy.tsx +++ b/media/experience-era-agents-video/video/src/scenes/P1Anatomy.tsx @@ -49,7 +49,7 @@ const FourParts: React.FC = () => {
); })} - +
A_t = ⟨ M, H, U, E ⟩
@@ -117,7 +117,7 @@ const HarnessZoom: React.FC = () => { ); })}
- + Harness = 经验基础设施
@@ -279,7 +279,7 @@ const Refinery: React.FC = () => {
- +
z_i = H(τ_i)
@@ -306,8 +306,34 @@ const TwoPaths: React.FC = () => { boxShadow: `0 0 40px ${theme.exp}`, }} /> - {/* 快路:上弧线到工位 */} + {/* 快路:上弧线到工位;慢路:下弧线到大脑。 + 渐进绘制用 mask(pathLength=1 归一化坐标),虚线样式保留在原 path 上—— + 两者须分离,否则 dash 量纲互相抵消(评审 #3) */} + + + + + + + + { strokeWidth={7} strokeDasharray="16 10" opacity={0.85} - pathLength={1} - strokeDashoffset={1 - fast} + mask="url(#twopaths-fast)" /> { strokeWidth={7} strokeDasharray="16 10" opacity={0.85} - pathLength={1} - strokeDashoffset={1 - slow} + mask="url(#twopaths-slow)" />
{ })}
- +
σ = ⟨ M, I, R, A ⟩ · SKILL.md 规范
diff --git a/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx b/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx index 0bc9072b..419e5bb6 100644 --- a/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx +++ b/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx @@ -156,7 +156,7 @@ const LevelTwo: React.FC = () => {
- +
MetaEvo:原则化自我修正
@@ -228,7 +228,7 @@ const LevelThree: React.FC = () => {
{ 每次改库,拿后面任务的成绩算绩效
- +
SkillOS:冻结 Executor + 独立 Curator
@@ -268,8 +268,8 @@ const SelfReference: React.FC = () => { key={i} style={{ position: 'absolute', - left: `${50 - (scale * 900) / 2}%`, - top: `${50 - (scale * 460) / 2}%`, + left: (900 - scale * 900) / 2, + top: (560 - scale * 460) / 2, width: scale * 900, height: scale * 460, borderRadius: 24, @@ -295,7 +295,7 @@ const SelfReference: React.FC = () => { ); })}
- +
Hyperagents:连「怎么改进自己」的代码,也可以被改进
diff --git a/media/experience-era-agents-video/video/src/scenes/P4Eval.tsx b/media/experience-era-agents-video/video/src/scenes/P4Eval.tsx index 448ae570..4a21cbd8 100644 --- a/media/experience-era-agents-video/video/src/scenes/P4Eval.tsx +++ b/media/experience-era-agents-video/video/src/scenes/P4Eval.tsx @@ -187,7 +187,6 @@ const Longitudinal: React.FC = () => { y2={200} stroke={theme.exp} strokeWidth={6} - pathLength={1} strokeDasharray="14 10" /> @@ -233,7 +232,7 @@ const Longitudinal: React.FC = () => { 留着旧题 · 反复重考
- +
SIP-Bench:追着同一个进化的 AI 反复体检
diff --git a/media/experience-era-agents-video/video/src/scenes/P5Safety.tsx b/media/experience-era-agents-video/video/src/scenes/P5Safety.tsx index 7a4044cb..49ffec19 100644 --- a/media/experience-era-agents-video/video/src/scenes/P5Safety.tsx +++ b/media/experience-era-agents-video/video/src/scenes/P5Safety.tsx @@ -405,7 +405,7 @@ const FortyFive: React.FC = () => { ⚠ 拉开差距 = 系统性欠账 - +
AI-45° Law:能力涨多快,安全就得涨多快
diff --git a/media/experience-era-agents-video/video/src/scenes/P6Ending.tsx b/media/experience-era-agents-video/video/src/scenes/P6Ending.tsx index dba88ce1..3bd0dbce 100644 --- a/media/experience-era-agents-video/video/src/scenes/P6Ending.tsx +++ b/media/experience-era-agents-video/video/src/scenes/P6Ending.tsx @@ -189,12 +189,13 @@ const SeriesEcho: React.FC = () => { ); }; -/** 6-E:论文引用卡 */ -const FinalCard: React.FC = () => { +/** 6-E:论文引用卡(fade-out 窗口收在本 beat 末帧内,避免渐黑被 Sequence 截断硬切) */ +const FinalCard: React.FC<{endFrame: number}> = ({endFrame}) => { const frame = useCurrentFrame(); const {fps} = useVideoConfig(); const enter = spring({frame, fps, config: {damping: 200}}); - const fade = interpolate(frame, [220, 260], [1, 0], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); + const fadeStart = Math.max(0, endFrame - 50); + const fade = interpolate(frame, [fadeStart, endFrame], [1, 0], {extrapolateRight: 'clamp', extrapolateLeft: 'clamp'}); return (
{ export const P6Ending: React.FC<{scene: SceneRange}> = ({scene}) => { const w = (fromId: string, toId?: string) => beatWindow(scene.sentences, scene.from, fromId, toId); + /** 某句在本 Sequence 内的结束帧(局部坐标),供结尾渐黑对齐 beat 实际时长 */ + const endFrame = (id: string) => { + const s = scene.sentences.find((x) => x.id === id); + if (!s) { + throw new Error(`endFrame: 未找到句 id ${id}`); + } + return s.from + s.durationInFrames - scene.from; + }; return ( @@ -256,7 +265,7 @@ export const P6Ending: React.FC<{scene: SceneRange}> = ({scene}) => { - + ); From cd51c61ccc6e279fc64c3c2fd3c30bea652384aa Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Mon, 17 Aug 2026 11:03:20 +0800 Subject: [PATCH 4/5] =?UTF-8?q?chore(video-pipeline):=20=E6=B8=85=E7=90=86?= =?UTF-8?q?=E4=B8=A4=E5=A4=84=20build=5Fnarration=20=E8=96=84=E5=8C=85?= =?UTF-8?q?=E8=A3=85=E7=9A=84=20runpy=20=E6=AD=BB=E5=AF=BC=E5=85=A5;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- media/experience-era-agents-video/scripts/build_narration.py | 1 - media/self-improving-agents-video/scripts/build_narration.py | 1 - 2 files changed, 2 deletions(-) diff --git a/media/experience-era-agents-video/scripts/build_narration.py b/media/experience-era-agents-video/scripts/build_narration.py index c543cf73..8f853c6b 100644 --- a/media/experience-era-agents-video/scripts/build_narration.py +++ b/media/experience-era-agents-video/scripts/build_narration.py @@ -7,7 +7,6 @@ from __future__ import annotations -import runpy import subprocess import sys from pathlib import Path diff --git a/media/self-improving-agents-video/scripts/build_narration.py b/media/self-improving-agents-video/scripts/build_narration.py index c543cf73..8f853c6b 100644 --- a/media/self-improving-agents-video/scripts/build_narration.py +++ b/media/self-improving-agents-video/scripts/build_narration.py @@ -7,7 +7,6 @@ from __future__ import annotations -import runpy import subprocess import sys from pathlib import Path From 77b6891571bdbffa99461ef308ee5dedb70ca3fc Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Mon, 17 Aug 2026 11:58:24 +0800 Subject: [PATCH 5/5] =?UTF-8?q?fix(video):=20=E5=A4=84=E7=90=86=E3=80=8A?= =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E4=B9=8B=E5=90=8E=EF=BC=8CAI=20=E6=89=8D?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E4=B8=8A=E5=AD=A6=E3=80=8B=E5=85=AD=E6=9D=A1?= =?UTF-8?q?=E8=AF=84=E5=AE=A1=E6=84=8F=E8=A7=81;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 开屏英文引语换为 Silver & Sutton 原文逐字句(摘要句), 并在 paper-notes.md 补录 Era of Experience 原文锚点; - p5-19 口播计数断档改为「更阴的还有一招」, 重生成 narration.json 并增量重合成该句 TTS; - storyboard.md 与场景实现对齐:2-D 并入 2-C(p2-07..12)、 后续镜号顺移,P5 插入 5-A2 引子行、5-B 改 p5-08..12, 同步代码 Sequence 名称; - 金句卡 ASCII 直引号改直角引号「」; - 删除模板遗留死代码(ChapterCard 组件、 FourDestinationsPreview.highlight、Ladder.lit); - pipeline/README.md 脚手架清单 git cp 改为 cp -r。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- .../research/paper-notes.md | 2 +- .../script/narration.json | 2 +- .../script/narration.md | 2 +- .../script/storyboard.md | 10 ++--- .../video/src/components/cards.tsx | 39 ------------------- .../video/src/scenes/P0Hook.tsx | 4 +- .../video/src/scenes/P1Anatomy.tsx | 7 ++-- .../video/src/scenes/P2FourDestinations.tsx | 12 +++--- .../video/src/scenes/P3Meta.tsx | 12 +++--- media/pipeline/README.md | 2 +- 10 files changed, 25 insertions(+), 67 deletions(-) diff --git a/media/experience-era-agents-video/research/paper-notes.md b/media/experience-era-agents-video/research/paper-notes.md index dc1e4bd4..c186be0b 100644 --- a/media/experience-era-agents-video/research/paper-notes.md +++ b/media/experience-era-agents-video/research/paper-notes.md @@ -47,7 +47,7 @@ - **Agentic Harness Engineering(Lin et al., 2026b)**:把工具、中间件、技能、记忆、子智能体配置当作可编辑、可观察、可验证的演化目标。 **概念源头** -- **Era of Experience(Silver and Sutton, 2025)**:未来进步日益来自智能体与环境交互产生的经验、接地奖励与长程后果。 +- **Era of Experience(Silver and Sutton, 2025)**:未来进步日益来自智能体与环境交互产生的经验、接地奖励与长程后果。摘要逐字句:"A new generation of agents will acquire superhuman capabilities by learning predominantly from experience."(*Welcome to the Era of Experience*,*Designing an Intelligence* 章节预印本);正文论据句:"This can be achieved by allowing agents to learn continually from their own experience, i.e., data that is generated by the agent interacting with its environment. AI is at the cusp of a new period in which experience will become the dominant medium of improvement and ultimately dwarf the scale of human data used in today's systems." - **经典智能体五属性(Russell and Norvig, 2020)**:自主控制、环境感知、长时间运行、适应变化、目标导向。 **§2.4 相关综述(均入 Table 1,正文亦有讨论)** diff --git a/media/experience-era-agents-video/script/narration.json b/media/experience-era-agents-video/script/narration.json index 75ed3044..ab5d4c16 100644 --- a/media/experience-era-agents-video/script/narration.json +++ b/media/experience-era-agents-video/script/narration.json @@ -737,7 +737,7 @@ { "id": "p5-19", "scene": "P5", - "text": "更阴的是第四招:操纵反馈。" + "text": "更阴的还有一招:操纵反馈。" }, { "id": "p5-20", diff --git a/media/experience-era-agents-video/script/narration.md b/media/experience-era-agents-video/script/narration.md index 26cd3ede..52d72806 100644 --- a/media/experience-era-agents-video/script/narration.md +++ b/media/experience-era-agents-video/script/narration.md @@ -273,7 +273,7 @@ > 角标:From Storage to Steering:>90% 场景可被记忆操纵攻破 -- [p5-19] 更阴的是第四招:操纵反馈。 +- [p5-19] 更阴的还有一招:操纵反馈。 - [p5-20] 不直接攻击 AI,而是污染「什么算进步」的评分。 - [p5-21] 让坏改动看起来像好改进,被系统开心地保留下来。 - [p5-22] 论文开出的药方,本质上就四味药: diff --git a/media/experience-era-agents-video/script/storyboard.md b/media/experience-era-agents-video/script/storyboard.md index 07b78a2b..37b34263 100644 --- a/media/experience-era-agents-video/script/storyboard.md +++ b/media/experience-era-agents-video/script/storyboard.md @@ -33,10 +33,9 @@ |---|---|---|---| | 2-A 四管道总图 | p2-01..02 | 金色经验流从中央分四路:①技能库(青)②记忆(青)③环境(青)④大脑(紫) | 管道生长 + 标签弹出 | | 2-B 技能抽屉 | p2-03..06 | 技能抽屉拉开:标准化文件夹(封面 M/正文 I/资料 R/附件 A 四分区);角标 σ=⟨M,I,R,A⟩ | 抽屉滑出 + 文件夹展开 | -| 2-C 生命周期 | p2-07..10 | 三段环:创建(多来源图标汇入)→使用(放大镜检索+齿轮组合)→进化(红笔批注);检索缺口:大库里好技能藏角落发光但无人取 | 环形流转 | -| 2-D 负面证据 | p2-11..12 | 失败记录(红色 ✗ 卡片)被拣出,转化为指向技能库具体位置的红箭头 | 卡片拣选 + 箭头定位 | -| 2-E 验证门 | p2-13..18 | 改动队列过「验证」闸机;数字面板:+16.2pp 大字(绿)与 16/84 负迁移(红)并排;角标 SkillsBench | 闸机放行/弹回 + 数字面板翻牌 | -| 2-F 记忆五动作 | p2-19..26 | 笔记本中央;五个印章依次盖下:记/压/并/取/改(各配小图标:笔/压缩器/合并箭头/放大镜/橡皮);角标五操作英文 | 盖章 + 小动画 | +| 2-C 生命周期 | p2-07..12 | 三段环:创建(多来源图标汇入)→使用(放大镜检索+齿轮组合)→进化(红笔批注;失败记录转化为指向技能库具体位置的红箭头);检索缺口:大库里好技能藏角落发光但无人取 | 环形流转 | +| 2-D 验证门 | p2-13..18 | 改动队列过「验证」闸机;数字面板:+16.2pp 大字(绿)与 16/84 负迁移(红)并排;角标 SkillsBench | 闸机放行/弹回 + 数字面板翻牌 | +| 2-E 记忆五动作 | p2-19..26 | 笔记本中央;五个印章依次盖下:记/压/并/取/改(各配小图标:笔/压缩器/合并箭头/放大镜/橡皮);角标五操作英文 | 盖章 + 小动画 | | 2-G 记忆三层 | p2-27..30 | 三层嵌套框:内容→机制→策略逐层放大;旁边天平:记太多 vs 记太少;陈旧记忆卡片褪色带偏后续判断线 | 嵌套展开 + 天平摆动 | | 2-H 环境三层楼 | p2-31..37 | 电梯楼图:一楼「可执行」(终端图标)二楼「协议化」(插头图标)三楼「可学习」(信号塔图标);大量环境卡在一楼半(电梯停在 1.5 层闪烁);角标 J*(E) 天花板线 | 电梯上行 + 天花板虚线 | | 2-I 参数巩固 | p2-38..41 | 紫色通路:工位上验证过的套路(绿色 ✓ 卡片堆)→ 蒸馏漏斗 → 沉入大脑;跨任务跨用户图标四散带光;角标 θ⁺=Φ_M(θ,Z) | 卡片汇聚 + 沉降 | @@ -68,7 +67,8 @@ | 镜 | 句区间 | 画面 | 动效 | |---|---|---|---| | 5-A 移动靶 | p5-01..05 | 射击场:靶子自己在漂移;「出厂审计✓」标签贴在旧靶上,新靶已变形;角标「对齐快照→治理过程」 | 靶漂移 + 标签错位 | -| 5-B 技能投毒 | p5-06..12 | 应用商店货架:商品图标整齐排列;红光扫过,近 1200 个商品翻转露出「恶意」面(钥匙/钱包图标被抽走);角标 ClawHavoc | 红扫 + 商品翻转 | +| 5-A2 引子 | p5-06..07 | 移动靶画面延续;引出「移动攻击面」与两个例子 | 画面延续 | +| 5-B 技能投毒 | p5-08..12 | 应用商店货架:商品图标整齐排列;红光扫过,近 1200 个商品翻转露出「恶意」面(钥匙/钱包图标被抽走);角标 ClawHavoc | 红扫 + 商品翻转 | | 5-C 记忆投毒 | p5-13..18 | 夜景:一句红色文本飘入记忆库藏书架;之后每次干活(日轮转)都被翻出注入;十扇门中九扇从记忆侧被打开的示意;角标 >90% | 潜伏注入 + 门开动画 | | 5-D 反馈操纵 | p5-19..21 | 评分仪表盘被黑手拧动指针:坏改动(红卡)被贴上「改进✓」绿标保留 | 指针拧动 + 标签偷换 | | 5-E 四味药 | p5-22..26 | 药方列表逐条亮起:准入测试/最小权限/版本回滚/持续再认证(各配小图标:闸门/锁/回滚箭头/循环听诊器);角标英文四原语 | 列表逐项点亮 | diff --git a/media/experience-era-agents-video/video/src/components/cards.tsx b/media/experience-era-agents-video/video/src/components/cards.tsx index 9c5fb19a..b1f76e30 100644 --- a/media/experience-era-agents-video/video/src/components/cards.tsx +++ b/media/experience-era-agents-video/video/src/components/cards.tsx @@ -58,45 +58,6 @@ export const QuoteCard: React.FC<{ ); }; -/** 章节卡:大标题 + 通路色光带 */ -export const ChapterCard: React.FC<{ - kicker: string; - title: string; - accent: string; -}> = ({kicker, title, accent}) => { - const frame = useCurrentFrame(); - const {fps} = useVideoConfig(); - const enter = spring({frame, fps, config: {damping: 200}}); - const sweep = interpolate(frame, [0, 25], [0, 100], {extrapolateRight: 'clamp'}); - return ( - -
-
{kicker}
-
- {title} -
-
-
- - ); -}; - /** 简单淡入上移容器 */ export const FadeUp: React.FC<{delay?: number; children: React.ReactNode; style?: React.CSSProperties}> = ({ delay = 0, diff --git a/media/experience-era-agents-video/video/src/scenes/P0Hook.tsx b/media/experience-era-agents-video/video/src/scenes/P0Hook.tsx index 378aca30..e9655626 100644 --- a/media/experience-era-agents-video/video/src/scenes/P0Hook.tsx +++ b/media/experience-era-agents-video/video/src/scenes/P0Hook.tsx @@ -15,7 +15,7 @@ import type {SceneRange} from '../types'; /** 0-A:经验时代宣言打字机金句卡 */ const Manifesto: React.FC = () => { const frame = useCurrentFrame(); - const zh = '"AI 的下一个时代,叫经验时代。"'; + const zh = '「AI 的下一个时代,叫经验时代。」'; const shown = Math.min(zh.length, Math.floor(frame / 2.2)); return ( @@ -47,7 +47,7 @@ const Manifesto: React.FC = () => { opacity: interpolate(frame, [60, 90], [0, 1], {extrapolateRight: 'clamp'}), }} > - "Progress will come from experience generated as agents interact with their environments." + "A new generation of agents will acquire superhuman capabilities by learning predominantly from experience."
= ({scene}) => { }; /** 1-H / 2-A 共用:四管道总图 */ -export const FourDestinationsPreview: React.FC<{highlight?: number}> = ({highlight = -1}) => { +export const FourDestinationsPreview: React.FC = () => { const frame = useCurrentFrame(); const {fps} = useVideoConfig(); const dests = [ @@ -504,7 +504,6 @@ export const FourDestinationsPreview: React.FC<{highlight?: number}> = ({highlig
{dests.map((d, i) => { const enter = spring({frame: frame - 6 - i * 5, fps, config: {damping: 200}}); - const lit = highlight < 0 || highlight === i; return (
= ({highlig flexDirection: 'column', alignItems: 'center', gap: 14, - opacity: enter * (lit ? 1 : 0.25), + opacity: enter, transform: `translateY(${(1 - enter) * 30}px)`, }} > @@ -526,7 +525,7 @@ export const FourDestinationsPreview: React.FC<{highlight?: number}> = ({highlig color: d.color, padding: '6px 22px', borderRadius: 12, - border: `2px solid ${lit ? d.color : theme.panelBorder}`, + border: `2px solid ${d.color}`, }} > {d.label} diff --git a/media/experience-era-agents-video/video/src/scenes/P2FourDestinations.tsx b/media/experience-era-agents-video/video/src/scenes/P2FourDestinations.tsx index 776023a3..21b99abd 100644 --- a/media/experience-era-agents-video/video/src/scenes/P2FourDestinations.tsx +++ b/media/experience-era-agents-video/video/src/scenes/P2FourDestinations.tsx @@ -588,22 +588,22 @@ export const P2FourDestinations: React.FC<{scene: SceneRange}> = ({scene}) => { - + - + - + - + - + - + diff --git a/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx b/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx index 419e5bb6..a755f961 100644 --- a/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx +++ b/media/experience-era-agents-video/video/src/scenes/P3Meta.tsx @@ -13,7 +13,7 @@ import {beatWindow} from '../timing'; import type {SceneRange} from '../types'; /** 3-A:三级阶梯 + 谁控制进化 */ -const Ladder: React.FC<{lit: number}> = ({lit}) => { +const Ladder: React.FC = () => { const frame = useCurrentFrame(); const {fps} = useVideoConfig(); const levels = [ @@ -29,7 +29,6 @@ const Ladder: React.FC<{lit: number}> = ({lit}) => {
{levels.map((l, i) => { const h = 200 + i * 110; - const on = lit < 0 || i <= lit; const enter = spring({frame: frame - i * 12, fps, config: {damping: 200}}); return (
@@ -38,8 +37,8 @@ const Ladder: React.FC<{lit: number}> = ({lit}) => { width: 340, height: h, borderRadius: '18px 18px 0 0', - background: on ? theme.panel : '#10141a', - border: `3px solid ${on ? (i === 2 ? theme.exp : theme.harness) : theme.panelBorder}`, + background: theme.panel, + border: `3px solid ${i === 2 ? theme.exp : theme.harness}`, borderTopWidth: 6, display: 'flex', flexDirection: 'column', @@ -47,11 +46,10 @@ const Ladder: React.FC<{lit: number}> = ({lit}) => { alignItems: 'center', paddingTop: 28, gap: 12, - opacity: on ? 1 : 0.45, }} >
{l.icon}
-
+
第 {i + 1} 级 · {l.name}
{l.desc}
@@ -339,7 +337,7 @@ export const P3Meta: React.FC<{scene: SceneRange}> = ({scene}) => { return ( - + diff --git a/media/pipeline/README.md b/media/pipeline/README.md index ba1564d0..17cbdb15 100644 --- a/media/pipeline/README.md +++ b/media/pipeline/README.md @@ -73,7 +73,7 @@ media/-video/ ## 六、新集脚手架清单 -1. `git cp` 上一集工程目录骨架(README/research/script/scripts/video),改 slug 与内容。 +1. `cp -r` 上一集工程目录骨架(README/research/script/scripts/video),改 slug 与内容。 2. `video/package.json` 改 `name`;清空 scenes 重建;`theme.ts` 换本集色板。 3. 根 `.gitignore` 追加本集产物规则(**不能放工程内**——根级裸 `.gitignore` 规则会挡住嵌套 ignore 文件): ```