@twinsearth/dsh-master 3.3.2 → 3.3.3

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.md CHANGED
@@ -21,8 +21,8 @@ DSH Host
21
21
  │ mirror / essence / derived core(主 Agent 控制面)
22
22
  │ fangForker / fangDecisionCenter ◄────── ├── superagent-router (essence/mother)
23
23
  │ fangSessionCatalog ├── superagent-worker (fork/essence)
24
- │ ├── cost-optimizer (fork)
25
- │ └── dual-manager (mother/essence)
24
+ │ ├── cost-optimizer (fork/mother)
25
+ │ └── dual-manager (mother/essence/fork)
26
26
  └── 协作只走服务键;任一方向失败一律 fail-closed,不本地降级执行
27
27
  ```
28
28
 
@@ -31,10 +31,14 @@ DSH Host
31
31
  | 子插件 | 行 id | 允许角色 | 路线图 | 已交付 |
32
32
  |---|---|---|---|---|
33
33
  | SuperAgent Router | `master-superagent-router` | **essence / mother** | 3.2.1/3.2.3 | Webhook/Ticket/Mandate、渐进信任、本地或母体桥派发、Worker 实时事件、回写 |
34
- | SuperAgent Worker | `master-superagent-worker` | **fork / essence** | 3.2.1 | Ticket 上下文、Mandate 守卫 |
35
- | Worker Agent Loop | `master-superagent-loop` | **fork / essence** | 3.2.3 | tsc 编译 preset;有 Ticket 自动跑多轮工具循环并流式回传 |
36
- | 成本优化 HarnessMM | `master-cost-optimizer` | **fork only** | 3.3.0 | observe 层:token 估算、实测记录 |
37
- | 双主管 PM + PJM | `master-dual-manager` | **mother / essence** | 3.4.0 | PRD/计划/调度/决策中心澄清 |
34
+ | SuperAgent Worker | `master-superagent-worker` | **fork / essence / mother** | 3.2.1 | Ticket 上下文、Mandate 守卫 |
35
+ | Worker Agent Loop | `master-superagent-loop` | **fork / essence / mother** | 3.2.3 | tsc 编译 preset;有 Ticket 自动跑多轮工具循环并流式回传 |
36
+ | 成本优化 HarnessMM | `master-cost-optimizer` | **fork / mother** | 3.3.0 | observe 层:token 估算、实测记录、瓮城回流 |
37
+ | 双主管 PM + PJM | `master-dual-manager` | **mother / essence / fork** | 3.4.0 | PRD/计划/调度/决策中心澄清 |
38
+
39
+ > 角色矩阵自 **3.3.3** 起:**母体全开**(含 Worker/Loop/成本),**分身也挂双主管**;
40
+ > 唯一保留的限制是 **Router 不进 fork**(分身只执行,不注册控制面)。
41
+ > 旧的「母体不接纳执行体」约束已按用户明确要求废止。
38
42
 
39
43
  ## 本地开发
40
44
 
@@ -96,6 +100,7 @@ dsh plugin add <package> # 加载 dist-host/dist-worker
96
100
  - **3.3.1 发布线**:M5 收口 —— 瓮城回流接口升级到 `@twinsearth/dsh-fang-contract` **1.1.0**(`fang.relay.publish` / `fang.relay.status`),房主侧 `src/cost/fang-relay.ts` 做真实探测与投递(只有对端回执才算送达,不可用给具名原因);里程碑 **M1–M5 全部 done**。详见 [M5 回流实测](docs/EXPERIMENT-M5-fang-relay.md)。
97
101
  - **3.3.0 发布线**:成本优化系统层(ledger / budget / policy / audit)+ Worker 四个成本切点 + A1 紧凑化(默认 shadow)+ A2–A3 / B1–B4;真实 A/B 实测 tokens/task 6263 → 3906.75(−37.6%),成功率 0pp 差,详见 [3.3.0 架构设计](docs/DESIGN-v3.3.0-cost-optimization.md)。
98
102
  - 3.2.10 发布线:角色矩阵放宽——Router 进入母体(essence/mother),Worker 与 Worker Agent Loop 进入原身(fork/essence);母体仍不接纳执行体,fork 仍不注册 Router。
103
+ - **3.3.3 发布线(角色矩阵调整,用户明确要求)**:母体全开(Worker / Worker Agent Loop / 成本优化进 mother),分身挂双主管(dual 进 fork);唯一保留的限制是 Router 不进 fork。
99
104
  - 3.2.9 发布线:房主面板改注册到 `shell.overlay` 常驻浮层——点击面板之外不收起、侧栏「房主」按钮二次点击收起、正文独立滚动;新增无浏览器 hook 运行时行为测试(开关、无 outside-click 监听、滚动容器、SSE 失败不卸载面板)。
100
105
  - 3.2.8 发布线:与瓮城通过 fang-master contract 1.0 互联(local/http/file/legacy 四级保底);GitHub Release + NPM public。
101
106
  - 当前工作树完成新一轮审计修复:工具名/死循环阈值、Router 鉴权与生命周期、真实路由分流、契约幂等与超时、PR 护栏与交付、飞书加密、长 Shell 后台作业、成本实测接线、PJM 派生契约。
package/client.js CHANGED
@@ -275,7 +275,7 @@ window.__ModuleLoader__.load({
275
275
  return h('div', { style: S.card, 'data-dsh-master': 'cost-block' },
276
276
  h('div', { style: S.row },
277
277
  h('span', { style: S.name }, '成本(只读)'),
278
- tag(block ? '3.3.2' : '未启用', block ? undefined : '#B45309')),
278
+ tag(block ? '3.3.3' : '未启用', block ? undefined : '#B45309')),
279
279
  failed ? h('div', { style: S.error }, '成本接口不可达') : null,
280
280
  !block && !failed ? h('div', { style: S.desc }, '成本系统未装配(cost-optimizer 未启用或角色不匹配)') : null,
281
281
  columns ? h('div', { style: S.desc },
@@ -7,7 +7,7 @@
7
7
  * 与瓮城 dsh-Fang 的协作只走 DSH 服务键,不 import fang 代码。
8
8
  */
9
9
  import crypto from 'node:crypto';
10
- export const MASTER_VERSION = '3.3.2';
10
+ export const MASTER_VERSION = '3.3.3';
11
11
  export const FANG_CONTRACT_MIN = '3.1.14';
12
12
  export const SERVICE = Object.freeze({
13
13
  master: 'dshMaster',
@@ -60,18 +60,20 @@ export const ROW = Object.freeze({
60
60
  export const ROLE = Object.freeze({ mother: 'mother', essence: 'essence', fork: 'fork' });
61
61
  /**
62
62
  * 角色矩阵:
63
- * * Router 在 essence 与 mother 激活:只评估/建票/派发,不执行代码;fork 不注册。
64
- * * Worker / Worker Agent Loop 在 fork 与 essence 激活:原身可直接执行工单,
65
- * 分身仍是默认执行体;mother 不执行。
66
- * * 成本优化仍只 fork;双主管 mother/essence。
63
+ * * Router 在 essence 与 mother 激活:只评估/建票/派发,不执行代码改动;fork 不注册。
64
+ * * Worker / Worker Agent Loop 在 fork、essence、**mother** 激活:母体默认只做编排,
65
+ * 但 3.3.3 起允许母体直接执行工单(用户明确要求「母体全部激活」;此前"母体不接纳
66
+ * 执行体"的旧约束已废止,见 README 角色矩阵与 CHANGELOG)。
67
+ * * 成本优化在 fork 与 mother 激活(母体也需要看到成本账与回流);essence 不挂(元宝只编排)。
68
+ * * 双主管 mother / essence / fork 全开:管理能力不再按角色排除,是否派发由权限与预算闸决定。
67
69
  */
68
70
  export const ROLE_MATRIX = Object.freeze({
69
71
  'master-core': Object.freeze(Object.values(ROLE)),
70
72
  'master-superagent-router': Object.freeze([ROLE.essence, ROLE.mother]),
71
- 'master-superagent-worker': Object.freeze([ROLE.fork, ROLE.essence]),
72
- 'master-superagent-loop': Object.freeze([ROLE.fork, ROLE.essence]),
73
- 'master-cost-optimizer': Object.freeze([ROLE.fork]),
74
- 'master-dual-manager': Object.freeze([ROLE.mother, ROLE.essence]),
73
+ 'master-superagent-worker': Object.freeze([ROLE.fork, ROLE.essence, ROLE.mother]),
74
+ 'master-superagent-loop': Object.freeze([ROLE.fork, ROLE.essence, ROLE.mother]),
75
+ 'master-cost-optimizer': Object.freeze([ROLE.fork, ROLE.mother]),
76
+ 'master-dual-manager': Object.freeze([ROLE.mother, ROLE.essence, ROLE.fork]),
75
77
  });
76
78
  export const SUBPLUGIN_CATALOG = Object.freeze([
77
79
  Object.freeze({
@@ -108,7 +108,7 @@ export function apply(ctx, config = {}) {
108
108
  };
109
109
  const service = {
110
110
  id: SERVICE.cost,
111
- version: '3.3.2',
111
+ version: '3.3.3',
112
112
  role,
113
113
  get mode() {
114
114
  return system.policy.describe().mode;
@@ -354,7 +354,7 @@ export function apply(ctx, config = {}) {
354
354
  return {
355
355
  ok: true,
356
356
  id: 'cost-optimizer',
357
- version: '3.3.2',
357
+ version: '3.3.3',
358
358
  role,
359
359
  mode: current.mode,
360
360
  requestedMode: current.requestedMode,
@@ -396,7 +396,7 @@ export function apply(ctx, config = {}) {
396
396
  doubleCountGuard: report.doubleCountGuard,
397
397
  };
398
398
  })(),
399
- note: '3.3.2:系统层记账/预算/灰度/审计 + A1 工具输出紧凑化(默认 shadow)+ 瓮城回流出口(contract 1.1.1 真实投递,回执计数修复);工具面 A2–A3 与决策复用 B1–B4 已接入(shadow 默认)。',
399
+ note: '3.3.3:系统层记账/预算/灰度/审计 + A1 工具输出紧凑化(默认 shadow)+ 瓮城回流出口(contract 1.1.1 真实投递,回执计数修复);工具面 A2–A3 与决策复用 B1–B4 已接入(shadow 默认);3.3.3 起角色矩阵母体全开、分身挂双主管。',
400
400
  };
401
401
  },
402
402
  };
@@ -35,8 +35,8 @@
35
35
  └──────────────────────────────┘
36
36
 
37
37
  旁路(后续版本):
38
- cost-optimizer → fork:HarnessMM observe 层(3.3.0)
39
- dual-manager → mother/essence:PM + PJM(3.4.0)
38
+ cost-optimizer → fork/mother:HarnessMM observe 层(3.3.0;3.3.3 起母体也开放)
39
+ dual-manager → mother/essence/fork:PM + PJM(3.4.0;3.3.3 起分身也开放)
40
40
  ```
