[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C42T6SW4BVEJS5E5YXN3QK":3,"skill-same:01M6C42T6SW4BVEJS5E5YXN3QK":109},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":52,"ownerHtmlUrl":53,"ownerBlogUrl":54,"ownerDescription":55,"updatedAt":56,"install":57,"resources":70},"01M6C42T6SW4BVEJS5E5YXN3QK","dsh-session-upgrade",null,"CLAT 跟随 DSH（deepseek-harness）版本升级的操作手册——会话格式代际（v2→v3→…）、词汇、网关 wire、锁协议的对齐全流程。Use whenever DSH releases a new version or changes its session journal\u002Fformat\u002Fgateway\u002Fwire surface, when CLAT fails to read DSH-produced sessions, when planning an alignment task wave, or when implementing a session-format migration (\u002Fupdate-style upgrade).","artec\u002Fclat","artec","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F118569?v=4","01M6C42Q04Z8EBB0YYH93Q0DXE","Artec","01M6C42Q4BJ5BB9565XTKVCC33",6,"MIT","https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdsh-session-upgrade\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"dsh","session","upgrade","dsh session upgrade","new","sessions","when","changes","implementing","journal","v3","deepseek","task","alignment","clat","version","use","read","format","gateway","harness","planning","update","2026-11-10 10:12:30",false,"---\nname: dsh-session-upgrade\ndescription: CLAT 跟随 DSH（deepseek-harness）版本升级的操作手册——会话格式代际（v2→v3→…）、词汇、网关 wire、锁协议的对齐全流程。Use whenever DSH releases a new version or changes its session journal\u002Fformat\u002Fgateway\u002Fwire surface, when CLAT fails to read DSH-produced sessions, when planning an alignment task wave, or when implementing a session-format migration (\u002Fupdate-style upgrade).\n---\n\n# DSH 版本对齐与会话格式升级手册\n\n本手册源自 CLAT 第十一轮 DSH 0.1.3 对齐实战（2026-09，DV-1..11，\n12 份审计）与 0.1.5 预研。完整案例见 `references\u002Fcase-study-round-11.md`\n（v0→v2 剧本）与 `references\u002Fcase-study-round-12-v3.md`（V3 对齐 +\nensure-current），V4 的裁决与 oracle 见\n`references\u002Fcase-study-v4.md`；两仓源码地图见 `references\u002Frepo-map.md`。按阶段执行，勿跳步。\n\n## 第 0 阶段：版本事实核查（动手前必做）\n\n1. **钉靶**：DSH 平行目录 checkout 到新 tag\u002Fcommit，记录哈希。\n   所有调研结论标注钉靶。\n2. **查 npm dist-tags，不要只看 GitHub**——DSH 的 alpha 只发\n   `alpha` tag，`latest` 可能落后多代；\"用户实际拿到的版本\"以\n   dist-tags 为准（2026-09-10 教训：GitHub 已 0.1.5，latest 仍\n   0.1.2-rc.1，对齐时机由此定）。\n3. **四个面分别核对，不要混为一谈**：\n   - **会话格式**：`packages\u002Fsession\u002Fsession-format*\u002F` 的\n     `currentVersion`（每代一格的迁移链）；世代文件是**全量整档**\n     （whole-generation publication），无尾部段文件；\n   - **词汇**：新 durable 事件类型（required-on-read 一律要收编）；\n   - **网关 wire**：`packages\u002Fapi\u002Fgateway\u002F`（信封\u002F方法\u002F帧形状）；\n   - **锁协议**：`session-persistence-jsonl\u002Fsrc\u002Flease.ts`。\n   每个面独立 diff、独立下结论——格式红了不代表 wire 变了。\n\n## 第 1 阶段：三遍研究法（负责人定的方法论）\n\n1. **第一遍 差异对表**：旧调研档案 vs 新版源码，逐文件 diff；\n2. **第二遍 自我纠偏**：核对第一遍产出——凡\"没亲眼核实的断言\"\n   必错率高（历史病例：端点分隔符、末 seq 等式、压缩模型三处\n   全错，均为转述未实证）；\n3. **第三遍 全新初读**：抛开旧档案，直接读新版文档+源码形成\n   平台图，再回头看旧结论哪些过期。\n每遍产出独立文档，错误以带日期勘误形式留档，不删原文。\n\n## 第 2 阶段：任务分解（波次，按依赖序）\n\n- **词汇先行**：新事件类型必须最先收编（catalog 座位表一行+\n  金样）——准入层 fail-closed，不收编则新日志整个拒载，阻塞\n  所有后续验证。词汇竞争已发生 5 次（model\u002Fselection、team\u002F*、\n  feedback\u002F*、system\u002Fmessage、ptc 改名双座位），是每次版本升级\n  的固定税。\n- **词表是有世代窗口的**（V3 批新增形状）：类型有出生代与退役代\n  （如 `system\u002Fmessage` 从 v3 起、旧 PTC 名被 v3 退役）。座位表旁\n  落两张窗口表：越代类型走 unknown 通道（ignorable 信封级放行、\n  required 拒），退役代 required 拒 \u002F ignorable 不透明——与上游\n  per-generation known-event-types 对表，不做成单一布尔。**出生代须\n  查上游冻结的源代和目标代词表**；“CLAT 首次收编”不等于“上游\n  此代新增”（V4 的两个 envelope-only 事件实际已在 V3 词表）。\n- 独立易项并行一波；主战役（格式读写）单列；迁移\u002F升级（如有）\n  依赖格式读写完成后收尾。**版本常量 bump 与迁移边必须同批落地**\n  （V3 教训：写侧已是 v3、转换器还产 v2 → 文件名与头版本自相矛盾）。\n- CLAT 侧改动全部走 catalog 座位表（见 AGENTS.md 词汇唯一家），\n  不得新开字符串 match 臂。\n\n## 第 3 阶段：实施纪律\n\n- **不变量先行**：动持久状态前写下不变量，审计每个读者和每个\n  写者（宪法 State discipline 全文适用）。\n- **字节级金样**是安全网：对齐过程中金样零变更是行为保持的\n  证据；新格式的金样按 DSH 真实产物铸造（原语级生成脚本）。\n  生成脚本应钉上游 revision，并固定非语义随机量（如消息 ID、\n  时间）；连续重生两次比对字节哈希，避免不可复现的 golden。\n- **fixture 铸造脚本随上游版本重验**（V3 教训）：上一代能跑的\n  生成脚本会在新代失效——rc.2 把 SessionStore 与\n  JsonlSessionPersistence 解耦（B8 剧本的 persistence.load 消失）、\n  持久化插件改 default export、store 逻辑头缺\n  `delegationDepth`（released 头校验要求在位）。先小探针验证\n  API 面，再写生成器；`node:zlib` 一次只解一个 zstd 帧（两帧\n  布局要自己拆）。\n- **写侧必须满足自家准入（canonical 对称）**：准入层先行的\n  严格规则（如空可选字段必须缺省），写侧要在同一处规则家落地\n  （V3 的 `persisted_request_header`）——\"写出的日志自己的\n  admission 要认\" 是判别测试，ignored 测试面抓到过真实违反。\n- **value 搬家时，所有比较必须迁到新家同形**：V3 把 system 从\n  header 搬进消息流，header 去重比较两侧若一侧已剥一侧未剥，\n  每 run 假 \"change\"。定义\"持久形\"唯一规则函数，写入与比较\n  都走它。\n- **`--ignored` 测试面是门禁的一部分**：跨读产物测试、私有源\n  演练等 ignored 测试在全量门禁才跑，且专抓写侧\u002F准入不对称\n  的真 bug（V3 批的空 tools 违规就是它抓到的）。交付前必须\n  让它们也绿。\n- **真实互锁测试**：`DSH_CHECKOUT=\u003C钉靶路径>` 跑 write_lease\n  互锁。其他包若有独立钉靶 cohort（如 DSH 适配器），按其自身\n  版本单独验收；不要把新 `DSH_CHECKOUT` 全局灌给旧 cohort。\n- **预言机重钉**决策：compat oracle 是否推进到新靶由负责人定。\n- **zstd 物理事实**：会话是单一顺序压缩流——尾部读取也要从头\n  解压，**不存在也不需要反向读**（0.1.3 调研定案，勿再发明）。\n- **形状预算适用于迁移代码**：转换器容易写成百行大函数——\n  用状态机\u002F按家族拆分（V3 的 `Migration::push_source`），\n  `code-health.py` 长函数数不得超基点。\n\n## 第 4 阶段：会话格式代际迁移（\u002Fupdate = ensure-current）\n\n当需要把低于当前代的会话升到 `SESSION_FORMAT_VERSION` 时，执行\n`references\u002Fcase-study-round-11.md` 的完整剧本，其七条不变量不可裁剪。\n要点速记：\n\n- **ensure-current 语义（2026-09-13，V3 批确立）**：`\u002Fupdate` 不是\n  \"vN→vN+1\" 单边命令，而是\"升到 `SESSION_FORMAT_VERSION` 常量\"——\n  一切低于当前代的会话（v0、存量 v2，将来 v3）经**内存迁移链**逐边\n  接力，但**只在全链成功后发布唯一最终世代**；任何一边拒绝 = 零发布、\n  源字节不动、目录零中间世代残留（DSH \"only the exact source and final\n  current generation\" 规则照抄）。命令对已当前代幂等（no-op）。\n- 退役代（如 v1）显式拒绝并指路 \u002Fnew，绝不静默收下或跳过。\n- 旧代**只读打开**（错误信息指路 \u002Fupdate 或 \u002Fnew），普通路径\n  零副作用：不补 end-seed、不修复、不写 checkpoint、不建 writer；\n- **当前代也可能只读**：若新语义可读却不能由 CLAT 保真续写\n  （V4 `developer\u002Fmessage`、非空 `agentPreset` 是实例），在运行和\n  工具副作用前拒写；不要向用户提供会改写当前代的 `\u002Fupdate`。\n  读侧收编事件不等于授权生产该事件；当前代只读打开也不得留下\n  写租约等 artifact。若为此先扫描再取得写租约，取得后须复验\n  源 revision，避免扫描与写入间的竞态。\n- **bump 会制造\"新的旧代\"（2026-09-15 缺陷入册）**：常量每进一代，\n  上一代就从\"可写\"翻成\"可解码但不可写\"。按版本号路由读写状态的\n  地方（协调器只读分支、写路门槛、命令可见性）一律用**\"凡低于\n  `SESSION_FORMAT_VERSION`\"**表达，禁止写死具体版本号——只读分支\n  写死 `== 0` 的债在 V3 bump 后爆雷：v2 打不开、\u002Fupdate 又只在\n  legacy 会话内可达，\"打不开就没法 update\"死锁（合并后实机发现）。\n- **结构性改名会从宿主的\"事件服务面\"漏进客户端 wire 缝（2026-09-15\n  缺陷入册）**：新代的信封\u002F字段改名不只存在于 journal 文件——宿主的\n  `session\u002Fpage`、live `session\u002Fevent` 把各代事件**原样**发给客户端，\n  且不带世代标签。任何把 journal 事件当 wire 载荷消费的客户端\n  （`clat dsh`、将来桌面端）都要在解析缝做**形状驱动**的信封规范化\n  （V3 `startSeq`\u002F`endSeq` → 逻辑 `start`\u002F`end`）。一条解析失败 =\n  整页历史被拒 → 转录只剩暂存 live 帧（\"打开会话只见最后一条\"）。\n- 迁移 = 租约内读 → **纯转换器** → 发布前**字节往返验证** →\n  源 revision 复验 → **no-overwrite 原子发布** → 目录 fsync →\n  **重武装**（世代重排由整体重建吸收，不做水位算术；投影永远由\n  当前代全量扫描重建，缓存行不得绕过改变基数的迁移）；\n- **原件永久保留**，永不删；\n- 无损映射不了的输入明确拒绝，不静默造\"兼容\"数据；上游冻结边\n  保真的字段（turn\u002Fstep、ids、时间、交付坐标）逐字保留——保留规则\n  例外必须写成文档化 deviation（见 V3 案例研究的 step 基裁决）。\n\n### 迁移边施工要点（V2→V3 实战沉淀）\n\n- **上游 oracle 对拍是最强判别**：用与上游迁移器测试同款方法铸造\n  一份源（同 header id、同时间锚点），分别喂上游迁移器与本地转换\n  器，**逐事件等价**（含合成 id 的 SHA-256 材料）。金样即对拍基准。\n- **旧代真实日志可能不被新边接受**：0.1.3 真 V2 日志的头在\n  step\u002Fstart 之前，rc.2 迁移器按规格拒绝（提示词变化在开放 step\n  外）。拒绝类要**复刻并钉判别测试**；上游自己的测试铸造法\n  （migration.spec.ts 的合成源）是金样源的合法替代。\n- **bump 批次的必备判别腿（2026-09-15 补）**：经协调器**真实 resume\n  路径**（不是 upgrade 自读）只读打开一个**上一发布代**会话——成功、\n  零副作用（源字节不动、无锁\u002F检查点\u002Fseed\u002Fwriter 残留）、写面拒绝\n  指路 \u002Fupdate、\u002Fupdate 后同一会话当场可写。ensure-current\u002F金样\u002F\n  准入测试全绿不覆盖这条腿（V3 批漏网实录）。\n- **重映射只做同名工件引用表**（surface 信封\u002FsourceEventSeqs\u002F\n  command.done\u002Fcompaction Range+Seqs\u002Ftitle messageSeqs），其余一律\n  保真；单遍走日志即可——引用只指向前方，走到时映射必已建立，\n  无需两遍。\n- **serde_json 的 `Value::take()` 是\"取值留 Null\"**——剥键必须\n  `as_object_mut().remove()`，否则 admission 看到 Null 键照旧拒绝。\n\n### 跨 run 的持久状态要 reseed（V3 教训：受保护头）\n\n写侧新引入的跨 run 概念（如受保护 system 头）必须有投影派生的\nreseed 路径，否则第二个 run 会重建一份（第二个头 = 唯一性破坏）。\n落法：surface 投影派生 `last_system_head()`（首 append 定头、恰罩头\n替换移头、非头 append 只供有效文本——DSH findLast(non-empty) 语义），\n经请求数据结构带进 recorder。\n\n### 压缩\u002F裁剪与新 surface 节点的相互影响\n\n新 surface 类型改变 shadow span 的几何：事件序里若新节点不在\nsurface 首位（CLAT 首条 user 先于受保护头），前缀切割的遮蔽区间会\n跨过它——上游 restore 明文拒绝跨头 shadow。修法是**写事件处的\nclamp**（头之前的前缀节点从遮蔽前缀剔除），绝不为过 fold 而放宽\n校验；代价（至多少压一条首消息）如实记档。\n\n### \u002Fupdate 命令面的经验（round-11 + round-12 合并）\n\n- **发布机器与转换器解耦**：字节往返验证、源 revision 复验、\n  no-overwrite 硬链接、目录 fsync、失败清理——round-11 建的发布\n  序列逐代复用，每代只换转换器。不要为新一代重写发布面。\n- **源世代守卫要通用**：不要硬编码\"源必须是 v0\"（V3 批曾因此\n  拒绝存量 v2）——用\"当前代幂等 no-op、其余走链\"表达。\n- **门控借常量之力**：`SESSION_FORMAT_VERSION` bump 后，既有的\n  只读判定（可写代 `\u003C` 常量比较）自动把存量当前代降为 legacy，\n  `\u002Fupdate` 的可见性门控无需改命令层。\n- **幂等 = 与自己比**：目标已存在且重读重编码一致时 no-op（重试\n  与二次执行都靠它）。\n- **目录级断言零中间残留**：不止断言目标文件存在——列出目录，\n  断言没有 `session.vN.*` 之类的中间代残留（链式原子性的直接\n  证据）。\n- **错误信息可行动**：退役代指路 \u002Fnew；活跃 writer 指路先关闭；\n  撕裂尾拒绝而非丢弃。\n\n## 第 5 阶段：审计验收\n\n- 前置红测试 + 变异抽查（删实现臂必红，恢复必绿）；\n- **迁移边的上游 oracle 对拍**（存在上游迁移器时：同输入逐事件\n  等价，V3 批建立的最强判别）；\n- wire 缝按形状验原生页和 live 帧；若旧解析器已兼容，补判别测试\n  即可，不为版本号造多余的生产分支；\n- 测试数对账（重构\u002F拆包不得丢测试）；\n- **形状预算复查**（`code-health.py` 长函数数与根占比不劣于基点）；\n- 全脸 `gates.sh --full`（含 `--ignored` 面）+ 互锁腿；\n- 全量生命周期测试占用固定端口时，先核实占用者；停止其他进程\n  需当前任务的明确授权，未获授权则如实列为环境边界；\n- 真实旧资产副本演练（不改用户原数据）。\n\n## 冤枉路清单（前人已走过，勿重复）\n\n1. 只看 GitHub 版本不看 npm dist-tags → 对齐时机误判；\n2. 把 DSH 的压缩模型（世代重写）安到 CLAT 头上（append-only）\n   ——两库压缩语义不同，游标\u002F缓存语义推导前先确认自己在哪边；\n3. 为懒加载发明反向 zstd 读取——物理不存在；\n4. 新词汇直接在 recorder\u002Freplay\u002Fwire 加 match 臂——违反词汇\n   唯一家，走 catalog；\n5. 迁移时信任中间状态、跳过字节往返验证——v0 时代唯一\"质量\n   最高件\"的称号来自七条不变量一条不缺；\n6. 单样本计时\u002F单次运行下结论——多次采样净状态（宪法测量纪律）；\n7. \"已知闪测\"标签挂账不查——红两次必开病历（typert 案）；\n8. 版本 bump 只改常量不动转换器 → 写侧文件名与头版本自相矛盾\n   （V3 第一轮全量门禁红）；bump 与迁移链必须同批；\n9. `serde_json::Value::take()` 当 `remove` 用 → 键留 Null，\n   自家 admission 照拒（V3 转换器首跑红）；\n10. 上一代的 fixture 生成脚本直接复用 → rc.2 解耦了 store 与\n    persistence、插件改 default export、B8 剧本失灵——API 面先\n    探针后使用；\n11. 把 0.1.3 真实日志当 rc.2 迁移器的输入 → 头在 step 外被规格\n    拒绝；金样源按上游测试铸造法造，真实日志的拒绝类另钉测试；\n12. 忽略 `--ignored` 测试面 → 写侧\u002F准入不对称的真 bug（空 tools\n    违规）漏到全量门禁才炸；ignored 面交付前必绿。\n13. 只读路由写死旧代版本号（`version == 0`）→ bump 后新旧代打不开、\n    \u002Fupdate 不可达，死锁（2026-09-15 实机发现）；条件用\n    `\u003C SESSION_FORMAT_VERSION`，测试带\"旧代只读 resume → \u002Fupdate\n    可写\"腿。\n14. 新代信封改名只对齐 journal 读侧、漏掉 dsh 客户端 wire 缝 →\n    宿主 `session\u002Fpage`\u002Flive 帧里一条 V3 形替换事件让整页\n    \"invalid history event\"，TUI 只剩最后一条消息（2026-09-15\n    实机发现）；wire 无世代标签，按形状在解析缝规范化\n    （`dsh::frames::canonicalize_wire_event`）。\n\n## 关键落点速查（详见 references\u002Frepo-map.md）\n\n| 面 | CLAT | DSH |\n|---|---|---|\n| 词汇唯一家 | `src\u002Fsession\u002Fcatalog\u002F`（座位表） | `packages\u002Fcore\u002Fsession` 各单元 |\n| 格式常量\u002F世代 | `src\u002Fsession\u002Fcompat.rs` | `session-format\u002Fsrc\u002F`（迁移链） |\n| v2→v3 迁移边 | `src\u002Fsession\u002Fupgrade\u002Fv2_to_v3.rs` + `upgrade::ensure_current` | `session-format-v2-to-v3\u002Fsrc\u002F` |\n| 读路径 | `persistence.rs`（visit_from 顺序流） | `cold-read.ts`\u002F`storage.ts` |\n| 锁 | `write_lease.rs`（互锁测试） | `lease.ts` |\n| \u002Fupdate（ensure-current） | `persistence.rs::upgrade_legacy` + `use_cases::upgrade_active` | 各 `session-format-vN-to-vM\u002F` + persistence 发布 |\n| 网关客户端 | `src\u002Fdsh\u002F`（backend\u002Fmux\u002Fclient） | `packages\u002Fapi\u002Fgateway\u002F` |\n| 兼容金样 | `dsh_golden.rs` + `tests\u002Ffixtures\u002Fdsh-session\u002F` | 各包 spec 测试 |\n","# DSH 版本对齐与会话格式升级手册\n\n本手册源自 CLAT 第十一轮 DSH 0.1.3 对齐实战（2026-09，DV-1..11，\n12 份审计）与 0.1.5 预研。完整案例见 `references\u002Fcase-study-round-11.md`\n（v0→v2 剧本）与 `references\u002Fcase-study-round-12-v3.md`（V3 对齐 +\nensure-current），V4 的裁决与 oracle 见\n`references\u002Fcase-study-v4.md`；两仓源码地图见 `references\u002Frepo-map.md`。按阶段执行，勿跳步。\n\n## 第 0 阶段：版本事实核查（动手前必做）\n\n1. **钉靶**：DSH 平行目录 checkout 到新 tag\u002Fcommit，记录哈希。\n   所有调研结论标注钉靶。\n2. **查 npm dist-tags，不要只看 GitHub**——DSH 的 alpha 只发\n   `alpha` tag，`latest` 可能落后多代；\"用户实际拿到的版本\"以\n   dist-tags 为准（2026-09-10 教训：GitHub 已 0.1.5，latest 仍\n   0.1.2-rc.1，对齐时机由此定）。\n3. **四个面分别核对，不要混为一谈**：\n   - **会话格式**：`packages\u002Fsession\u002Fsession-format*\u002F` 的\n     `currentVersion`（每代一格的迁移链）；世代文件是**全量整档**\n     （whole-generation publication），无尾部段文件；\n   - **词汇**：新 durable 事件类型（required-on-read 一律要收编）；\n   - **网关 wire**：`packages\u002Fapi\u002Fgateway\u002F`（信封\u002F方法\u002F帧形状）；\n   - **锁协议**：`session-persistence-jsonl\u002Fsrc\u002Flease.ts`。\n   每个面独立 diff、独立下结论——格式红了不代表 wire 变了。\n\n## 第 1 阶段：三遍研究法（负责人定的方法论）\n\n1. **第一遍 差异对表**：旧调研档案 vs 新版源码，逐文件 diff；\n2. **第二遍 自我纠偏**：核对第一遍产出——凡\"没亲眼核实的断言\"\n   必错率高（历史病例：端点分隔符、末 seq 等式、压缩模型三处\n   全错，均为转述未实证）；\n3. **第三遍 全新初读**：抛开旧档案，直接读新版文档+源码形成\n   平台图，再回头看旧结论哪些过期。\n每遍产出独立文档，错误以带日期勘误形式留档，不删原文。\n\n## 第 2 阶段：任务分解（波次，按依赖序）\n\n- **词汇先行**：新事件类型必须最先收编（catalog 座位表一行+\n  金样）——准入层 fail-closed，不收编则新日志整个拒载，阻塞\n  所有后续验证。词汇竞争已发生 5 次（model\u002Fselection、team\u002F*、\n  feedback\u002F*、system\u002Fmessage、ptc 改名双座位），是每次版本升级\n  的固定税。\n- **词表是有世代窗口的**（V3 批新增形状）：类型有出生代与退役代\n  （如 `system\u002Fmessage` 从 v3 起、旧 PTC 名被 v3 退役）。座位表旁\n  落两张窗口表：越代类型走 unknown 通道（ignorable 信封级放行、\n  required 拒），退役代 required 拒 \u002F ignorable 不透明——与上游\n  per-generation known-event-types 对表，不做成单一布尔。**出生代须\n  查上游冻结的源代和目标代词表**；“CLAT 首次收编”不等于“上游\n  此代新增”（V4 的两个 envelope-only 事件实际已在 V3 词表）。\n- 独立易项并行一波；主战役（格式读写）单列；迁移\u002F升级（如有）\n  依赖格式读写完成后收尾。**版本常量 bump 与迁移边必须同批落地**\n  （V3 教训：写侧已是 v3、转换器还产 v2 → 文件名与头版本自相矛盾）。\n- CLAT 侧改动全部走 catalog 座位表（见 AGENTS.md 词汇唯一家），\n  不得新开字符串 match 臂。\n\n## 第 3 阶段：实施纪律\n\n- **不变量先行**：动持久状态前写下不变量，审计每个读者和每个\n  写者（宪法 State discipline 全文适用）。\n- **字节级金样**是安全网：对齐过程中金样零变更是行为保持的\n  证据；新格式的金样按 DSH 真实产物铸造（原语级生成脚本）。\n  生成脚本应钉上游 revision，并固定非语义随机量（如消息 ID、\n  时间）；连续重生两次比对字节哈希，避免不可复现的 golden。\n- **fixture 铸造脚本随上游版本重验**（V3 教训）：上一代能跑的\n  生成脚本会在新代失效——rc.2 把 SessionStore 与\n  JsonlSessionPersistence 解耦（B8 剧本的 persistence.load 消失）、\n  持久化插件改 default export、store 逻辑头缺\n  `delegationDepth`（released 头校验要求在位）。先小探针验证\n  API 面，再写生成器；`node:zlib` 一次只解一个 zstd 帧（两帧\n  布局要自己拆）。\n- **写侧必须满足自家准入（canonical 对称）**：准入层先行的\n  严格规则（如空可选字段必须缺省），写侧要在同一处规则家落地\n  （V3 的 `persisted_request_header`）——\"写出的日志自己的\n  admission 要认\" 是判别测试，ignored 测试面抓到过真实违反。\n- **value 搬家时，所有比较必须迁到新家同形**：V3 把 system 从\n  header 搬进消息流，header 去重比较两侧若一侧已剥一侧未剥，\n  每 run 假 \"change\"。定义\"持久形\"唯一规则函数，写入与比较\n  都走它。\n- **`--ignored` 测试面是门禁的一部分**：跨读产物测试、私有源\n  演练等 ignored 测试在全量门禁才跑，且专抓写侧\u002F准入不对称\n  的真 bug（V3 批的空 tools 违规就是它抓到的）。交付前必须\n  让它们也绿。\n- **真实互锁测试**：`DSH_CHECKOUT=\u003C钉靶路径>` 跑 write_lease\n  互锁。其他包若有独立钉靶 cohort（如 DSH 适配器），按其自身\n  版本单独验收；不要把新 `DSH_CHECKOUT` 全局灌给旧 cohort。\n- **预言机重钉**决策：compat oracle 是否推进到新靶由负责人定。\n- **zstd 物理事实**：会话是单一顺序压缩流——尾部读取也要从头\n  解压，**不存在也不需要反向读**（0.1.3 调研定案，勿再发明）。\n- **形状预算适用于迁移代码**：转换器容易写成百行大函数——\n  用状态机\u002F按家族拆分（V3 的 `Migration::push_source`），\n  `code-health.py` 长函数数不得超基点。\n\n## 第 4 阶段：会话格式代际迁移（\u002Fupdate = ensure-current）\n\n当需要把低于当前代的会话升到 `SESSION_FORMAT_VERSION` 时，执行\n`references\u002Fcase-study-round-11.md` 的完整剧本，其七条不变量不可裁剪。\n要点速记：\n\n- **ensure-current 语义（2026-09-13，V3 批确立）**：`\u002Fupdate` 不是\n  \"vN→vN+1\" 单边命令，而是\"升到 `SESSION_FORMAT_VERSION` 常量\"——\n  一切低于当前代的会话（v0、存量 v2，将来 v3）经**内存迁移链**逐边\n  接力，但**只在全链成功后发布唯一最终世代**；任何一边拒绝 = 零发布、\n  源字节不动、目录零中间世代残留（DSH \"only the exact source and final\n  current generation\" 规则照抄）。命令对已当前代幂等（no-op）。\n- 退役代（如 v1）显式拒绝并指路 \u002Fnew，绝不静默收下或跳过。\n- 旧代**只读打开**（错误信息指路 \u002Fupdate 或 \u002Fnew），普通路径\n  零副作用：不补 end-seed、不修复、不写 checkpoint、不建 writer；\n- **当前代也可能只读**：若新语义可读却不能由 CLAT 保真续写\n  （V4 `developer\u002Fmessage`、非空 `agentPreset` 是实例），在运行和\n  工具副作用前拒写；不要向用户提供会改写当前代的 `\u002Fupdate`。\n  读侧收编事件不等于授权生产该事件；当前代只读打开也不得留下\n  写租约等 artifact。若为此先扫描再取得写租约，取得后须复验\n  源 revision，避免扫描与写入间的竞态。\n- **bump 会制造\"新的旧代\"（2026-09-15 缺陷入册）**：常量每进一代，\n  上一代就从\"可写\"翻成\"可解码但不可写\"。按版本号路由读写状态的\n  地方（协调器只读分支、写路门槛、命令可见性）一律用**\"凡低于\n  `SESSION_FORMAT_VERSION`\"**表达，禁止写死具体版本号——只读分支\n  写死 `== 0` 的债在 V3 bump 后爆雷：v2 打不开、\u002Fupdate 又只在\n  legacy 会话内可达，\"打不开就没法 update\"死锁（合并后实机发现）。\n- **结构性改名会从宿主的\"事件服务面\"漏进客户端 wire 缝（2026-09-15\n  缺陷入册）**：新代的信封\u002F字段改名不只存在于 journal 文件——宿主的\n  `session\u002Fpage`、live `session\u002Fevent` 把各代事件**原样**发给客户端，\n  且不带世代标签。任何把 journal 事件当 wire 载荷消费的客户端\n  （`clat dsh`、将来桌面端）都要在解析缝做**形状驱动**的信封规范化\n  （V3 `startSeq`\u002F`endSeq` → 逻辑 `start`\u002F`end`）。一条解析失败 =\n  整页历史被拒 → 转录只剩暂存 live 帧（\"打开会话只见最后一条\"）。\n- 迁移 = 租约内读 → **纯转换器** → 发布前**字节往返验证** →\n  源 revision 复验 → **no-overwrite 原子发布** → 目录 fsync →\n  **重武装**（世代重排由整体重建吸收，不做水位算术；投影永远由\n  当前代全量扫描重建，缓存行不得绕过改变基数的迁移）；\n- **原件永久保留**，永不删；\n- 无损映射不了的输入明确拒绝，不静默造\"兼容\"数据；上游冻结边\n  保真的字段（turn\u002Fstep、ids、时间、交付坐标）逐字保留——保留规则\n  例外必须写成文档化 deviation（见 V3 案例研究的 step 基裁决）。\n\n### 迁移边施工要点（V2→V3 实战沉淀）\n\n- **上游 oracle 对拍是最强判别**：用与上游迁移器测试同款方法铸造\n  一份源（同 header id、同时间锚点），分别喂上游迁移器与本地转换\n  器，**逐事件等价**（含合成 id 的 SHA-256 材料）。金样即对拍基准。\n- **旧代真实日志可能不被新边接受**：0.1.3 真 V2 日志的头在\n  step\u002Fstart 之前，rc.2 迁移器按规格拒绝（提示词变化在开放 step\n  外）。拒绝类要**复刻并钉判别测试**；上游自己的测试铸造法\n  （migration.spec.ts 的合成源）是金样源的合法替代。\n- **bump 批次的必备判别腿（2026-09-15 补）**：经协调器**真实 resume\n  路径**（不是 upgrade 自读）只读打开一个**上一发布代**会话——成功、\n  零副作用（源字节不动、无锁\u002F检查点\u002Fseed\u002Fwriter 残留）、写面拒绝\n  指路 \u002Fupdate、\u002Fupdate 后同一会话当场可写。ensure-current\u002F金样\u002F\n  准入测试全绿不覆盖这条腿（V3 批漏网实录）。\n- **重映射只做同名工件引用表**（surface 信封\u002FsourceEventSeqs\u002F\n  command.done\u002Fcompaction Range+Seqs\u002Ftitle messageSeqs），其余一律\n  保真；单遍走日志即可——引用只指向前方，走到时映射必已建立，\n  无需两遍。\n- **serde_json 的 `Value::take()` 是\"取值留 Null\"**——剥键必须\n  `as_object_mut().remove()`，否则 admission 看到 Null 键照旧拒绝。\n\n### 跨 run 的持久状态要 reseed（V3 教训：受保护头）\n\n写侧新引入的跨 run 概念（如受保护 system 头）必须有投影派生的\nreseed 路径，否则第二个 run 会重建一份（第二个头 = 唯一性破坏）。\n落法：surface 投影派生 `last_system_head()`（首 append 定头、恰罩头\n替换移头、非头 append 只供有效文本——DSH findLast(non-empty) 语义），\n经请求数据结构带进 recorder。\n\n### 压缩\u002F裁剪与新 surface 节点的相互影响\n\n新 surface 类型改变 shadow span 的几何：事件序里若新节点不在\nsurface 首位（CLAT 首条 user 先于受保护头），前缀切割的遮蔽区间会\n跨过它——上游 restore 明文拒绝跨头 shadow。修法是**写事件处的\nclamp**（头之前的前缀节点从遮蔽前缀剔除），绝不为过 fold 而放宽\n校验；代价（至多少压一条首消息）如实记档。\n\n### \u002Fupdate 命令面的经验（round-11 + round-12 合并）\n\n- **发布机器与转换器解耦**：字节往返验证、源 revision 复验、\n  no-overwrite 硬链接、目录 fsync、失败清理——round-11 建的发布\n  序列逐代复用，每代只换转换器。不要为新一代重写发布面。\n- **源世代守卫要通用**：不要硬编码\"源必须是 v0\"（V3 批曾因此\n  拒绝存量 v2）——用\"当前代幂等 no-op、其余走链\"表达。\n- **门控借常量之力**：`SESSION_FORMAT_VERSION` bump 后，既有的\n  只读判定（可写代 `\u003C` 常量比较）自动把存量当前代降为 legacy，\n  `\u002Fupdate` 的可见性门控无需改命令层。\n- **幂等 = 与自己比**：目标已存在且重读重编码一致时 no-op（重试\n  与二次执行都靠它）。\n- **目录级断言零中间残留**：不止断言目标文件存在——列出目录，\n  断言没有 `session.vN.*` 之类的中间代残留（链式原子性的直接\n  证据）。\n- **错误信息可行动**：退役代指路 \u002Fnew；活跃 writer 指路先关闭；\n  撕裂尾拒绝而非丢弃。\n\n## 第 5 阶段：审计验收\n\n- 前置红测试 + 变异抽查（删实现臂必红，恢复必绿）；\n- **迁移边的上游 oracle 对拍**（存在上游迁移器时：同输入逐事件\n  等价，V3 批建立的最强判别）；\n- wire 缝按形状验原生页和 live 帧；若旧解析器已兼容，补判别测试\n  即可，不为版本号造多余的生产分支；\n- 测试数对账（重构\u002F拆包不得丢测试）；\n- **形状预算复查**（`code-health.py` 长函数数与根占比不劣于基点）；\n- 全脸 `gates.sh --full`（含 `--ignored` 面）+ 互锁腿；\n- 全量生命周期测试占用固定端口时，先核实占用者；停止其他进程\n  需当前任务的明确授权，未获授权则如实列为环境边界；\n- 真实旧资产副本演练（不改用户原数据）。\n\n## 冤枉路清单（前人已走过，勿重复）\n\n1. 只看 GitHub 版本不看 npm dist-tags → 对齐时机误判；\n2. 把 DSH 的压缩模型（世代重写）安到 CLAT 头上（append-only）\n   ——两库压缩语义不同，游标\u002F缓存语义推导前先确认自己在哪边；\n3. 为懒加载发明反向 zstd 读取——物理不存在；\n4. 新词汇直接在 recorder\u002Freplay\u002Fwire 加 match 臂——违反词汇\n   唯一家，走 catalog；\n5. 迁移时信任中间状态、跳过字节往返验证——v0 时代唯一\"质量\n   最高件\"的称号来自七条不变量一条不缺；\n6. 单样本计时\u002F单次运行下结论——多次采样净状态（宪法测量纪律）；\n7. \"已知闪测\"标签挂账不查——红两次必开病历（typert 案）；\n8. 版本 bump 只改常量不动转换器 → 写侧文件名与头版本自相矛盾\n   （V3 第一轮全量门禁红）；bump 与迁移链必须同批；\n9. `serde_json::Value::take()` 当 `remove` 用 → 键留 Null，\n   自家 admission 照拒（V3 转换器首跑红）；\n10. 上一代的 fixture 生成脚本直接复用 → rc.2 解耦了 store 与\n    persistence、插件改 default export、B8 剧本失灵——API 面先\n    探针后使用；\n11. 把 0.1.3 真实日志当 rc.2 迁移器的输入 → 头在 step 外被规格\n    拒绝；金样源按上游测试铸造法造，真实日志的拒绝类另钉测试；\n12. 忽略 `--ignored` 测试面 → 写侧\u002F准入不对称的真 bug（空 tools\n    违规）漏到全量门禁才炸；ignored 面交付前必绿。\n13. 只读路由写死旧代版本号（`version == 0`）→ bump 后新旧代打不开、\n    \u002Fupdate 不可达，死锁（2026-09-15 实机发现）；条件用\n    `\u003C SESSION_FORMAT_VERSION`，测试带\"旧代只读 resume → \u002Fupdate\n    可写\"腿。\n14. 新代信封改名只对齐 journal 读侧、漏掉 dsh 客户端 wire 缝 →\n    宿主 `session\u002Fpage`\u002Flive 帧里一条 V3 形替换事件让整页\n    \"invalid history event\"，TUI 只剩最后一条消息（2026-09-15\n    实机发现）；wire 无世代标签，按形状在解析缝规范化\n    （`dsh::frames::canonicalize_wire_event`）。\n\n## 关键落点速查（详见 references\u002Frepo-map.md）\n\n| 面 | CLAT | DSH |\n|---|---|---|\n| 词汇唯一家 | `src\u002Fsession\u002Fcatalog\u002F`（座位表） | `packages\u002Fcore\u002Fsession` 各单元 |\n| 格式常量\u002F世代 | `src\u002Fsession\u002Fcompat.rs` | `session-format\u002Fsrc\u002F`（迁移链） |\n| v2→v3 迁移边 | `src\u002Fsession\u002Fupgrade\u002Fv2_to_v3.rs` + `upgrade::ensure_current` | `session-format-v2-to-v3\u002Fsrc\u002F` |\n| 读路径 | `persistence.rs`（visit_from 顺序流） | `cold-read.ts`\u002F`storage.ts` |\n| 锁 | `write_lease.rs`（互锁测试） | `lease.ts` |\n| \u002Fupdate（ensure-current） | `persistence.rs::upgrade_legacy` + `use_cases::upgrade_active` | 各 `session-format-vN-to-vM\u002F` + persistence 发布 |\n| 网关客户端 | `src\u002Fdsh\u002F`（backend\u002Fmux\u002Fclient） | `packages\u002Fapi\u002Fgateway\u002F` |\n| 兼容金样 | `dsh_golden.rs` + `tests\u002Ffixtures\u002Fdsh-session\u002F` | 各包 spec 测试 |\n",{"name":5,"description":7},"main","bb1e456074e0fe6180b665888010395e7a5ddae3",".agents\u002Fskills\u002Fdsh-session-upgrade",0,"https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat","https:\u002F\u002Fcl.at.cn\u002F","https:\u002F\u002Fgithub.com\u002Fartec","https:\u002F\u002Fwww.artec.com","Art & Tec","2026-11-10 12:16:28",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add artec\u002Fclat --skill dsh-session-upgrade",{"tool":63,"command":64},"bunx","bunx skills add artec\u002Fclat --skill dsh-session-upgrade",{"tool":66,"command":67},"pnpm","pnpm dlx skills add artec\u002Fclat --skill dsh-session-upgrade","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdsh-session-upgrade\u002FSKILL.md",true,[71,77,83,87,91,95,99,105],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"assets\u002FREADME.md","ASSET","资产文件",371,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Ftesting\u002Ftest-data-generator\u002Fskills\u002Fgenerating-test-data\u002Fassets\u002FREADME.md",{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Fcase-study-round-11.md","REFERENCE","参考文档",4390,"https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdsh-session-upgrade\u002Freferences\u002Fcase-study-round-11.md",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002Fcase-study-round-12-v3.md",8203,"https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdsh-session-upgrade\u002Freferences\u002Fcase-study-round-12-v3.md",{"path":88,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Fcase-study-v4.md",2481,"https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdsh-session-upgrade\u002Freferences\u002Fcase-study-v4.md",{"path":92,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":93,"sourceHtmlUrl":94},"references\u002FREADME.md",378,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Ftesting\u002Ftest-data-generator\u002Fskills\u002Fgenerating-test-data\u002Freferences\u002FREADME.md",{"path":96,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":97,"sourceHtmlUrl":98},"references\u002Frepo-map.md",3120,"https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdsh-session-upgrade\u002Freferences\u002Frepo-map.md",{"path":100,"resourceType":101,"resourceTypeDesc":102,"sizeBytes":103,"sourceHtmlUrl":104},"scripts\u002Fgenerate_data.py","SCRIPT","脚本",3737,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Ftesting\u002Ftest-data-generator\u002Fskills\u002Fgenerating-test-data\u002Fscripts\u002Fgenerate_data.py",{"path":106,"resourceType":101,"resourceTypeDesc":102,"sizeBytes":107,"sourceHtmlUrl":108},"scripts\u002FREADME.md",364,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Ftesting\u002Ftest-data-generator\u002Fskills\u002Fgenerating-test-data\u002Fscripts\u002FREADME.md",[110,131,139,145,159],{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":121,"publishedAt":42},"01M6C435TYFZSGZ5T7FC779G27","code-review","User override for the layered skill Stage-0 fixture.","https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fagent-scenarios\u002Fskill-load-layering\u002Fuser-input\u002Fcode-review\u002FSKILL.md",[116],{"categoryNo":117,"categoryName":118,"taxonomyType":119,"taxonomyTypeDesc":120},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[122,123,124,125,126,127,128,129,130],"code review","review","code","layered","for","false","stage","fixture","user",{"skillNo":132,"name":112,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":137,"publishedAt":42},"01M6C433Z3P6KEHJ0CYZWCAEDG","Project override for the layered skill Stage-0 fixture.","https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fagent-scenarios\u002Fskill-load-layering\u002Finput\u002F.clat\u002Fskills\u002Fcode-review\u002FSKILL.md",[136],{"categoryNo":117,"categoryName":118,"taxonomyType":119,"taxonomyTypeDesc":120},[124,123,122,125,129,138,128,127,126],"project",{"skillNo":140,"name":112,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":144,"publishedAt":42},"01M6C4322YTCX5202JW9ENJRE3","https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fagent-scenarios\u002Fskill-load-layering\u002Fexpected\u002F.clat\u002Fskills\u002Fcode-review\u002FSKILL.md",[143],{"categoryNo":117,"categoryName":118,"taxonomyType":119,"taxonomyTypeDesc":120},[124,123,122,128,125,126,127,138,129],{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":42},"01M6C4304QW3WR8APAWDE09DQM","exec-fixture","Execute a local fixture only through the graduated required sandbox.","https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fagent-scenarios\u002Fskill-exec-required-sandbox\u002Finput\u002F.clat\u002Fskills\u002Fexec-fixture\u002FSKILL.md",[],[152,129,153,154,155,156,157,158],"exec","exec fixture","true","local","only","execute","sandbox",{"skillNo":160,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":163,"publishedAt":42},"01M6C42XMP5V4Y1JXQZXG5CSQ9","https:\u002F\u002Fgithub.com\u002Fartec\u002Fclat\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fagent-scenarios\u002Fskill-exec-required-sandbox\u002Fexpected\u002F.clat\u002Fskills\u002Fexec-fixture\u002FSKILL.md",[],[153,152,129,158,154,155,156,157]]