dsh-ptc-plus 0.4.8 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +61 -123
- package/README.md +61 -123
- package/assets/dsh-ptc-plus-banner-en.webp +0 -0
- package/assets/dsh-ptc-plus-banner-zh.webp +0 -0
- package/assets/ptc-plus-repl-workspace-en.png +0 -0
- package/assets/ptc-plus-repl-workspace-zh.png +0 -0
- package/assets/ptc-plus-settings-en.png +0 -0
- package/assets/ptc-plus-settings-zh.png +0 -0
- package/client.cjs +42336 -0
- package/cordis.patch.yml +13 -2
- package/docs/README.md +7 -2
- package/docs/adr/0005-temporary-rejected-cell-edit-transport.md +31 -179
- package/docs/adr/0008-define-agent-operating-contract.md +5 -1
- package/docs/adr/0009-bound-expensive-acceptance-default.md +2 -2
- package/docs/adr/0016-archive-resolved-review-findings.md +1 -1
- package/docs/adr/0017-track-the-latest-dsh-public-surface.md +2 -2
- package/docs/adr/0019-plugin-settings-and-kill-switch.md +14 -3
- package/docs/adr/0020-optional-cordis-tools-in-ptc-mode.md +2 -2
- package/docs/adr/0022-stage-npm-releases-with-oidc.md +4 -2
- package/docs/adr/0023-global-user-bindings.md +3 -1
- package/docs/adr/0026-persist-the-delivery-verdict-against-the-verified-candidate.md +2 -0
- package/docs/adr/0028-attach-to-the-host-ptc-execution-seam.md +101 -35
- package/docs/adr/0030-serve-both-typert-codec-generations-from-one-codec.md +3 -3
- package/docs/adr/0031-close-semantic-obligations-by-owner.md +1 -1
- package/docs/adr/0032-own-session-log-facts-in-a-host-only-projection.md +27 -0
- package/docs/adr/0033-gate-client-visual-usability-in-a-browser.md +23 -0
- package/docs/adr/0034-keep-program-values-separate-from-output-projections.md +29 -0
- package/docs/adr/0035-run-coverage-only-before-a-new-release.md +27 -0
- package/docs/adr/0036-separate-focused-development-from-delivery-verification.md +29 -0
- package/docs/adr/0037-keep-tool-hover-previews-passive.md +52 -0
- package/docs/adr/0038-freeze-session-capability-plans.md +71 -0
- package/docs/adr/0039-verify-documentation-without-runtime-suites.md +29 -0
- package/docs/adr/0040-separate-capability-configurations-from-session-observations.md +39 -0
- package/docs/adr/0041-record-cell-execution-directories.md +65 -0
- package/docs/adr/0042-persist-provider-availability-and-handback.md +41 -0
- package/docs/adr/0043-compose-capability-and-context-policies.md +37 -0
- package/docs/adr/README.md +6 -0
- package/docs/architecture.md +25 -27
- package/docs/binding-review-placement-design.md +29 -21
- package/docs/capability-planning-components.md +93 -0
- package/docs/capability-projection.md +7 -0
- package/docs/client-ui.md +88 -29
- package/docs/client-visual-contract.md +65 -0
- package/docs/context-management.md +22 -0
- package/docs/context-optimization-plan.md +353 -0
- package/docs/context-public-interface-coverage.md +25 -0
- package/docs/durability-design.md +31 -14
- package/docs/evaluation.md +41 -6
- package/docs/evaluations/command-goat-deepseek-v4.1-flash-20261006.md +126 -0
- package/docs/evaluations/command-goat-deepseek-v4.1-flash.md +281 -0
- package/docs/installation.md +50 -8
- package/docs/program-data-plane.md +5 -3
- package/docs/publishing.md +5 -5
- package/docs/release-coverage.md +73 -0
- package/docs/release-notes.md +1 -1
- package/docs/review-procedure.md +56 -0
- package/docs/runtime-reference.md +48 -16
- package/docs/semantic-validation.md +14 -2
- package/docs/stateful-binding-updates-proposal.md +2 -2
- package/docs/user-bindings.en.md +2 -2
- package/docs/user-bindings.md +3 -3
- package/docs/value-wire.md +11 -1
- package/docs/verification-optimization-work.md +52 -15
- package/docs/verification.md +30 -86
- package/index.js +147 -23
- package/internal/binding-toggle-receipt.js +24 -0
- package/internal/capability-command-receipt.js +29 -0
- package/internal/capability-environment.js +1247 -0
- package/internal/capability-plan.js +285 -0
- package/internal/capability-policy.js +96 -0
- package/internal/capability-statistics-store.js +180 -0
- package/internal/capability-statistics.js +210 -0
- package/internal/compiler-platform.js +5 -3
- package/internal/compiler-service.js +2 -9
- package/internal/config-spec.js +79 -9
- package/internal/cordis-tools-owner.js +22 -19
- package/internal/direct-surface-owner.js +29 -29
- package/internal/dynamic-environment-runtime.js +9 -9
- package/internal/edit-transport-owner.js +183 -139
- package/internal/execution-provider-owner.js +160 -0
- package/internal/execution-seam-compat.js +76 -120
- package/internal/isolated-worker.js +12 -8
- package/internal/kernel-worker.js +104 -32
- package/internal/native-root-dynamic.js +12 -13
- package/internal/program-bindings.js +190 -0
- package/internal/recovery-tips.js +53 -23
- package/internal/rejected-cell-editor.js +8 -8
- package/internal/repl-observation-interest.js +11 -3
- package/internal/rpc-contract.js +1 -0
- package/internal/runtime-bridge-owner.js +351 -82
- package/internal/runtime-config.js +58 -0
- package/internal/runtime-contexts.js +85 -16
- package/internal/runtime-intrinsics.js +1 -0
- package/internal/runtime-messages.js +41 -0
- package/internal/sdk-projection.js +10 -82
- package/internal/session-cell-executor.js +42 -19
- package/internal/session-events.js +74 -4
- package/internal/session-journal-recovery.js +904 -184
- package/internal/session-journal-schema.js +6 -3
- package/internal/session-journal.js +31 -2
- package/internal/session-log-view.js +189 -43
- package/internal/session-runtime.js +175 -23
- package/internal/settings-compat.js +23 -6
- package/internal/stateful-module-compiler.js +3 -2
- package/internal/stateful-module-runtime.js +7 -3
- package/internal/stateful-root-runtime.js +9 -4
- package/internal/user-binding-authoring.js +2 -7
- package/internal/user-bindings-owner.js +47 -7
- package/internal/validated-parse-repair.js +1 -1
- package/internal/value-wire.js +68 -21
- package/internal/worker-cwd-virtualization.js +20 -18
- package/internal/worker-realm-surfaces.js +3 -3
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +55 -38
- package/src/client-authoring-view.js +286 -168
- package/src/client-binding-review.js +4 -1
- package/src/client-binding-toggle.js +18 -0
- package/src/client-capabilities-view.js +1341 -0
- package/src/client-capability-sort.js +29 -0
- package/src/client-code-editor.js +6 -0
- package/src/client-copy.js +881 -8
- package/src/client-feature-gates.js +15 -5
- package/src/client-host-compat.js +23 -2
- package/src/client-indicator-view.js +4 -6
- package/src/client-primitives.js +280 -0
- package/src/client-repl-view.js +23 -16
- package/src/client-settings-view.js +412 -69
- package/src/client-styles.js +193 -41
- package/src/client-tool-hover.js +185 -0
- package/src/client-tool-view.js +45 -11
- package/src/client-transport.js +44 -9
- package/src/client-workbench.js +9 -10
- package/src/client.js +148 -68
- package/assets/ptc-plus-bindings-en.png +0 -0
- package/assets/ptc-plus-bindings-zh.png +0 -0
- package/assets/ptc-plus-repair-en.png +0 -0
- package/assets/ptc-plus-repair-zh.png +0 -0
- package/client.js +0 -31857
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
# PTC Plus 上下文优化实施计划
|
|
2
|
+
|
|
3
|
+
本文把已确认的产品约束组织成可实施、可验证的方案。目标是让模型在普通任务中更容易用对能力,并降低完成任务的总 token 消耗。当前实现已接入冻结会话方案、编译前能力投影、共享 Skill/MCP 目录、受管工具检索、刷新命令和锁定统计适配器;付费任务收益仍需单独校准;当前一轮的固定任务、盲评、解盲和家族用量审计已完成,但机器预算失败,结果仅是单 replicate 观察。
|
|
4
|
+
|
|
5
|
+
阅读本文不需要访谈记录。正文直接说明决策、原因、输入、失败后的状态和完成条件;文末的源码与文档索引用于定位实现和核验事实。稳定契约由 [ADR 0038](adr/0038-freeze-session-capability-plans.md) 记录,术语由 [CONTEXT.md](../CONTEXT.md) 拥有。标为“实施建议”的内容是供实现验证的具体起点,不等同于已经确认的公共 API、持久化格式或数值默认值。
|
|
6
|
+
|
|
7
|
+
## 当前实施状态
|
|
8
|
+
|
|
9
|
+
| 阶段 | 已完成的责任 | 尚未成立的完成条件 |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| 一:公共接口 | 真实 registry、Skill、MCP、命令、Agent 和 SDK 组合入口已接入;关闭投影覆盖 scope 自有工具;MCP 资源以 server 为配置单元 | URI 与模板由已启用 server 的公开列表和读取协议提供,不在 prompt 准备阶段发起远程枚举 |
|
|
12
|
+
| 二:手动基线与方案 | 设置、首轮目录、会话持久化、恢复和真实运行时成员投影已接入 | 可搜索能力选择、统计开关与数值输入及有效方案展示已验证;未校准的默认参数不声称最优 |
|
|
13
|
+
| 三:统计 | 纯归约、家族观察、原子锁存储、并发串行化和手动回退已接入 | 付费任务上的窗口参数仍未校准 |
|
|
14
|
+
| 四:检索与生命周期 | 有界检索、冻结刷新、旧方案恢复和已展开说明恢复已接入;原 SDK 被固定 bootstrap 替代 | 正式结果证据和 Session replacement 去重已验证;任务对照仍独立计量 |
|
|
15
|
+
| 五:预览与界面 | Host spill 公共行为保持 canonical 值和完整读取;设置字段与命令已公开 | 真实 Host spill service 的预览、日志、取回及失败回退已验证 |
|
|
16
|
+
| 六:任务收益 | 确定性组件反例、无模型公共探针和固定 8 项付费配对 | 已完成一次单 replicate 配对、16 份盲评和解盲;插件盲评效率 15/24 对基线 10/24,普通任务 traffic 122,933 对 325,862,但原生基线 3 项超出机器预算,不能据此作普遍收益保证 |
|
|
17
|
+
|
|
18
|
+
接口事实见[公共覆盖矩阵](context-public-interface-coverage.md),纯组件输入和边界见[组件说明](capability-planning-components.md)。能力管理默认关闭,开启后由同一冻结方案驱动说明、发现和编译前执行投影;历史记录损坏时只收缩受管方案并继续当前合法计算。付费任务质量和总 token 收益仍不能从确定性检查推断。
|
|
19
|
+
|
|
20
|
+
## 1. 从当前问题推导优化目标
|
|
21
|
+
|
|
22
|
+
PTC Plus 的价值是让模型连续计算、复用和修订状态。模型为了获得这种便利而反复阅读很长的能力说明、探索已经提供的工具、修正不准确的调用,或者输出本可留在程序中的大量内容时,计算便利就可能被上下文成本抵消。因此,本次工作的对象是完成任务所需的整个模型交互过程,而不只是某一段提示词。
|
|
23
|
+
|
|
24
|
+
优化前实现已有 `capabilities.tree/find/inspect`,但 `internal/direct-surface-owner.js` 的 `capabilitySdk()` 当时先保留投影后的完整原生 SDK,再追加发现 API 说明。`internal/sdk-projection.js` 主要适配语言说明并排除程序内的 `edit_run_code`,没有按使用情况分配完整和按需契约。发现入口的存在因而不等于原生能力说明已经按需加载。
|
|
25
|
+
|
|
26
|
+
发现本身也有成本。当前 `find` 按名称或连续词序列确定性匹配,不是语义检索;`inspect` 的 `budget` 限制条目数量,不限制这些条目的文本或 token 总量。让模型依次列目录、猜搜索词、再取说明,可能增加模型往返;只缩短目录而不改善可发现性,同样可能把成本转移到探索和错误恢复。
|
|
27
|
+
|
|
28
|
+
历史配对实验提供了问题证据,但没有证明单一成因:修正实验中全部任务已报告 traffic 增加 5.67%,普通任务增加 6.60%,双方均完成的普通配对增加 3.60%。完成率和部分质量指标同时改善。另一个实验队列没有 `find/inspect` 调用,因此不能把额外消耗全部归因于能力发现。记录还存在未结算子请求用量未知及 canary 协议问题,这些数字只能支持“收益尚未成立”,不能作为普遍成本结论或本次优化的预期幅度。
|
|
29
|
+
|
|
30
|
+
由此得到硬验收目标:在代表性普通任务上,相对关闭 PTC Plus 的原生 PTC,任务质量不下降,任务总 token 消耗降低。总量包含主代理、实际子代理、发现、重试和全部可观测模型请求;缓存输入、未缓存输入和输出分别报告。提示词字节缩短、调用轮数减少、缓存命中率提高和高级能力可用,都只是解释结果的中间指标。
|
|
31
|
+
|
|
32
|
+
## 2. 先确定管理对象,避免优化越过能力所有权
|
|
33
|
+
|
|
34
|
+
能力管理针对 DSH 作为 harness 及其其他插件正式提供给模型的任务能力。它改变能力是否进入当前有效集合,以及有效能力的说明如何提供;它不重新定义该能力的参数、结果、权限或执行行为。
|
|
35
|
+
|
|
36
|
+
| 对象 | 管理内容 | 必须保留的区别 |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| 原生、插件及 MCP 工具 | 完整说明、按需发现、有效集合中的成员资格 | 原生工具定义、参数验证和实际分派仍由 DSH 拥有 |
|
|
39
|
+
| Skills | 目录说明、发现及正文加载入口的一致可用性 | 完整披露是完整目录说明,正文仍在实际使用时加载 |
|
|
40
|
+
| MCP 资源和模板 | 可发现的资源来源、条目或模板及其读取路径 | 共享读取工具、具体资源和开放集合不是同一个身份 |
|
|
41
|
+
| 子代理、后台任务、工作流 | 管理其实际提供给模型的能力入口 | 通常已经体现为工具,不额外复制调度或会话协调 |
|
|
42
|
+
| JS/TS、Node、REPL、PTC Plus 公共 API、Global User Bindings | 不属于本次能力管理范围 | `code.run`、`repl.state` 和发现基础设施不能因低使用率被隐藏 |
|
|
43
|
+
| 仅供人使用的斜杠命令和 UI | 不属于模型任务能力 | 刷新命令属于管理入口,其 UI 回执不自动成为模型消息 |
|
|
44
|
+
|
|
45
|
+
MCP server instructions、工具 guidance 和 Skill 目录有各自的发布者。仅过滤一份生成的 SDK,不能证明这些其他入口也已经同步。实施必须覆盖实际贡献能力信息的公共入口,不能用一个名义上的工具清单代替整个模型表面。
|
|
46
|
+
|
|
47
|
+
DSH 继续拥有授权、策略、取消、审批、调度、工具验证和分派。本功能不建立第二套权限系统,不创建按名称重新路由执行的私有 registry,不修改宿主源码或安装包。插件中的能力描述索引只能是 owner 事实的派生读模型;索引条目不能成为新的调用权威。
|
|
48
|
+
|
|
49
|
+
## 3. 配置独立生效,方案由输入计算
|
|
50
|
+
|
|
51
|
+
配置由能力管理总开关、统计设置和手动配置组成。它们各自表达用户的意图,不再增加自动、手动、关闭三种互斥模式。所谓“只剩手动”是统计不能参与时自然算出的结果,不是另一个需要同步的状态。
|
|
52
|
+
|
|
53
|
+
总开关决定是否应用本功能的能力管理。关闭管理时交还宿主原有的能力提供方式,保留独立配置供再次使用;这与关闭整个 PTC Plus 插件不同。管理开关也不能放宽宿主本来施加的限制。
|
|
54
|
+
|
|
55
|
+
手动配置包含可编辑常用基线和单项选择。单项可以显式指定完整披露、按需披露或关闭;未指定的项才进入基线与有效统计的分配过程。自动统计永远不能关闭能力,也不能覆盖单项显式选择。
|
|
56
|
+
|
|
57
|
+
统计设置只约束统计部分。设置无效、统计关闭或数据坍缩到无法形成有效依据时,能力方案仍能从手动配置和基线计算出来。不能把损坏或缺失的数据伪装成零使用率,也不能因统计出错撤销用户的手动配置。配置在最早可判断的位置校验,UI 明确显示统计依据为何不可用;有效的手动部分保持可用。
|
|
58
|
+
|
|
59
|
+
一次方案计算按以下依赖顺序进行:
|
|
60
|
+
|
|
61
|
+
1. 取得该 agent 当前由宿主实际提供的能力事实,排除不属于管理范围的对象。
|
|
62
|
+
2. 若总开关关闭,采用宿主提供方式;否则应用单项显式关闭,得到受管的有效集合。
|
|
63
|
+
3. 在有效集合中固定单项显式完整和按需选择。
|
|
64
|
+
4. 对其余能力,选择足够的工作区统计;不足时参考足够的用户全局统计;都不可用时使用常用基线。
|
|
65
|
+
5. 在说明预算内分配剩余的完整契约,其余保持按需可发现。显式完整造成超预算时报告超量,不截断契约或暗中降级。
|
|
66
|
+
6. 生成同一份会话方案的说明、发现和执行投影,并保存每项选择的原因,供用户检查。
|
|
67
|
+
|
|
68
|
+
例如,用户把能力 A 固定为按需后,即使它在全部样本中都被使用,统计也不能把它改成完整。能力 B 没有单项选择且位于常用基线中,统计不足时按预算进入完整集合;有足够统计后,新会话可依据统计重新分配。统计文件损坏时,A 的显式选择和 B 的基线仍然存在。
|
|
69
|
+
|
|
70
|
+
所有保存的能力配置都遵守会话生效边界:新会话使用新配置,已有会话只在主动刷新后改变。单项关闭、管理开关和统计设置均不能绕过这条规则。这里不改变 Global User Bindings 等范围外设置已经拥有的生效语义,也不重新解释插件级 kill switch。
|
|
71
|
+
|
|
72
|
+
## 4. 从抗重复计数到可解释的使用统计
|
|
73
|
+
|
|
74
|
+
### 4.1 统计衡量什么
|
|
75
|
+
|
|
76
|
+
原始调用次数衡量执行量,不能稳定衡量常用程度。一个异常循环调用一万次,或一个任务创建几十个子代理,都不应抵消许多独立任务没有使用该能力的事实。因此使用会话家族作为贡献单位:一个主会话及其全部后代代理对同一能力最多贡献一次使用。
|
|
77
|
+
|
|
78
|
+
对能力 c、统计范围 s,取其最近 N 个合格会话家族组成窗口 W。每个家族只有“实际可用”与“实际使用”的证据,覆盖率为:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
coverage(c, s) = 窗口内实际使用 c 的家族数 / 窗口内 c 实际可用的家族数
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
N 按能力和范围解释,不是先取全工作区最后 N 次聊天,再把缺失能力的聊天填成未使用。能力从未提供或已关闭的家族不进入分母;完整和按需都属于可用,按需入口未在目录逐项展示不等于关闭。没有分母时结果是无样本,不是 0%。
|
|
85
|
+
|
|
86
|
+
假设一个窗口内 A 在 20 个家族实际可用,其中 8 个使用过,覆盖率为 40%。这 8 个中的某一家族继续调用一万次,仍为 40%。另外 30 个没有 A 的家族不影响分母。项目搁置一个月也不自行降低这 20 个样本的权重;只有新的合格家族替换最旧样本。
|
|
87
|
+
|
|
88
|
+
工作区是主要统计范围。用户全局数据只在工作区证据不足时提供冷启动参考,不能把两个层级重叠的同一家族相加成更多观测。用户应能看见选择实际依据了哪一层、样本数、窗口和回退原因。
|
|
89
|
+
|
|
90
|
+
工作区身份和家族身份是两条独立关系。子代理可能在不同工作区执行,统计写入进程的当前目录不能代替能力实际可用和被使用的工作区。具体归属规则需要覆盖工作区切换、同一路径的不同表示和跨工作区后代;无论如何归属,同一能力在用户全局范围中仍只接受同一家族一次贡献。
|
|
91
|
+
|
|
92
|
+
### 4.2 证据必须区分可用、调用、加载与成功
|
|
93
|
+
|
|
94
|
+
统计以宿主真实身份与执行事实为输入,不从模型自然语言、源码里的工具名称或原始日志文本猜测使用。查询能力描述、列出候选名称和 cold replay 不构成这些候选能力的新使用。统计观察本身不调用模型,也不执行被观察能力。
|
|
95
|
+
|
|
96
|
+
各类能力的使用证据需要在实现前固定口径。建议以“真实进入能力 owner 的一次调用”为工具使用依据,单独保留完成、失败和取消结果;实际执行后失败仍能表明该能力被需要,不能只统计成功调用。参数校验或权限决定已经阻止分派的请求不能伪装成执行,自动重试和历史事件重读不能产生额外家族权重。
|
|
97
|
+
|
|
98
|
+
Skill 的目录查询不是正文使用。实施建议以实际正文加载并被接受进入模型上下文作为可观测的调用证据,同时明确这不证明模型随后正确遵循了正文。MCP 资源的目录出现不表示每个资源都被使用;共享列表或读取工具自身的调用、某个来源或资源的访问,应按各自身份记录,不相互冒充。这里的事件判据必须经宿主公共契约验证,再固定为统计格式和测试契约。
|
|
99
|
+
|
|
100
|
+
家族标识来自真实的主子代理关系。不能根据会话标题、工作区相同或提示词自称子代理来合并。统计家族相同也不意味着代理共享权限、能力集合、工作区绑定或 REPL 状态。
|
|
101
|
+
|
|
102
|
+
### 4.3 进行中家族与恢复后的修订
|
|
103
|
+
|
|
104
|
+
尚在运行的家族不能因为暂时没有调用某能力,就被当成已经完成的负样本;主代理 idle 也不能证明全部后代结束。历史评估已经出现主进程退出而子请求未结算的情况。
|
|
105
|
+
|
|
106
|
+
实施建议将进行中观测与可用于分配的样本分开,在宿主可证明的家族活动结算边界形成样本。会话续接仍沿用同一家族身份:后续真实使用可以修订原样本的使用位,不新增样本,也不因重复恢复重新进入窗口前列。窗口顺序需要一个稳定的资格序号,不能采用统计文件最后写入时间。
|
|
107
|
+
|
|
108
|
+
上述结算建议必须先通过真实会话续接、子代理取消和进程恢复验证。如果宿主不能提供足够的结束证据,需要先明确可观察的结算边界及其偏差,再让统计参与自动分配;不能为了尽快获得样本,把缺失事实当成未使用。缺失、损坏或无法对账的统计可以失去分配资格,但不应阻止当前合法计算。
|
|
109
|
+
|
|
110
|
+
统计存储只需保存重建这些判定所需的身份、资格和使用证据、版本及汇总,不复制用户正文、工具参数或结果内容。写入应当幂等,并适应多个会话并发和进程中断。具体保存位置、原子写入方法、保留量与格式代际在实现验证后确定;不能先约定一个无法恢复或无界增长的日志格式。
|
|
111
|
+
|
|
112
|
+
### 4.4 覆盖率的局限与校准
|
|
113
|
+
|
|
114
|
+
完整说明更容易被模型看到,按需能力的使用率可能因此较低。覆盖率反映的是给定披露环境中的观察使用,不能直接称为任务的真实潜在需求。分母排除不存在的能力解决不了这种选择偏差。
|
|
115
|
+
|
|
116
|
+
因此,原始观察应保留当时的披露方式和方案版本,以便评估时解释差异;不能用自动计算出的分数反过来证明自动策略正确。校准应使用冻结的普通任务和检索任务,检查长尾能力能否被找到以及总成本是否下降。无需为了“探索”在活动会话中随机重新分配能力。
|
|
117
|
+
|
|
118
|
+
待校准参数包括窗口 N、最小样本量、完整披露阈值、说明长度的权重,以及是否需要升降不同阈值来降低新会话之间的抖动。这些数值必须有确定性样本和任务评估的依据,不能把维护者个人环境里的使用频率变成全体用户默认值。
|
|
119
|
+
|
|
120
|
+
## 5. 披露预算要减少总成本,而不是制造查询链
|
|
121
|
+
|
|
122
|
+
### 5.1 完整、按需与关闭具有不同含义
|
|
123
|
+
|
|
124
|
+
完整披露提供 owner 定义的完整调用契约,包括正确调用所必需的类型依赖和约束。它不把程序内能力改成顶层直接工具。Skill 的完整披露只到目录说明,正文始终按实际需要加载。
|
|
125
|
+
|
|
126
|
+
按需披露意味着说明延后提供,能力仍然属于有效集合。导航可以按用途组织并提供搜索入口,无需把每个长尾名称永久写入提示词。模型应能以一轮查询尽量取得匹配的完整契约,而不是被要求固定执行 `tree → find → inspect` 三次模型交互。
|
|
127
|
+
|
|
128
|
+
关闭则是从有效环境中移除。说明、搜索命中、Skill 目录、适用的资源来源和 REPL 成员应一致体现缺席,不留下可调用占位再报“禁止调用”。关闭也不是撤销已经发生的外部效果,不删除用户历史消息,不构成 Node 环境的安全隔离。
|
|
129
|
+
|
|
130
|
+
### 5.2 分开预算,合并计量
|
|
131
|
+
|
|
132
|
+
需要明确约束四类文本:默认完整契约、能力导航与检索响应、压缩后的说明恢复,以及结果与日志预览。它们生命周期不同,不能用一个条目数量上限代替全部文本预算;在任务评估中又必须合并计入总输入成本。
|
|
133
|
+
|
|
134
|
+
契约成本应包含其实际投递形式、必要公共类型、指引和包装。共享依赖只在实际去重后扣除,不能按工具数量估算。优先使用当前路由可用的本地计量接口;只能估计时,明确单位和误差边界,provider 的实际 usage 仍是最终成本证据。计量不得为每次普通调用发起付费模型请求。
|
|
135
|
+
|
|
136
|
+
说明放在哪里同样影响成本。现有契约要求配置、模型路由和原生能力视图不变时,插件系统文本与有序 schema 字节稳定,不能仅因不同会话的统计不同就增加例外。实施建议通过 owner 支持的公共组合移除默认全量 SDK 中被管理的重复说明,保留固定的语言与发现入口,在首个被接受的模型步骤前以有来源的会话目录提供该方案的完整契约;之后的展开、刷新和恢复也走可重建的会话消息。首轮即可直接使用的完整契约不能延迟到第一次调用之后。具体公共组合路径需在阶段一证明,不能一边保留原来的完整 SDK,一边追加新目录后声称已经优化。
|
|
137
|
+
|
|
138
|
+
预算算法先容纳显式完整项,再对未指定项选择有效统计或基线支持的候选,采用确定性排序与裁决。稳定的相同输入必须得到相同排序和字节。单项完整契约过长时不能截断成貌似完整的 schema;自动选择可以保持按需,单项显式完整则显示超额。预算超额允许用户选择,不代表可以越过模型实际上下文容量。
|
|
139
|
+
|
|
140
|
+
检索响应同样需要有界。建议优先返回预算内最匹配的完整契约,并明确还有哪些匹配没有展开;一个契约本身放不下时提供可继续获取的入口,不能声称已经交付完整说明。公开接口是否扩展现有 `find/inspect` 或新增组合入口,要兼顾原调用兼容性,但不增加一套平行能力索引。
|
|
141
|
+
|
|
142
|
+
### 5.3 检索与初始常用集
|
|
143
|
+
|
|
144
|
+
首轮实现优先采用确定性名称、词项、owner 提供的描述及可维护的关键词索引,验证中文、英文和典型任务表达。当前连续短语匹配是可复用的输入,不是检索质量已经足够的证据。语义增强若需要额外模型请求,必须另有明确授权、预算和用量记录,不能作为隐藏的默认学习成本。
|
|
145
|
+
|
|
146
|
+
初始常用集是一份真正可编辑的配置,不能只有不可修改的代码常量。建议候选覆盖文件定位与读取、内容检索、必要的执行和修改入口;实际条目必须解析为当前宿主可用的准确身份,不能把这些用途名称当作猜测工具名的分派规则。安装中不存在、被关闭或超出自动说明预算的项,不因位于推荐表就凭空出现。
|
|
147
|
+
|
|
148
|
+
用户应能从设置中看到推荐来源、实际选择和未选择原因,并修改基线或创建单项显式覆盖。初始常用集不是伪造的使用历史;统计有效且充分后可以影响未指定项的新会话分配,但不会改写用户的显式配置。
|
|
149
|
+
|
|
150
|
+
## 6. 会话稳定性决定方案的生命周期
|
|
151
|
+
|
|
152
|
+
### 6.1 方案和实时宿主事实不是同一个对象
|
|
153
|
+
|
|
154
|
+
会话开始时计算并冻结能力方案,记录配置修订、能力身份与契约修订、完整和按需集合、显式关闭、预算和选择原因。恢复会话时重建同一方案,而不是拿最新统计重新计算。活动会话中的成功调用只更新统计证据,不触发当前方案重排。
|
|
155
|
+
|
|
156
|
+
升级前已经存在、没有新方案记录的会话也不是新会话。迁移应保留其原有能力提供方式,直到用户主动刷新建立受管方案;不能把缺失字段解释为允许按最新统计重排。合法旧格式、统计损坏和方案记录损坏必须分开识别,方案恢复先寻找可验证的记录与刷新提交。无法证明旧方案时明确报告缺口,不伪造恢复成功,也不把插件历史 metadata 的损坏变成未来合法计算的永久失败;具体收缩和继续执行仍服从现有宿主及 PTC 恢复契约。
|
|
157
|
+
|
|
158
|
+
稳定方案只能约束本插件自己的选择,不能冻结宿主权限、撤销已发生的 owner 卸载,或保证外部 MCP 服务持续在线。宿主能力真正消失、定义不兼容或策略收缩时,以实际宿主事实为准,并通过已有公共生命周期提供准确诊断和必要的模型通知;不能维持虚假的可调用契约,也不能趁机重新排名所有无关能力。
|
|
159
|
+
|
|
160
|
+
能力身份应能区分来源与成员,不能只用一个显示名称把两个不同 provider 的工具合并。实施建议把稳定能力身份与契约修订分开:前者用于配置和统计归属,后者用于缓存、说明恢复与兼容性验证。纯描述变更与语义不兼容变更如何继承统计,必须通过有判别力的案例后确定;不能假定同名即同一能力,或每次文案修改都丢失全部统计。
|
|
161
|
+
|
|
162
|
+
每个 agent 只在自己的宿主 scope 内建立方案。家族统计不授权子代理继承父代理没有授予的能力。新子代理使用哪一份配置修订、父会话刷新是否包含已有子会话,需要明确公共生命周期后固定;实施建议先保持每个已存在会话各自稳定,不把一次“刷新当前会话”扩张成未声明的全家族广播。
|
|
163
|
+
|
|
164
|
+
### 6.2 主动刷新是一项完整转换
|
|
165
|
+
|
|
166
|
+
刷新命令为 `/capabilities refresh`。它由用户通过 DSH 公共斜杠命令入口触发,不要求用户发送一条让模型替自己执行的提示。命令操作本身不需要发起付费模型请求,但必须使模型在使用新环境前获得与生效方案一致的通知。
|
|
167
|
+
|
|
168
|
+
一次刷新应具有以下可观察顺序:
|
|
169
|
+
|
|
170
|
+
1. 读取当前配置和宿主能力事实,准备完整候选方案及差异,尚不改变当前有效方案。
|
|
171
|
+
2. 验证候选的说明、发现和执行投影都可应用;记录用户能理解的变化和预算超额。
|
|
172
|
+
3. 在宿主提供的安全生命周期边界应用。已经按旧环境生成或正在执行的 cell 不能中途混用新旧两套成员;等待和取消遵守宿主原有机制,不另建调度器。
|
|
173
|
+
4. 使实际运行时、发现目录与模型说明共同指向新方案,并持久化足够的版本和来源证据。
|
|
174
|
+
5. 通过公共模型消息或 accepted-step runtime context 投递变更通知。UI 命令回执另行报告实际完成、等待或失败状态。
|
|
175
|
+
|
|
176
|
+
若宿主只能在下一次接受模型步骤时完成通知,则保留明确的待生效状态,在该边界完成同步;不得仅因 UI 显示成功就假装模型已经知道变化。通知暂时受 suppression 约束时同样如此。具体提交与回滚协议必须证明不存在“新运行时配旧说明”的可观察窗口,不能假定公共 API 天然提供跨组件事务。
|
|
177
|
+
|
|
178
|
+
准备或验证失败时保留旧方案。提交过程发生故障时,应能从持久化事实判断旧方案还是新方案完整生效;不能留下混合方案、重复通知或未报告的半次刷新。重复命令、取消、会话释放和进程重启都应进入同一转换协议,不重复执行原能力的外部效果。
|
|
179
|
+
|
|
180
|
+
### 6.3 关闭必须覆盖实际入口
|
|
181
|
+
|
|
182
|
+
关闭验证至少包含生成 SDK、发现查询、实际 `tools` 成员,以及 Skill 和资源共享加载入口中的成员视图。`tools.restrict()` 目前只约束继承工具,scope 自己注册的工具不受同样的 mask 过滤;`guard()` 的调用后拒绝语义也不满足本设计。因此不能只接一层工具过滤就宣告所有来源已经支持关闭。
|
|
183
|
+
|
|
184
|
+
刷新前保存的工具别名、捕获工具引用的函数及其他 request-owned 引用,也应加入验证。仅重新生成下一 cell 的 `tools` 对象未必足够。旧引用的处置必须符合已有 lease、binding 和状态连续性契约;若公共入口不足以实现承诺,应明确记录这一覆盖缺口,不用拒绝占位冒充移除,也不擅自清空整个 REPL 来换取通过。
|
|
185
|
+
|
|
186
|
+
模型历史中曾经出现过的能力说明不可能被假装从未存在。刷新通知需要准确说明当前环境的改变,并通过 owner 支持的替换或撤销关系使旧目录不再冒充当前目录;原始会话日志仍作为历史事实保留。
|
|
187
|
+
|
|
188
|
+
## 7. 压缩恢复和大结果处理服从同一成本目标
|
|
189
|
+
|
|
190
|
+
冻结方案不能保证按需展开过的说明永远留在上下文中。压缩后,模型可能仍需使用某个能力,却已看不到完整契约。重新投递所有历史说明会抵消压缩效果,完全不恢复又可能重复探索。
|
|
191
|
+
|
|
192
|
+
因此在独立预算内,只补回近期实际使用、此前已经展开、契约当前仍有效且当前模型表面已缺失的 API 说明。以真实使用证据确定近期性,以公共 ordered surface 和持久化来源确定是否仍可见;不因 raw log 中还有文本就认为模型仍然知道,也不把尚待投递的内容算成已送达。其余 API 继续按需取得,Skill 正文不自动补回。
|
|
193
|
+
|
|
194
|
+
说明恢复不改变完整和按需分配,也不证明任何变量仍有正确值。现有 binding 仍要求可重建的 journal ancestry 和精确的模型可见 provenance;本次方案没有授权新增默认 REPL 状态投影,不能通过恢复一段 API 文档保留已经不满足条件的计算状态。
|
|
195
|
+
|
|
196
|
+
大结果和日志则在进入模型上下文的展示边界做有界预览。优先复用 DSH 的 output retention、spill store 和 spill policy,保留完整展示内容的读取位置、截断事实及必要的读取说明。后续读取省略内容不能重新执行原工具,也不能把 spill 文本当成保留了任意类型与对象身份的 canonical 值。
|
|
197
|
+
|
|
198
|
+
当前 `maxOutputBytes` 默认 64 MiB,是执行或传输限制,达到限制可能影响 cell 或 worker。它不是模型预览预算,不能通过降低该值制造“更少输出”的假优化。程序接收的 canonical 值、模型展示、UI 展示和执行资源限制需要分别验证。
|
|
199
|
+
|
|
200
|
+
宿主已安装 spill 组件不等于每种部署都已启用有效预算。初始化时要核对实际公共组合和配置;已有宿主截断与插件预览不能重复包裹通知。spill 保存、内容定价或读取位置创建失败时,沿用宿主的数据保留语义并明确本次未能满足展示预算,不能静默丢失内容或把成功计算改成执行失败。若没有可证明的完整内容取回路径,则不能宣称预览功能已经满足设计。
|
|
201
|
+
|
|
202
|
+
## 8. 用同一来源连接配置、展示和执行
|
|
203
|
+
|
|
204
|
+
实施应围绕少量明确责任组织,而不是为工具、Skill 和资源各写一套互不一致的规则。下表给出责任与当前接入点;冻结环境格式为 `ptc-capability-environment/v1`,方案和统计格式见[组件说明](capability-planning-components.md)。
|
|
205
|
+
|
|
206
|
+
| 责任 | 输入与输出 | 当前实现接入点及约束 |
|
|
207
|
+
| --- | --- | --- |
|
|
208
|
+
| 配置和用户管理 | 独立开关、统计参数、基线、单项选择;有效配置与校验原因 | `internal/config-spec.js`、`internal/runtime-config.js`、`src/client-settings-view.js`;区分保存配置和当前会话方案 |
|
|
209
|
+
| 能力事实采集 | 公共 owner 的准确身份、schema、scope、说明和修订;派生描述快照 | `internal/capability-environment.js` 及宿主公开 registry;不拥有实际分派 |
|
|
210
|
+
| 统计归约 | 真实家族关系、可用与使用证据;有界可重建样本 | `internal/capability-statistics.js` 与 `internal/capability-statistics-store.js`;公共调用与会话事件,cold replay 和重复观察幂等,不改封闭 journal 来夹带无关事实 |
|
|
211
|
+
| 方案计算 | 配置、可用集合、有效统计、预算;确定性的会话方案和原因 | `internal/capability-plan.js`;不得在渲染和执行入口分别猜测分配 |
|
|
212
|
+
| 说明和发现 | 同一方案、owner 完整契约;SDK、目录、检索结果 | `internal/sdk-projection.js`、`internal/program-bindings.js`;保留参数、结果和必要类型语义 |
|
|
213
|
+
| 运行时投影 | 同一方案和实际 request-owned 能力;有效成员 | 现有 direct surface 与执行缝 owner;公共能力成员移除需独立证明 |
|
|
214
|
+
| 方案恢复和刷新 | 会话记录、当前方案、候选方案;一致生效和通知 | `internal/capability-environment.js` 及公共 commands、Session、maintenance;使用 accepted-step 与准确来源 |
|
|
215
|
+
| 结果预览 | 完成的 canonical 结果与展示内容;有界模型文本及取回位置 | 宿主 retention/spill 公共能力;不混入 canonical 计算与 journal 结算 |
|
|
216
|
+
|
|
217
|
+
持久化至少需要区分三件事:用户配置表示未来意图;统计表示已经观察到的使用;会话方案表示该会话已经生效的环境。把这三者合成一份会被实时覆写的文件,就无法在配置变化后稳定恢复旧会话。
|
|
218
|
+
|
|
219
|
+
方案记录和刷新事实应由公共会话持久化面支持,具有可校验的版本与来源。统计可以由其自身证据重建;不能仅凭新统计重新生成历史方案。统计损坏只撤销统计依据,方案损坏则意味着该会话环境没有被证明,两者需要不同诊断,不能共用“清空后按最新配置继续”的默认恢复。
|
|
220
|
+
|
|
221
|
+
统计归约与索引更新应使用增量事实和有界缓存。相同契约不在每次调用重新解析或重新计量,相同已接受消息不重复投递。统计数字、时间戳和排序过程不能进入稳定系统前缀;相同配置、模型路由和原生能力视图产生字节稳定的插件系统文本及有序 schema。会话方案属于动态会话事实,不是放宽这个前缀条件的第四个输入。
|
|
222
|
+
|
|
223
|
+
## 9. 按依赖顺序实施,每一步都有可区分的完成条件
|
|
224
|
+
|
|
225
|
+
### 阶段一:验证公共扩展覆盖并固定输入事实
|
|
226
|
+
|
|
227
|
+
首先建立小规模、无模型调用的能力组合探针,覆盖继承工具、scope 自有工具、Skill、MCP 工具、资源模板及已有工具引用。对每类记录公共事实来源、说明发布者、执行成员移除入口、恢复来源和缺失接口。读取安装包用于核验契约,不修改包。
|
|
228
|
+
|
|
229
|
+
这一阶段同时验证原生 SDK 的公共组合路径、真实家族身份、调用结算、会话恢复和命令通知入口。产物是一份可执行的覆盖矩阵,以及统计使用证据、资格顺序和方案修订的具体契约。若某类只能通过私有补丁、第二套分派或调用后拒绝实现关闭,该类不能获得“已支持”结论;公共契约缺口需要回到设计约束处理,不能转成静默降级。
|
|
230
|
+
|
|
231
|
+
完成条件是:每项已承诺能力类别都有可验证的完整接入路径,或明确的阻塞事实与需要解决的接口;任何未覆盖类别都不进入整体完成声明。这里先降低架构不确定性,再编写 UI 和自动排序。
|
|
232
|
+
|
|
233
|
+
### 阶段二:完成纯方案计算、手动配置和可恢复会话基线
|
|
234
|
+
|
|
235
|
+
先实现不依赖统计的手动配置、可编辑常用集、完整与按需预算、关闭集合及选择原因。用确定性输入固定结果,接入新会话和恢复路径,证明保存配置不改变已有方案。
|
|
236
|
+
|
|
237
|
+
随后接入能力说明、发现和实际执行集合,让单一方案同时决定各投影。这里先证明一项能力在完整、按需、关闭之间的区别,再扩展所有类别,避免统计掩盖投影不一致。
|
|
238
|
+
|
|
239
|
+
完成条件是:统计完全关闭或无法读取时,手动配置仍完整可用;活动会话、恢复会话和新会话遵守各自配置边界;显式完整的超预算行为可见且不丢契约;范围外能力不被管理。
|
|
240
|
+
|
|
241
|
+
### 阶段三:接入统计与自动分配
|
|
242
|
+
|
|
243
|
+
按已固定的事件契约归约家族样本,实现每家族贡献上限、实际可用分母、每能力窗口、工作区优先及全局冷启动。统计与方案之间只传递有效证据,数据不可用时退回手动基线。
|
|
244
|
+
|
|
245
|
+
使用确定性样本校准算法的性质,再接入新会话方案;不要在这一步引入模型辅助分类或无授权付费检索。用户能够看见使用率、样本量和分配理由,并用单项选择覆盖。
|
|
246
|
+
|
|
247
|
+
完成条件是:重复调用、增加后代、重放、并发写入和恢复均不能刷高权重;不存在的能力不被刷低;新统计不改活动会话;无样本与零使用率保持可区分。
|
|
248
|
+
|
|
249
|
+
### 阶段四:完成检索、刷新和说明恢复
|
|
250
|
+
|
|
251
|
+
将检索调整为有界、尽量一次取得完整契约的交互,保留现有发现 API 的兼容关系。完成用户刷新命令及其准备、生效、通知、取消和故障恢复路径,再接入压缩后的说明恢复。
|
|
252
|
+
|
|
253
|
+
完成条件是:模型不会面对新运行时配旧目录;UI 成功不能替代模型通知;重复恢复不会重复灌入说明;关闭成员不从其他目录或加载入口重新出现;普通计算状态不因刷新被无依据重置。
|
|
254
|
+
|
|
255
|
+
### 阶段五:接入大结果预览并完成配置界面
|
|
256
|
+
|
|
257
|
+
在模型展示边界复用宿主 spill 与 retention,证明可取回、无需重执行且 canonical 值不变。设置界面同时展示保存配置、当前会话方案、待刷新差异、统计回退原因与预算超额,不把这些解释全部塞给模型。
|
|
258
|
+
|
|
259
|
+
完成条件是:大返回值继续可在程序中计算,模型看到明确预览和有效取回入口;统计配置和手动配置独立;设置页、命令回执与模型通知分别表达自己真实拥有的事实。
|
|
260
|
+
|
|
261
|
+
### 阶段六:测量完整任务收益并确定默认值
|
|
262
|
+
|
|
263
|
+
先用确定性测试和无需模型的请求投影检查排除错误,再在单独授权的模型评估中比较普通任务质量和全家族 token。必要时增加“插件启用但本管理功能关闭”的诊断组,用于区分计算插件成本与本次优化贡献;最终验收仍必须对比整个插件关闭的原生 PTC。
|
|
264
|
+
|
|
265
|
+
固定任务、评分、统计初态、初始常用集和参数后运行,不根据中途结果删除不利任务或调整默认值后混报同一实验。冷启动和有足够历史样本的情况分别测量,训练或校准数据不能冒充未见任务结果。默认开关、预算与阈值在证据充分后确定,不在计划阶段虚构最优数字。
|
|
266
|
+
|
|
267
|
+
完成条件是:普通任务满足质量与总 token 目标,同时所有能力与生命周期契约成立。若只缩短前缀、提升少数高级任务或减少某种调用而总成本仍更高,本阶段未完成。
|
|
268
|
+
|
|
269
|
+
## 10. 验证必须能拒绝看似成功的错误实现
|
|
270
|
+
|
|
271
|
+
以下反例既用于测试选择,也用于后续独立审查。它们不是机械要求每行新增一个测试;应由拥有该关系的最小用例和必要集成证据共同覆盖。
|
|
272
|
+
|
|
273
|
+
| 需要证明的关系 | 判别场景 | 错误实现应暴露的差异 |
|
|
274
|
+
| --- | --- | --- |
|
|
275
|
+
| 手动配置独立 | 同一显式按需项分别处于统计关闭、损坏和高覆盖率下 | 任何状态都不能把它改为完整或关闭 |
|
|
276
|
+
| 完整与按需不同于关闭 | 同一能力依次完整、按需、关闭 | 按需仍能发现并执行,关闭时各供给入口都没有成员 |
|
|
277
|
+
| 家族权重有上限 | 一家族一万次调用并创建多个实际子代理,对照一次调用 | 两者对该能力的统计贡献相同 |
|
|
278
|
+
| 分母来自可用证据 | 加入大量没有该能力、关闭能力或仅创建未开始工作的会话 | 不得因此稀释使用率 |
|
|
279
|
+
| 无样本不是零 | 新安装能力与长期可用但从未使用的能力 | 冷启动和真实低使用率得到不同依据 |
|
|
280
|
+
| 恢复不刷新 | 保存新配置、更新统计后恢复旧会话,或升级前没有方案记录的会话 | 原有提供方式保持;新会话可以不同;缺字段不授权自动重排 |
|
|
281
|
+
| 损坏的责任不同 | 合法旧格式、统计损坏、方案提交损坏和普通 journal 损坏 | 不混用回退,不伪造环境或重放效果,不永久阻断未来合法计算 |
|
|
282
|
+
| 刷新是一致转换 | 执行中刷新、取消、通知受限、提交途中重启 | 不出现混合环境或虚假成功,也不重复外部效果 |
|
|
283
|
+
| 移除覆盖真实入口 | scope 自有工具、Skill 显式加载、MCP 共享读取及保存的工具引用 | 单纯过滤 SDK 或只加 guard 无法冒充通过 |
|
|
284
|
+
| 目录有界且可发现 | 数千长尾成员及未在导航列名的真实任务能力 | 不无界列名,仍可检索到正确完整契约 |
|
|
285
|
+
| 契约长度被真实计量 | 少量极长 schema、共享类型和显式完整超额 | 条目数预算、截断 schema 或漏算类型均不能通过 |
|
|
286
|
+
| 说明恢复有证据 | 正文仍可见、刚被压缩、契约失效和仅查询未使用四种情况 | 只恢复符合条件的说明,不恢复 Skill 正文或改变方案 |
|
|
287
|
+
| 展示不改变程序值 | 大对象继续计算、读取 spill 内容、spill 失败 | 程序值不变,读取不重新执行,失败不伪装成成功截断 |
|
|
288
|
+
| 稳定前缀 | 相同有效输入,后台统计与计数不断增长 | 插件稳定文本与有序 schema 字节不漂移 |
|
|
289
|
+
| 全家族成本 | 主代理已结束而子请求仍在进行或用量缺失 | 不得按零计费、只报根会话或宣称已完整结算 |
|
|
290
|
+
|
|
291
|
+
现有聚焦入口可从 `test/program-bindings.test.js`、`test/sdk-projection.test.js`、`test/direct-surface-policy.test.js`、`test/plugin-program-bindings.test.js`、`test/runtime-messages.test.js`、`test/runtime-config.test.js`、`test/plugin-settings.test.js` 和 Client 设置行为测试扩展。新增责任需要新增相应测试 owner,并同步 `semantic-obligations.json` 的实现与证据图。
|
|
292
|
+
|
|
293
|
+
开发期间先用 `npm run test:backend:focus -- --list` 定位后端用例,再按真实 owner 和用例名选择 `test:backend:focus`;Client 使用 `test:client:focus`,布局和原生/回退行为分别使用 `test:client:layout:focus`、`test:client:fallback:focus` 的选定 case。不得用完整 gate 发现失败。针对新证据修复后,只重跑受影响责任。
|
|
294
|
+
|
|
295
|
+
准备交付或提交证明时才按仓库流程冻结 review plan、开展独立责任审查,并对稳定候选运行一次适用的完整 gate:活动 ledger 有未终结 finding 时用 `npm run verify`,否则用 `npm run check`。聚焦测试不授权提交,已有且仍匹配的完整证明不重复运行。普通开发不运行 coverage;发布新版本时才按发布流程运行。文档、独立审查和验证证明各自拥有不同完成条件。
|
|
296
|
+
|
|
297
|
+
## 11. 模型评估与上线判据
|
|
298
|
+
|
|
299
|
+
模型评估需要单独的明确授权,以及 provider、model 和 credential-variable 配置。使用隔离的 DSH home 与工作区,不修改日常 profile 或输出凭据。`test:ab` 先以 `DSH_PTC_AB_CONFIG_ONLY=1` 执行对应配置检查;`test:expensive` 使用 `DSH_PTC_ACCEPTANCE_CONFIG_ONLY=1`。配置检查成功只说明配置就绪,不说明模型行为正确。本计划不授权付费运行。
|
|
300
|
+
|
|
301
|
+
当前这两个仓库评估 runner 经 `pwsh.exe` 调用 Windows DSH,支持 Windows 工作区及 WSL 挂载的 Windows 工作区,不支持原生 Linux/macOS DSH 运行。后续执行应先验证这个前提,并保持 Windows 与 WSL 的运行环境隔离;若目标是原生 Linux 评估,需要先实现并验证相应 runner 支持,不能把现有命令的配置检查解释为跨平台就绪。
|
|
302
|
+
|
|
303
|
+
主对照固定同一普通任务、模型路由、宿主能力、工作区起点和评价规则,比较插件关闭与候选插件启用。普通任务为主要验收层;静态 import、跨 cell 状态和复杂值等能力探针单独报告,不能用基线缺少某种高级语法的失败替代普通任务收益。
|
|
304
|
+
|
|
305
|
+
每次实验至少回答以下问题:
|
|
306
|
+
|
|
307
|
+
- 任务是否真实完成,最终产物与关键说明是否正确;质量差异是否由盲评和独立 oracle 支持。
|
|
308
|
+
- 所有实际家族成员是否纳入;未结算请求、物理重试或缺失 usage 是否仍有未知成本。
|
|
309
|
+
- 缓存输入、未缓存输入、输出分别多少;reasoning、缓存写入等 provider 细项按其口径披露,重叠项不重复求和。
|
|
310
|
+
- 首次说明、按需探索、错误修复、结果取回和压缩后恢复各贡献了多少成本。
|
|
311
|
+
- 在冷启动、统计成熟、长尾能力、短任务和委派任务中,结果是否一致;哪些分层仍有回归。
|
|
312
|
+
|
|
313
|
+
不能用日志中的逻辑步骤数推断未记录的物理请求数,也不能把未知费用填成零。若无法完整对账,报告必须限制结论,不能用更低的已记录 token 宣称完整任务成本下降。模型结果展示文本也不能替代 canonical 值作为类型或精确结果 oracle。
|
|
314
|
+
|
|
315
|
+
质量门槛、配对方式、样本量及不确定性报告方式应在付费运行前固定。报告同时保留全部普通任务与双方都完成的次要分层,避免筛掉失败任务后得到漂亮均值;总量与逐任务差异同时展示,防止少数超大任务掩盖普遍回归。只比较费用时还需要明确价格口径,不能把 token、缓存和账单互相替代。
|
|
316
|
+
|
|
317
|
+
正式启用默认值前,必须同时通过语义与生命周期验证、用户配置可操作性验证、当前官方 DSH 的公共面集成验证和完整任务收益验收。尚未通过时保留显式实验配置和准确限制,不将“功能已经接上”表述为“优化已经完成”。
|
|
318
|
+
|
|
319
|
+
## 12. 尚需证据收敛的细节
|
|
320
|
+
|
|
321
|
+
这些问题不重开已经确认的产品原则。它们都有明确的下一步和完成判据;若证据表明必须改变稳定契约,才重新提交该具体冲突。
|
|
322
|
+
|
|
323
|
+
| 问题 | 当前实施起点 | 收敛证据与未通过后果 |
|
|
324
|
+
| --- | --- | --- |
|
|
325
|
+
| 各能力类别能否一致移除 | 从公共 owner 视图及作用域集成,首先检查自有工具和共享加载器 | 阶段一逐类探针;缺失接口时保留缺口,不声称全范围完成 |
|
|
326
|
+
| 家族何时具有可计分资格 | 进行中观测与可用于分配的样本分开,续接修订同一身份 | 真实结束、续接、取消及子代理未结束案例;无证据不得制造负样本 |
|
|
327
|
+
| Skill、失败调用、资源的使用判据 | 使用实际加载或分派证据,结果状态另存 | 验证调用入口与 accepted-step;不以描述查询或语义猜测代替 |
|
|
328
|
+
| 身份和契约变化如何继承统计 | 来源身份与契约修订分开 | 同名不同源、仅文案改变、不兼容 schema 三类反例 |
|
|
329
|
+
| 工作区与家族如何交叉归属 | 以真实工作区证据计入局部范围,全局仍按家族去重 | 跨工作区后代、工作区切换及路径别名;不能用写入进程目录归属 |
|
|
330
|
+
| 子代理采用哪个配置修订 | 每个既有会话稳定,刷新当前会话不隐式广播 | 验证新建和恢复子代理的公共 scope;不得扩张能力或统计权重 |
|
|
331
|
+
| 刷新的安全提交与通知 | 候选准备后在宿主允许边界一致生效 | 故障注入、重启、suppression 和旧引用;无完整提交证据不报成功 |
|
|
332
|
+
| 参数、初始条目和默认开关 | 配置可编辑,数值和实际能力身份由校准确定 | 确定性样本、检索评估与预先固定的普通任务 A/B |
|
|
333
|
+
| 统计造成的披露偏差 | 记录披露方式,使用独立任务评价 | 长尾可发现性和分层总成本;高覆盖分数本身不算收益 |
|
|
334
|
+
| 持久化和性能边界 | 三类事实分离、幂等增量归约、有界缓存 | 并发写入、中断恢复、长期窗口滚动及大目录负载 |
|
|
335
|
+
|
|
336
|
+
## 13. 实现定位与文档交付
|
|
337
|
+
|
|
338
|
+
正文已包含执行本计划所需的产品关系。下列索引只用于核对拥有者,不要求先读完所有文档才能理解方案。
|
|
339
|
+
|
|
340
|
+
| 来源 | 拥有的事实 |
|
|
341
|
+
| --- | --- |
|
|
342
|
+
| [CONTEXT.md](../CONTEXT.md)、[ADR 0038](adr/0038-freeze-session-capability-plans.md) | 术语、范围、独立配置、统计口径和稳定会话契约 |
|
|
343
|
+
| [当前上下文管理](context-management.md)、[能力投影](capability-projection.md) | 当前实现边界及与后续方案的区别 |
|
|
344
|
+
| [架构](architecture.md)、[运行时参考](runtime-reference.md) | 提示前缀稳定性、模型消息和运行时已有契约 |
|
|
345
|
+
| [数据平面](program-data-plane.md)、[ADR 0034](adr/0034-keep-program-values-separate-from-output-projections.md) | canonical 值与模型展示的区别 |
|
|
346
|
+
| [历史评估](evaluations/command-goat-deepseek-v4.1-flash.md)、[评估协议](evaluation.md) | 已知成本证据、局限、隔离与模型评估方法 |
|
|
347
|
+
| [验证流程](verification.md)、[语义验证](semantic-validation.md) | 聚焦诊断、独立审查、交付证明与语义 owner 图 |
|
|
348
|
+
|
|
349
|
+
宿主集成核验从安装包公开说明和类型入口定位 `dsh-tools`、`dsh-skill`、`dsh-tool-skill`、`dsh-mcp-client`、`dsh-mcp-resources`、`dsh-commands`、`dsh-spill-policy`、`dsh-spill` 和 `dsh-output-retention`。这些名称是核验入口,不是字面版本白名单,也不证明某个部署已经组合或启用了相应功能。
|
|
350
|
+
|
|
351
|
+
每个实施阶段结束后更新本计划中对应的现状与待证项目,同时让详细设计和实现事实各有准确归属;不把本文件变成逐次运行日志。产品行为真正实现时,同步更新中英文 README、上下文管理、能力投影、运行时参考和相关配置说明;统计或方案的持久化格式定型时更新其 ADR。临时审查记录、评估输出和凭据不进入这些设计文档。
|
|
352
|
+
|
|
353
|
+
本项工作的完成意味着模型在稳定、准确且可由用户控制的环境中,以不下降的任务质量和更低的完整任务 token 成本完成普通工作。缺少任一项时,应报告已经完成的能力与仍未成立的收益,不以设计文档、局部测试或一次短提示词截图代替完整交付。
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# 上下文管理公共接口覆盖
|
|
2
|
+
|
|
3
|
+
同一冻结会话方案由 `internal/capability-environment.js` 拥有,供 prompt、检索与编译前 program bindings 使用。插件使用发布包的公共组合入口,不修改宿主源码或安装包;DSH 继续拥有正式 validation、dispatch、authority 和 cell lease。
|
|
4
|
+
|
|
5
|
+
| 责任 | 实施路径 | 可执行证据 |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| 继承及 scope 自有工具 | 在 execution seam 提供的 `tools` descriptor 上移除关闭成员;仅调用宿主原函数 | `test/plugin-program-bindings.test.js` 的受管工具编译测试、`test/capability-environment.test.js` |
|
|
8
|
+
| 原生 SDK | `system-prompt/assemble` 将全量 SDK 替换为固定语言与发现 bootstrap,完整契约进入首轮源消息;保留 `complete` section | `test/plugin-program-bindings.test.js`、`test/context-host-contract.test.js` |
|
|
9
|
+
| Skill | 公共 scope provider 提供关闭条目的不可调用 winning entry;目录、加载和显式用户调用共用该视图;刷新枚举原 provider;稳定投影不重复 invalidate,父子并行目录读取不因无变化准备失效;暂时不完整保留已证明 Skill,不发布新资格 | `test/capability-environment.test.js` 的真实 SkillRegistry 测试 |
|
|
10
|
+
| MCP 工具 | 普通工具投影包含 `mcp__` 成员;server instructions 作为完整契约依赖按方案披露 | `test/capability-environment.test.js`、`test/context-host-contract.test.js` |
|
|
11
|
+
| MCP 资源和模板 | 以公共 server 目录为能力单元,筛选发现说明及共享加载器 selector;可用 server 为空时移除共享成员 | `test/capability-environment.test.js` 的共享 selector、空域与刷新反例 |
|
|
12
|
+
| 旧工具引用 | 捕获的 callable 继续受原 cell lease 约束;普通函数在下一 cell 读取重新投影的 program namespace | `test/plugin-program-bindings.test.js` |
|
|
13
|
+
| 首轮发布、刷新与通知 | 首轮方案在请求前组装,经 accepted-step 在受保护 system head 后、未提交历史的新任务前提交一次;导航和显式完整契约保持统计变化前缀;已初始化会话的 `/capabilities refresh` 经公共 `runMaintenance()` 以单次 `Session.append` 提交新方案及模型通知;首次接受前的刷新回执说明待接受,取消或写入失败不伪造提交 | `test/capability-environment.test.js` 的实际跨会话请求、统计变更前缀、真实 AgentLoop 与严格恢复 oracle |
|
|
14
|
+
| 恢复与压缩 | 从 source-backed 方案恢复冻结环境;已接受且校验的本会话契约更新保留最近 Skill 视图,目录暂时不完整不复活已撤下项;正式结果元数据记录展开和使用;ordered surface 决定说明去重 | `test/capability-environment.test.js` 的 Session round trip 与 replacement 测试 |
|
|
15
|
+
| 家族统计 | 公共 session lineage、turn/step 结算与家族 census,配合原子文件锁;未知结算不作负样本 | `test/capability-statistics.test.js`、`test/context-host-contract.test.js` |
|
|
16
|
+
| 结果和日志 | 独立 spill policy 事件上下文读取宿主 spill 服务;canonical 值保持完整,存储失败保留原展示 | `test/context-result-preview.test.js` |
|
|
17
|
+
| 设置观察 | 独立设置、可搜索能力选择、统计开关与数值输入、有效方案、选择原因、使用覆盖率、预算超额及待刷新状态 | `test/client-runtime.spec.js` 的能力设置测试 |
|
|
18
|
+
|
|
19
|
+
`tools.restrict()` 仅影响继承层,不能单独承担 scope 自有工具的移除。这一宿主行为由公共探针保留为对照;PTC Plus 的实际执行入口使用统一编译准备投影,因此它不再是本功能的实施阻塞。投影后的工具参数、canonical 结果和宿主错误保持原语义,没有第二套分派 registry。
|
|
20
|
+
|
|
21
|
+
资源和模板按 server 管理,同一 server 下的 URI 与模板继续由宿主列表与读取协议拥有。插件不为组装 prompt 枚举远程资源或读取 Skill 正文。无模型测试证明执行和生命周期关系;普通任务质量与全家族 token 收益仍需独立授权的任务对照,不能从 prompt 字节缩短推断。
|
|
22
|
+
|
|
23
|
+
能力刷新用户入口的证据:`test/context-host-contract.test.js` 从正式 CommandUiRuntime 的输入匹配进入公共 CommandRuntime,分别验证带参数刷新、裸命令检查、未知参数与零模型请求。`test/client-runtime.spec.js` 覆盖星光当前会话、设置明确目标、管理/绑定关闭、取消、失败及失效回执;`scripts/client-fallback-smoke.mjs` 使用候选的共享刷新组件检查实际按钮与目标。只读 `targets` 的无方案准备行为由 `test/capability-environment.test.js` 验证。
|
|
24
|
+
|
|
25
|
+
MCP 两级控制由 `test/capability-environment.test.js` 验证 server 工具/资源同步关闭、单工具配置保留、其它 server 独立及刷新边界;正式 Host 无首轮副作用观察由 `test/context-host-contract.test.js` 验证,Client server 分组和独立子项写入由 `test/client-runtime.spec.js` 验证。
|
|
@@ -4,6 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
本文拥有 `dsh-ptc-plus` 的 journal、两阶段确认和冷恢复契约;`internal/session-journal-schema.js` 拥有封闭字段集合与版本常量,`internal/session-journal.js` 拥有校验、迁移与创建,`internal/session-journal-recovery.js` 拥有事件关联与分支折叠,`internal/session-runtime.js` 拥有 live kernel;它们提供实现证据。
|
|
6
6
|
|
|
7
|
+
## 日志读取与派生事实
|
|
8
|
+
|
|
9
|
+
当前 Host 的历史读取由 `sessionQuery.observeSession` 提供。runtime bridge 为一次顶层调用取得一个不可变 event/cursor/header 切点,释放 observation lease 后仍消费其不可变 events;editor 在自身正式 start 切点捕获目标;派生执行开始前另取一个不可变切点,实际 `Session.append` 返回的派生 start 序号拥有该执行身份。各执行的恢复、call identity、provenance 和 no-op 确认只消费其已选切点,不混入较新的 live log。观察切点与当前 surface 不同时,按该切点的公开 surface operations 重建顺序,而不是用较新的 replacement 撤销较早观察的证据。生产路径不调用 `snapshotEvents`、`eventAt` 或 `ownEvents`。
|
|
10
|
+
|
|
11
|
+
新会话的顶层 submission 独立拥有执行上下文。委派子代理即使在父 cell 或原生子执行的能力调用期间启动,也按子会话 ID 读取上述公开 observation 与 ordered surface;不能继承父会话的日志切点、持久调用序号、组合工具结算或原生子执行 handoff。同会话派生 edit 使用新 admission,并只保留已证明的根来源、派生执行序号、不可变观察切点与组合结算;不能复用已释放的根 admission。
|
|
12
|
+
|
|
13
|
+
同步 presentation 从 host-only `ptcPlusSessionLog` 单元读取。该单元与批量 journal fold 共用单事件 timeline 转移;checkpoint 仅保存关联所需的最小 call、规范 journal、身份及当前/历史 runtime records,不复制原始事件日志。pruned result 的非 content 身份保存为确定性 SHA-256 摘要。提示的已见身份、最高 ordinal、cooldown 和成功后的未解决计数在事件进入时更新;装配不扫描历史提示。checkpoint 是可丢弃的派生缓存,不证明 model knowledge、成功 initialization 或 cold replay。状态版本、schema 和 Host 的 watermark/restore 规则共同限定缓存使用,损坏或过时缓存必须重新折叠原日志。
|
|
14
|
+
|
|
15
|
+
旧 array-backed session 使用同一转移的批量读取回退。缺少当前公开 reader/投影或历史 events 不是数组时明确诊断,不静默宣称空历史;不存在 session 的非会话调用仍委托其原 owner。投影注册随插件/controller 生命周期释放,运行时关闭后只保留日志事实以撤回旧 PTC 消息,不保留 worker、工具或默认模型状态投影。具体决策见 [ADR 0032](adr/0032-own-session-log-facts-in-a-host-only-projection.md)。
|
|
16
|
+
|
|
17
|
+
结果的 content-only 重发布保留原 settlement 的位置与规范证据,不重新结算 edit claim,也不生成新的成功或编辑目标。原结果缺失时,已有 call 位置限制重建事实的 chronology,不能越过较新的执行。提示身份保留原投递位置,因此后获知的较早成功不能清空其后的未解决提示。
|
|
18
|
+
|
|
19
|
+
checkpoint 准入由 timeline 表示 owner 校验 typed payload、call/entry 对应、edit claim、规范 journal、派生 run 与 transcript 计数,再由投影复用。损坏嵌套状态在 suffix apply 前拒绝;Host 的水位不能替插件证明这些内容。
|
|
20
|
+
|
|
7
21
|
## 恢复承诺
|
|
8
22
|
|
|
9
23
|
PTC Plus 的正确承诺是:
|
|
@@ -16,7 +30,7 @@ PTC Plus 的正确承诺是:
|
|
|
16
30
|
- restore 命名的 durable 状态可以显式丢弃 volatile 后缀;
|
|
17
31
|
- abort、timeout、worker exit、OOM、进程恢复和损坏的历史 PTC metadata 都收缩到最大可证明 frontier;没有非空 frontier 时从空 REPL 执行当前 cell;
|
|
18
32
|
- 历史恢复拒绝不可信状态证据,不因这项插件自有历史损坏而永久拒绝后续 `run_code`;当前请求自身的 DSH validation、policy、authority、approval 和 cancellation 仍可拒绝执行;
|
|
19
|
-
- 收缩不重新 dispatch、撤销或验证历史 effect
|
|
33
|
+
- 收缩不重新 dispatch、撤销或验证历史 effect;连续收缩期间只发出一次完整 `PTC-R002`,每次实际收缩仍持久化边界。无收缩的 cell 执行后,再次收缩开始新的提示周期。失败 cell 把恢复说明与主错误一起呈现,不混入捕获的控制台输出;
|
|
20
34
|
- 可重建不是默认暴露 binding 的充分条件:恢复 frontier 还必须让 binding 的精确 provenance 保留在生成当前调用的模型可见 surface 中,或由显式选择的有界、模型可见结构化投影公开;不能只为延长隐藏状态而默认注入该投影,raw log 与 UI-only inventory 也不满足这项条件;
|
|
21
35
|
- `durableReplay: false` 时,新 kernel 从空状态开始且所有已执行 live cell 都是 volatile,作为
|
|
22
36
|
用户怀疑恢复正确性时的显式逃生模式;
|
|
@@ -30,7 +44,8 @@ PTC Plus 的正确承诺是:
|
|
|
30
44
|
|
|
31
45
|
```ts
|
|
32
46
|
{
|
|
33
|
-
version:
|
|
47
|
+
version: 11,
|
|
48
|
+
executionCwd: string | null,
|
|
34
49
|
languageSemantics: "legacy-v1" | "stateful-v1" | "protected-v1",
|
|
35
50
|
moduleTransform: "amaro@1.1.11" | "stateful-module-v1+amaro@1.1.11" |
|
|
36
51
|
"stateful-module-v2+amaro@1.1.11" | "protected-module-v1+amaro@1.1.11",
|
|
@@ -95,7 +110,7 @@ SessionRuntime 创建 kernel 时完全忽略历史 nodes、head、checkpoints
|
|
|
95
110
|
|
|
96
111
|
journal、diagnostic、source、cause、call、operation、completion 和 completion error 都使用封闭字段集合;未知、symbol 或非枚举自有字段会使 journal 无效。capability-call `args`/`value` 与 return completion `value` 都是封闭、规范化的 `ptc-value-graph/v1` envelope。诊断结构、source frame 依赖和稳定代码见[架构说明](architecture.md#journal-与恢复)。
|
|
97
112
|
|
|
98
|
-
|
|
113
|
+
当前实现写入 `version: 11` schema,必须携带绝对目录或 `null` 的 `executionCwd`。新 cell 使用 Host 已解析的当前目录,cold replay 使用各 cell 的记录值;v1–v10 迁移为 `null`,保留原 header/worker 解析基准,不使用新请求目录重解释历史。目录变化保留连续 binding 和已加载模块,详见 [ADR 0041](adr/0041-record-cell-execution-directories.md)。v10 起必须携带 `languageSemantics` 与匹配的 `moduleTransform`。v1–v8 固定迁移为 `legacy-v1` 和 legacy transform;v9 保留其语言字段,并按该版本发布时的映射补入 transform:`stateful-v1` 使用 `stateful-module-v1`,`protected-v1` 使用 `protected-module-v1`,`legacy-v1` 使用 legacy transform。当前代际新提交的源码可把 `import.meta` lowering 为记录 session module base 的 cell-local metadata;`legacy-v1` 仍使用冻结 parser 并保留历史拒绝,且此前不可能成功记录的 MetaProperty 不能被恢复时重新解释。恢复不能因当前配置或新 lowering 改变隐藏状态([ADR 0025](adr/0025-use-versioned-logical-binding-identities.md))。v1-v10 作为封闭 predecessor 输入规范化为 v11:v1-v3 的旧 `bindingMode` 精确映射到 `bindingPolicy.variableRedeclarations`,而 `functionClassRedeclarations` 固定为 `false`,因为旧 pipeline 不具备该语义;`moduleSemantics.defaultExportBinding` 固定迁移为 `legacy-variable`,使 loose 历史保留旧的可写生成 binding、strict 历史保留旧的 const 行为;v1-v6 的 `moduleSemantics.importExpressionBoundary` 固定迁移为 `legacy`,使历史写入沿用其记录时的语句 lowering,v7 保留自身记录的边界代际。v1 仍使用三个 rewrite 开关全关的历史默认值,并只在 session log 唯一证明 call identity 时迁移字符串 confirmation;v2/v3 保留自身 `rewritePolicy`。v4/v5 保留已有 binding/rewrite/module 语义;v6 与 v7 保留其记录的 `userBindingsReusePolicy`。v1-v4 的 `userBindingsFingerprint` 固定为 `null`,v5 及之后的代际保留自身记录的快照指纹;v1-v5 的 `userBindingsReusePolicy` 固定为 `fingerprint-v1`。v1-v7 的 `userBindingsShadowPolicy` 固定迁移为 `whole-entry`,`userBindingNames` 固定为 `null`,因此历史 node 继续按整条条目退出,只有 v8 起的 cell 使用 `per-name` 名称证据。无法表示为非负 event sequence 的 confirmation 必须形成 unknown boundary 并触发状态收缩。包括 `executionCwd`、`languageSemantics`、`moduleTransform`、`bindingPolicy`、`rewritePolicy`、`moduleSemantics`、`userBindingsFingerprint`、`userBindingsReusePolicy`、`userBindingsShadowPolicy`、`userBindingNames`、`diagnostics` 在内的当前必需字段缺失或策略未知时 journal 必须失效,否则会削弱最终持久值与 tentative journal 的严格一致性确认;失效 journal 不证明旧 binding,但也不单独成为后续当前调用的 availability gate。profile 后续切换任一 binding 或 AST rewrite 开关只影响新 cell,历史 node 始终按自身记录的 policy、module semantics 与 transform 重放。新旧全局绑定复用策略与覆盖粒度可共存于同一历史,重复规范化不能把旧策略或旧粒度升级为当前值;没有返回值的 completion 不能证明模块内部状态相等。
|
|
99
114
|
|
|
100
115
|
## Capability Call Transcript
|
|
101
116
|
|
|
@@ -131,8 +146,8 @@ pre-execute -> tools/execute -> post-execute
|
|
|
131
146
|
|
|
132
147
|
1. `tools/execute` 保存 execution 对象与 session context;
|
|
133
148
|
2. 执行缝的 `run` 真正进入 kernel 时创建 tentative journal;
|
|
134
|
-
3.
|
|
135
|
-
4. `tools/result` 规范化最终 `meta.dshPtcPlus`
|
|
149
|
+
3. 根成功结果由 `presentationMeta` 投影 journal,失败结果由 around hook 附加;真实派生成功的受限私有凭证见下文;
|
|
150
|
+
4. `tools/result` 规范化最终 `meta.dshPtcPlus` 或已证明的派生私有凭证,与 runtime tentative journal 比较;
|
|
136
151
|
5. 两者语义完全相同时确认 tentative 状态;
|
|
137
152
|
6. cell 已执行但 metadata 缺失、损坏或被替换时,live kernel 单调降为 volatile;
|
|
138
153
|
7. 从未进入 runtime 时,把 call id 加入 pending no-op;
|
|
@@ -153,15 +168,17 @@ pre-execute -> tools/execute -> post-execute
|
|
|
153
168
|
|
|
154
169
|
## Nested run_code
|
|
155
170
|
|
|
156
|
-
模型直接发起的 top-level `run_code`
|
|
171
|
+
模型直接发起的 top-level `run_code` 与程序内 `tools.edit_run_code` 接受后的派生执行都创建本 schema 的 cell journal。根 journal 随 `run_code` result 持久化;派生 journal 随同一根结果的私有 `dshPtcPlusPostEdit` metadata 持久化,并与 editor 及真实派生执行的两个正式 start/settle pairs、根 journal 收据和原始目标关联。`startSeq` 保留 editor 因果身份,`executionStartSeq` 拥有派生 cell 身份;每个 editor 与真实派生 sub-call 身份必须在其根 call 到最终 result 的窗口内各有且只有一个 start 和一个随后 settle,指定 start 序号还须指向这唯一 start。窗口外已结算的相同 ID 可独立复用;派生 settle 的 canonical journal 和 error 状态必须与根私有证据一致。历史顶层 editor result 仍按其原有 derived metadata 契约恢复。隔离 child binding 不创建 child PTC journal,也不产生可合并到父 heap 的 binding。
|
|
172
|
+
|
|
173
|
+
公开 Host 若从未为本次 nested success 调用 `output.presentationMeta`,runtime bridge 可在只读 `projectContent` 中捕获该次 canonical frozen value 与 tentative settlement。只在 execution token、session、parent 和受控 continuation 精确匹配,最初没有插件 journal,最终仍成功且保留同一 value 对象、原 metadata,并且之后没有调用 projector 时,插件才把此私有凭证用于真实派生 settle 和根关联。此路径不修改 Host result、metadata、content 或 contexts;最终 content 始终采用 Host 决定。缺少 capture、block/error、value replacement、已有 metadata 被删除或 projector 已被调用都不得补凭证。根最终 metadata 仍须通过原确认规则;移除它会否定恢复证据。公开依据是 Host canonical value 的冻结与对象身份、`projectContent` 的政策前观察及 `tools/result` 的政策后结算,不是缺少 metadata 本身。
|
|
157
174
|
|
|
158
175
|
父 cell 把隔离 child 当成普通 program binding call,记录 graph-encoded arguments、canonical result/error 和 settlement order。正常结算后,cold replay 返回 recorded child result,不重新执行 child 源码。若取消、超时或 worker failure 发生在调用结算前,`discarded` journal 以 `code.run` 保留 possible-effect boundary。这个结果来自所有 program binding 共用的 pending/settled 生命周期,不是 `code.run` 名称特例。它不注册第二个模型工具,也不伪造 UI、policy hook、调用树或事件。
|
|
159
176
|
|
|
160
177
|
## 日志折叠
|
|
161
178
|
|
|
162
|
-
恢复以当前请求需要的 head 为目标,沿可证明 parent 关系向更早 frontier 收缩;实现可以前向折叠 event 建图,但不得把 unknown boundary 两侧的日志位置当作状态依赖证据。恢复入口先把当前 call id 解析为持久化 `tool/call.seq`,再把该序号作为 live boundary 传入折叠器;对应的在途 call event
|
|
179
|
+
恢复以当前请求需要的 head 为目标,沿可证明 parent 关系向更早 frontier 收缩;实现可以前向折叠 event 建图,但不得把 unknown boundary 两侧的日志位置当作状态依赖证据。恢复入口先把当前 call id 解析为持久化 `tool/call.seq`,再把该序号作为 live boundary 传入折叠器;对应的在途 call event 不属于历史。当前 editor 在正式 `tool/ptc-dispatch-start` 处捕获此前已结算的可编辑目标;根结果证明收据、两个真实 dispatch pairs、canonical 结算事实和目标变换后,以实际派生 start 序号将派生 cell 折叠在根计算之后。历史 direct editor 在其 `tool/call` 处捕获目标。后续 result 不追溯改变已捕获的目标:
|
|
163
180
|
|
|
164
|
-
1.
|
|
181
|
+
1. 用正式 `message.source.callId` 关联 `tool/result` 与 `tool/call`;若 result 另带 `sourceEventSeqs`,它必须准确指向同一个 call,否则该 call 建立 untrusted boundary。历史只携带 sequence relation 的结果按其旧格式校验。每个 ordinary result 在 journal 解析前闭合一次 call settlement;同一 call 的第二个 ordinary result 被拒绝。经过结构校验的 prune replacement 是唯一不占用第二次 ordinary settlement 的替代表示;
|
|
165
182
|
2. 预收集 valid journal 中的 `confirms`;
|
|
166
183
|
3. 排除与 live boundary 序号相同的在途 call,并让已确认 no-op 的无 journal call 不改变状态;
|
|
167
184
|
4. 缺失源码、缺失/损坏 journal 或无法验证的 call/result/prune 关联建立 untrusted boundary,不作为旧 binding 的证据;
|
|
@@ -182,7 +199,7 @@ pre-execute -> tools/execute -> post-execute
|
|
|
182
199
|
|
|
183
200
|
DSH session 同时提供两个不同投影:append-only event log 保存审计、journal 与 replay evidence;ordered surface/derived request history 是模型请求实际可见的消息历史。PTC Plus 的默认状态 frontier 是“结构可重建”和“模型可知”的交集,不能用 raw log 的存在替代 surface evidence。模型可知只采用外部可验证事实,不猜模型内部记忆:可见 assistant tool-call block 必须以相同 call id、tool name 和原始 JSON arguments 精确对应 raw dispatch,或插件/宿主通过有界结构把准确 binding identity 与 provenance 放入模型上下文。只匹配 call id、可见 `tool/result`、result source relation 或 raw log 不能证明声明源码可见。若 ordered surface 缺失、格式错误或不可读取,就没有历史 executable provenance 可证明,恢复必须收缩到空 frontier;这只否定历史 binding 证据,当前有效 cell 仍从空 REPL 正常执行。
|
|
184
201
|
|
|
185
|
-
surface replacement 是否删除状态取决于模型失去了什么,而不取决于是否出现 `compaction/prune` 这个名字。只替换过长 tool result、仍保留 assistant `run_code
|
|
202
|
+
surface replacement 是否删除状态取决于模型失去了什么,而不取决于是否出现 `compaction/prune` 这个名字。只替换过长 tool result、仍保留 assistant `run_code` 调用及源码时,模型仍知道该 cell;当前派生编辑还要求原始目标的源码与发起 nested editor 的根源码同时可见。历史 direct editor 保留其原有 source relation。满足这些关系后才可继续使用对应 journal。若 replacement 或 summary 遮蔽了声明 provenance,raw journal 即使完整也不能让 binding 默认继续存在;自然语言 summary 不解析为依赖或 binding 证明。当前没有模型可见的完整 binding inventory,因此缺少精确 provenance 时按 cell 与依赖后缀收缩。
|
|
186
203
|
|
|
187
204
|
该规则也约束 live worker。structured host session 的 runtime 在每个后续 cell 前都重新读取 DSH public ordered surface,并验证所有现存 live call 的精确 assistant provenance;`replaceGeneration` 没有变化不构成继续复用的证明。generation 改变、缺失或不可读取也进入同一验证。若现存 binding 超出模型可知 frontier,先重置 worker、重建交集 frontier,再执行当前 cell。只有不带 host session 的内部 primitive session id 明确使用 live-only 连续性。Client header card 的 `dshPtcPlusBindings` 只帮助用户检查,不进入模型上下文,也不延长 binding 生命周期;相同 contraction 应让 UI inventory 进入不可确认状态。未来若新增模型可见状态投影,它必须由用户、模型或明确配置选择,有固定 schema、硬预算、append-only runtime-context 证据和明确清除条件,不能仅为延长隐藏状态而默认注入,也不能污染稳定 prompt prefix。
|
|
188
205
|
|
|
@@ -202,7 +219,7 @@ surface replacement 是否删除状态取决于模型失去了什么,而不取
|
|
|
202
219
|
- recovery divergence;
|
|
203
220
|
- durable replay 触发 volatile capability。
|
|
204
221
|
|
|
205
|
-
基础设施失败会终止当前 worker,并把 log-only recovery boundary 放入当前已结算 `tool/result` 的私有 metadata。kernel 从失败 node 的 parent 重新重放;若该 frontier 仍失败则继续向 parent 收缩,直到最大可验证 frontier 或空 REPL。触发恢复的当前 `run_code` 在候选 frontier 验证成功前不执行,验证后在同一次请求中继续。boundary 无效或历史本身无法完整折叠时,相关记录和可能依赖它的状态不得进入 frontier;这类历史 PTC metadata 损坏本身不返回永久 recovery error,而是继续收缩,最差用空 worker 执行当前 cell,并在其最终 result 持久表达新 ancestry。已经写入旧版自定义 boundary event 的日志必须先通过显式、非破坏迁移转换为 DSH 可加载的 metadata;迁移失败时不得覆盖原始日志。
|
|
222
|
+
基础设施失败会终止当前 worker,并把 log-only recovery boundary 放入当前已结算 `tool/result` 的私有 metadata。kernel 从失败 node 的 parent 重新重放;若该 frontier 仍失败则继续向 parent 收缩,直到最大可验证 frontier 或空 REPL。触发恢复的当前 `run_code` 在候选 frontier 验证成功前不执行,验证后在同一次请求中继续。boundary 的失败身份可为顶层 call,或已经由共享 timeline 证明两组 dispatch pairs 和根最终关联的真实派生 start 序号;原始 nested start 不足以证明该身份。收缩保留失败 node 的已证明 parent,之后独立的有效 carrier 仍可进入新 ancestry。boundary 无效或历史本身无法完整折叠时,相关记录和可能依赖它的状态不得进入 frontier;这类历史 PTC metadata 损坏本身不返回永久 recovery error,而是继续收缩,最差用空 worker 执行当前 cell,并在其最终 result 持久表达新 ancestry。已经写入旧版自定义 boundary event 的日志必须先通过显式、非破坏迁移转换为 DSH 可加载的 metadata;迁移失败时不得覆盖原始日志。
|
|
206
223
|
|
|
207
224
|
## State Operations
|
|
208
225
|
|
|
@@ -213,11 +230,11 @@ type StateOperation =
|
|
|
213
230
|
| { action: "delete", name: string }
|
|
214
231
|
```
|
|
215
232
|
|
|
216
|
-
- `save` 只可提交到 durable node;
|
|
233
|
+
- `save` 只可提交到 durable node;volatile 拒绝说明记录的降级原因,保留当前 live binding 并允许继续计算,不推荐无条件 restore;
|
|
217
234
|
- cell 静态判断 durable、但在 `save` 后运行时降级时,tentative save 会被删除;
|
|
218
235
|
- `delete` 可独立应用于命名索引;
|
|
219
|
-
- 无名称 `restore` 选择当前 cell 之前的最后 durable head,清除 volatile suffix;
|
|
220
|
-
- `restore` 把 head 切回已存在的 durable node,清除 volatile suffix
|
|
236
|
+
- 无名称 `restore` 选择当前 cell 之前的最后 durable head,清除 volatile suffix;没有 durable head 时恢复为空 REPL;
|
|
237
|
+
- `restore` 把 head 切回已存在的 durable node,清除 volatile suffix;这会丢弃目标之后的计算状态,但不撤销外部效果或改变启用的全局绑定配置。仍生效的 volatile 输入和 `durableReplay: false` 可使后续 cell 继续 volatile,restore 不保证下一次 save 成功;
|
|
221
238
|
- list 不写 operation,返回当前 checkpoint 名称、`mode` 和首次 `volatileReason`。
|
|
222
239
|
|
|
223
240
|
状态名称由 agent 选择,内部 node index、hash、revision 和日志位置不进入模型接口。
|
|
@@ -253,7 +270,7 @@ state: ...
|
|
|
253
270
|
help: ...
|
|
254
271
|
```
|
|
255
272
|
|
|
256
|
-
|
|
273
|
+
成功 cell 的恢复通知进入 logs;失败 cell 的恢复说明追加到主错误之后,不混入捕获的控制台输出;其他既有诊断提示仍按各自规则呈现。发出的结构化诊断进入当前 journal,可从 session log 重建。连续收缩期间只显示一次完整通知;一个无收缩的 cell 结束提示周期,之后再次收缩会显示新的完整通知。每次实际收缩的边界仍随当前 result 持久化,后续 cold start 从新分支恢复,不重复撞击同一损坏历史。
|
|
257
274
|
|
|
258
275
|
live kernel 首次进入 volatile 只更新 journal 的 `status` / `volatileReason` 和 `repl.state(list)`,不向模型投影 warning/note。该转换不要求当前任务采取行动;只有 cold recovery 已实际跳过 volatile、unknown 或 replay-abandoned 历史时才发送 `PTC-R002`。worker 在首次观察到直接 Node/OS 边界时立即通知主线程,因此后续 hard abort、timeout 或 worker exit 仍能把原因写入 discarded journal。
|
|
259
276
|
|