41
41
 
42
42
  ### 角色矩阵(代码强制,见 `src/kernel.mjs ROLE_MATRIX`)
@@ -116,7 +116,7 @@
116
116
  ## 7. 3.3.0 / 3.3.1 成本优化(已实施并发布)
117
117
 
118
118
  ```text
119
- master-cost-optimizer(行,仅 fork)= 编排器 + 服务 dshMasterCost
119
+ master-cost-optimizer(行,fork/mother)= 编排器 + 服务 dshMasterCost
120
120
  │
121
121
  系统层(常驻):ledger 账本 │ budget 预算闸 │ policy 灰度 │ attribution 归因 │ audit 审计链 │ bus 事件总线
122
122
  │ hooks │ reports(→ 瓮城回流出口:fang-relay 真实投递)
package/docs/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## 3.3.3(2026-11-13 已发布)
2
+
3
+ > 三方发布:annotated tag `v3.3.3` + GitHub Release + npm `@twinsearth/dsh-master@3.3.3`。
4
+ > 接口包无变化(仍 `@twinsearth/dsh-fang-contract@1.1.1`)。
5
+
6
+ **主题:角色矩阵按用户要求放开(母体全开 + 分身挂双主管)。**
7
+
8
+ - `ROLE_MATRIX` 调整:`superagent-worker` / `superagent-loop` 增加 **mother**;`cost-optimizer` 增加 **mother**(变 fork/mother);`dual-manager` 增加 **fork**(变 mother/essence/fork)。
9
+ - **保留的唯一限制**:`superagent-router` 仍为 essence/mother —— 分身不注册控制面(只执行)。
10
+ - 废止旧约束「母体不接纳执行体」(README 3.2.10 行曾记录)。同步更新 7 条测试断言(矩阵精确值、母体/分身角色门、成本与双主管准入、package-contract 安全断言 + 新增「Router 永不进 fork」不变量),README 角色表与架构说明。
11
+ - 影响面:母体现在可派发并运行 Worker/Loop,母体也能挂成本优化(成本账 + 瓮城回流);分身可挂双主管。安全边界不变:预算闸、Mandate 守卫、角色检测仍按原样生效,只是准入名单放宽。
12
+ - 测试:全量 **449 条**(`test:clean` 449/449)。
13
+
1
14
  ## 3.3.2(2026-11-13 已发布)
2
15
 
3
16
  > 三方发布:annotated tag `v3.3.2` + GitHub Release + npm `@twinsearth/dsh-master@3.3.2`。
@@ -1,7 +1,7 @@
1
1
  # 房主 dsh-Master 3.3.0 架构设计:成本优化 & 省 Token 子插件(系统 + 模块)
2
2
 
3
- > 状态:**已实施并发布(3.3.0 / 3.3.1 三方发布:annotated tag + GitHub Release + npm)**。基线代码 `3.2.10`,本文件描述 3.3.0 的架构与落地路径;实施进度见 §17。
4
- > 关联:`docs/ROADMAP.md`(3.3.0 = HarnessMM 经济性)、`docs/ARCHITECTURE.md`(角色矩阵 / `master-cost-optimizer` 行 → 仅 fork)、
3
+ > 状态:**已实施并发布(3.3.0 / 3.3.1 / 3.3.2 三方发布:annotated tag + GitHub Release + npm)**。基线代码 `3.2.10`,本文件描述 3.3.0 的架构与落地路径;实施进度见 §17。
4
+ > 关联:`docs/ROADMAP.md`(3.3.0 = HarnessMM 经济性)、`docs/ARCHITECTURE.md`(角色矩阵 / `master-cost-optimizer` 行 → fork/mother;3.3.3 起母体也开放)、
5
5
  > `src/plugins/cost-optimizer.ts`(3.2.x 的 observe 骨架,本设计在其上扩展且**不破坏**现有服务接口)。
6
6
  > 参考实现:`dsh-ops`(MIT,工具层)、`HarnessMM`(Apache-2.0,arXiv:2610.32813,决策层)。**只移植协议语义、自研实现,不复制第三方代码。**
7
7
  > 移植边界的完整定义、当前实现来源核对与新增模块检查清单见 [`docs/THIRD-PARTY.md`](THIRD-PARTY.md),由 `test/license-provenance.test.mjs` 自动守卫。
@@ -12,7 +12,7 @@
12
12
 
13
13
  ```text
14
14
  ┌──────────────────────────────────────────┐
15
- │ master-cost-optimizer(行,仅 fork) │
15
+ │ master-cost-optimizer(行,fork/mother) │
16
16
  │ = 编排器 + 对外服务 dshMasterCost │
17
17
  └───────────────┬──────────────────────────┘
18
18
  │
@@ -158,7 +158,7 @@
158
158
 
159
159
  ```text
160
160
  ┌──────────────────────────────────────────┐
161
- │ master-cost-optimizer(行,仅 fork) │
161
+ │ master-cost-optimizer(行,fork/mother) │
162
162
  │ = 编排器 + 对外服务 dshMasterCost │
163
163
  └───────────────┬──────────────────────────┘
164
164
  │
@@ -1055,5 +1055,6 @@ node scripts/milestones.mjs --input evidence.json # 追加 M3 守卫准确率 /
1055
1055
  | **M2 余项 / M3–M4** | ✅ 已发布(3.3.0) | A2 渐进纰漏、A3 批量、B1–B4、真实 fork 对照实验、面板成本块(见 §14) |
1056
1056
  | **M5 回流收口** | ✅ 已发布(3.3.1) | contract 1.1.0(`fang.relay.publish`/`status`)+ `src/cost/fang-relay.ts` + `scripts/fang-relay-probe.mjs`;M5 由 `fang-relay-out-of-scope` 改为对端回执判定 |
1057
1057
  | **M5 真实瓮城实测** | ✅ 已发布(3.3.2) | 瓮城 3.1.35 内嵌 1.1.0 并自报 `dsh-fang-bundle`;探针 `--peer fang` 用瓮城发布物当对端(VENDOR.json 校验 8/8、peerLabel 取其 orchestrator);实测 6 条回执、幂等重投通过;同批修 contract 1.1.1 回执计数缺陷并同步 |
1058
+ | **角色矩阵放开** | ✅ 已发布(3.3.3) | 母体全开(Worker/Loop/成本进 mother)+ 分身挂双主管;唯一保留限制 Router 不进 fork;7 条测试与 5 处文档同步 |
1058
1059
 
1059
- *3.3.0 / 3.3.1 / 3.3.2 均已三方发布(annotated tag + GitHub Release + npm);contract 1.0.0 / 1.1.0 / 1.1.1 已发 npm。*
1060
+ *3.3.0 / 3.3.1 / 3.3.2 / 3.3.3 均已三方发布(annotated tag + GitHub Release + npm);contract 1.0.0 / 1.1.0 / 1.1.1 已发 npm。*
package/docs/SECURITY.md CHANGED
@@ -60,14 +60,16 @@
60
60
  | 子插件 | 允许角色 | 强制位置 |
61
61
  |---|---|---|
62
62
  | SuperAgent Router | **essence / mother** | `superagent-router.ts` apply 开头 `roleAllowed(ROW_ID, role)`;fork 不注册服务 |
63
- | SuperAgent Worker | **fork / essence** | `superagent-worker.ts` 同上;母体不注册 |
64
- | 成本优化 | **fork only** | `cost-optimizer.ts` 同上 |
65
- | 双主管 | **mother / essence** | `dual-manager.ts` 同上 |
63
+ | SuperAgent Worker | **fork / essence / mother** | `superagent-worker.ts` 同上 |
64
+ | Worker Agent Loop | **fork / essence / mother** | 编译 preset(`dist-worker`,`worker/index.ts` 自注册);矩阵用于宿主状态与准入显示 |
65
+ | 成本优化 | **fork / mother** | `cost-optimizer.ts` 同上;essence 不注册 |
66
+ | 双主管 | **mother / essence / fork** | `dual-manager.ts` 同上 |
66
67
 
67
- - 母体(mother)只接纳 Router 与双主管,不接纳 Worker/Loop 执行体;
68
- - Router 是控制面:不读文件、不跑命令、不改代码;执行体在 fork Worker 或原身(3.2.10 起)中运行;
69
- - Worker 的物理隔离仍是默认执行路径,**绝不**在母体启用;
70
- - 测试逐角色断言(mother/essence/fork)服务是否存在。
68
+ - 角色矩阵自 **3.3.3** 起:母体全开(Worker / Loop / 成本进 mother),分身也挂双主管;
69
+ **唯一保留的硬限制:Router 不进 fork**(分身只执行,不注册控制面);
70
+ - Router 是控制面:不读文件、不跑命令、不改代码;执行体在 fork / essence / mother 中运行(3.3.3 起母体也可执行);
71
+ - 放开的是**准入名单**,不是安全边界:预算闸、Mandate 守卫、工具白名单、敏感路径拒绝仍然逐层生效;
72
+ - 测试逐角色断言(mother/essence/fork)服务是否存在,并断言 Router 在 fork 恒不可用。
71
73
 
72
74
  ## 2. 外部输入不可信
73
75
 
@@ -119,7 +121,7 @@ Gate:来源允许列表、Actor 允许列表(**空列表 = 全部拒绝**)
119
121
  | 面 | 措施 |
120
122
  |---|---|
121
123
  | 母体派发桥 | `POST /dsh-master/api/bridge/spawn` 必须 Bearer `bridgeToken`(常量时间比较);只接受 ticket + `DSH_MASTER_*` env;只调用 `fangForker.spawn`,无本地降级 |
122
- | Worker preset 角色 | 编译行 `master-superagent-loop` 只 fork;母体/元主(`DSH_FANG_ESSENCE=1`)直接拒绝执行 |
124
+ | Worker preset 角色 | 编译行 `master-superagent-loop` 自 3.3.3 起 fork/essence/mother 均可运行;Router 仍不注册 fork |
123
125
  | Worker 实时通道 | Router 生成 per-ticket stream token;Worker 只能提交自己 ticket 的事件(token→ticketId 绑定),done 后消费 token |
124
126
  | 回写 | 默认关闭;webhook/GitHub token 只在配置内,状态接口只返回模式;失败只告警 |
125
127
  | Shell 环境 | 白名单 env,剥掉 `KEY/TOKEN/SECRET/DSH_*`;超时 kill 进程树;解释器 `-e/-c` 黑名单 |
@@ -117,7 +117,7 @@ fangForker.spawn({
117
117
  |---|---|
118
118
  | 外部输入不可信 | 验签/Token → 归一化 → Gate;payload 永远当不可信文本 |
119
119
  | Mandate 防越权 | 不可变 Ticket;Worker 精确 scope 校验,越权退回 Router |
120
- | 物理隔离 | Worker 默认在 fork;3.2.10 起也可在 essence;Router 在 essence/mother;母体不接纳执行体 |
120
+ | 物理隔离 | Worker 默认在 fork;3.2.10 起也可在 essence;3.3.3 起母体也放开(用户要求);Router 恒在 essence/mother,不进 fork |
121
121
  | 长任务不阻塞 | `exec_shell_in_vm` 超过 5s 返回后台 job id,`vm_job_result` 查询真实终态与输出 |
122
122
  | 失败不假装成功 | dispatch 失败 → Ticket= failed、decision=unavailable,错误码原样返回 |
123
123
  | 去重 | 事件 id 最近 500 条 FIFO(重复事件不刷新顺序);契约幂等键随 envelope 传递 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twinsearth/dsh-master",
3
- "version": "3.3.2",
3
+ "version": "3.3.3",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
package/src/kernel.ts CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  import crypto from 'node:crypto'
12
12
 
13
- export const MASTER_VERSION = '3.3.2'
13
+ export const MASTER_VERSION = '3.3.3'
14
14
  export const FANG_CONTRACT_MIN = '3.1.14'
15
15
 
16
16
  export const SERVICE = Object.freeze({
@@ -67,18 +67,20 @@ export const ROLE = Object.freeze({ mother: 'mother', essence: 'essence', fork:
67
67
 
68
68
  /**
69
69
  * 角色矩阵:
70
- * * Router 在 essence 与 mother 激活:只评估/建票/派发,不执行代码;fork 不注册。
71
- * * Worker / Worker Agent Loop 在 fork 与 essence 激活:原身可直接执行工单,
72
- * 分身仍是默认执行体;mother 不执行。
73
- * * 成本优化仍只 fork;双主管 mother/essence。
70
+ * * Router 在 essence 与 mother 激活:只评估/建票/派发,不执行代码改动;fork 不注册。
71
+ * * Worker / Worker Agent Loop 在 fork、essence、**mother** 激活:母体默认只做编排,
72
+ * 但 3.3.3 起允许母体直接执行工单(用户明确要求「母体全部激活」;此前"母体不接纳
73
+ * 执行体"的旧约束已废止,见 README 角色矩阵与 CHANGELOG)。
74
+ * * 成本优化在 fork 与 mother 激活(母体也需要看到成本账与回流);essence 不挂(元宝只编排)。
75
+ * * 双主管 mother / essence / fork 全开:管理能力不再按角色排除,是否派发由权限与预算闸决定。
74
76
  */
75
77
  export const ROLE_MATRIX = Object.freeze({
76
78
  'master-core': Object.freeze(Object.values(ROLE)),
77
79
  'master-superagent-router': Object.freeze([ROLE.essence, ROLE.mother]),
78
- 'master-superagent-worker': Object.freeze([ROLE.fork, ROLE.essence]),
79
- 'master-superagent-loop': Object.freeze([ROLE.fork, ROLE.essence]),
80
- 'master-cost-optimizer': Object.freeze([ROLE.fork]),
81
- 'master-dual-manager': Object.freeze([ROLE.mother, ROLE.essence]),
80
+ 'master-superagent-worker': Object.freeze([ROLE.fork, ROLE.essence, ROLE.mother]),
81
+ 'master-superagent-loop': Object.freeze([ROLE.fork, ROLE.essence, ROLE.mother]),
82
+ 'master-cost-optimizer': Object.freeze([ROLE.fork, ROLE.mother]),
83
+ 'master-dual-manager': Object.freeze([ROLE.mother, ROLE.essence, ROLE.fork]),
82
84
  })
83
85
 
84
86
  export const SUBPLUGIN_CATALOG = Object.freeze([
@@ -117,7 +117,7 @@ export function apply(ctx, config = {}) {
117
117
 
118
118
  const service = {
119
119
  id: SERVICE.cost,
120
- version: '3.3.2',
120
+ version: '3.3.3',
121
121
  role,
122
122
  get mode() {
123
123
  return system.policy.describe().mode
@@ -354,7 +354,7 @@ export function apply(ctx, config = {}) {
354
354
  return {
355
355
  ok: true,
356
356
  id: 'cost-optimizer',
357
- version: '3.3.2',
357
+ version: '3.3.3',
358
358
  role,
359
359
  mode: current.mode,
360
360
  requestedMode: current.requestedMode,
@@ -396,7 +396,7 @@ export function apply(ctx, config = {}) {
396
396
  doubleCountGuard: report.doubleCountGuard,
397
397
  }
398
398
  })(),
399
- note: '3.3.2:系统层记账/预算/灰度/审计 + A1 工具输出紧凑化(默认 shadow)+ 瓮城回流出口(contract 1.1.1 真实投递,回执计数修复);工具面 A2–A3 与决策复用 B1–B4 已接入(shadow 默认)。',
399
+ note: '3.3.3:系统层记账/预算/灰度/审计 + A1 工具输出紧凑化(默认 shadow)+ 瓮城回流出口(contract 1.1.1 真实投递,回执计数修复);工具面 A2–A3 与决策复用 B1–B4 已接入(shadow 默认);3.3.3 起角色矩阵母体全开、分身挂双主管。',
400
400
  }
401
401
  },
402
402
  }