@sema-agent/settings-schema 17.2.0 → 19.0.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.
Files changed (141) hide show
  1. package/CHANGELOG.md +216 -0
  2. package/README.md +53 -6
  3. package/conformance/VERSION +1 -1
  4. package/conformance/baseline.json +3 -0
  5. package/conformance/cases/c01-entry-salvage-then-typo/expected.json +4 -1
  6. package/conformance/cases/c02-hosts-clamp-stacked/expected.json +4 -1
  7. package/conformance/cases/c03-literal-dotted-top-key/expected.json +4 -1
  8. package/conformance/cases/c04-all-bad-collection-not-salvaged/expected.json +4 -1
  9. package/conformance/cases/c07-hooks-is-not-a-config-domain/expected.json +4 -1
  10. package/conformance/cases/c08-limits-unknown-carried-64/expected.json +4 -1
  11. package/conformance/cases/c09-limits-unknown-carried-65/expected.json +4 -1
  12. package/conformance/cases/c10-record-key-secret-redacted-twice/expected.json +4 -1
  13. package/conformance/cases/c11-unicode-unknown-keys/expected.json +4 -1
  14. package/conformance/cases/c12-prototype-name-top-keys/expected.json +4 -1
  15. package/conformance/cases/c13-models-field-null/expected.json +4 -1
  16. package/conformance/cases/c14-models-field-empty-array/expected.json +4 -1
  17. package/conformance/cases/c15-models-field-number/expected.json +4 -1
  18. package/conformance/cases/c16-deep-nesting-205/expected.json +3 -0
  19. package/conformance/cases/c17-empty-domain-file/expected.json +3 -0
  20. package/conformance/cases/c18-wire-envelope-not-an-object/expected.json +4 -1
  21. package/conformance/cases/c19-wire-envelope-no-version/expected.json +4 -1
  22. package/conformance/cases/c21-governance-empty-object-wins/expected.json +4 -1
  23. package/conformance/cases/c23-mixed-validity-models/expected.json +4 -1
  24. package/conformance/cases/c24-valid-entries-with-unknown-keys/expected.json +4 -1
  25. package/conformance/cases/c25-published-roundtrip-zero-warnings/expected.json +4 -1
  26. package/conformance/cases/c26-hosts-array-1024/expected.json +4 -1
  27. package/conformance/cases/c27-hosts-array-1025/expected.json +4 -1
  28. package/conformance/cases/c28-large-document-over-1mb/expected.json +4 -1
  29. package/conformance/cases/c29-salvage-then-domain-refine-fails/expected.json +4 -1
  30. package/conformance/cases/c30-version-triple-a-first/expected.json +4 -1
  31. package/conformance/cases/c31-version-triple-b-changed/expected.json +4 -1
  32. package/conformance/cases/c32-version-triple-a-restored/expected.json +4 -1
  33. package/conformance/cases/c33-limits-nested-carried-key/expected.json +4 -1
  34. package/conformance/cases/c34-skills-content-vs-manifest/expected.json +7 -1
  35. package/conformance/cases/c35-portable-domain-file-is-null/expected.json +3 -0
  36. package/conformance/cases/c36-skills-entry-without-content/expected.json +7 -1
  37. package/conformance/cases/c37-skills-field-null/expected.json +6 -0
  38. package/conformance/cases/c38-remote-exec-is-a-non-domain-file/expected.json +4 -1
  39. package/conformance/cases/c39-hidden-file-in-config-d/expected.json +4 -1
  40. package/conformance/cases/c40-s712-identity-only-what-reads-out/expected.json +4 -1
  41. package/conformance/cases/c41-s792-encoded-pem-identity/expected.json +4 -1
  42. package/conformance/cases/c42-s792-unknown-key-secret-redacted/expected.json +4 -1
  43. package/conformance/cases/c43-s792-form-and-deep-encoded-pem/expected.json +4 -1
  44. package/conformance/cases/c44-s792-utf8-escape-glued-token/expected.json +4 -1
  45. package/conformance/cases/c45-s792-identity-bounds-and-decode-depth/expected.json +4 -1
  46. package/conformance/cases/c46-s811-host-name-url-userinfo-withheld/expected.json +4 -1
  47. package/conformance/cases/c47-s811-roles-key-url-userinfo-withheld/expected.json +4 -1
  48. package/conformance/cases/c48-s935-model-headers-transported/expected.json +4 -1
  49. package/conformance/cases/c49-s935-model-headers-secret-entry-dropped/expected.json +4 -1
  50. package/conformance/cases/c50-s784-lane-host-legal/expected.json +4 -1
  51. package/conformance/cases/c51-s784-lane-e2b-legal/expected.json +4 -1
  52. package/conformance/cases/c52-s784-lane-k8s-legal/expected.json +4 -1
  53. package/conformance/cases/c53-s784-lane-ssh-legal/expected.json +4 -1
  54. package/conformance/cases/c54-s784-lane-adb-legal/expected.json +4 -1
  55. package/conformance/cases/c55-s784-lane-local-docker-legal/expected.json +4 -1
  56. package/conformance/cases/c56-s784-lane-device-legal/expected.json +4 -1
  57. package/conformance/cases/c57-s784-g1-enabled-no-lane/expected.json +4 -1
  58. package/conformance/cases/c58-s784-g2-multitenant-host/expected.json +4 -1
  59. package/conformance/cases/c59-s784-g3-k8s-missing-image/expected.json +4 -1
  60. package/conformance/cases/c60-s784-g3-e2b-missing-key/expected.json +4 -1
  61. package/conformance/cases/c61-s784-g3-other-lane-key/expected.json +4 -1
  62. package/conformance/cases/c62-s784-g7a-session-tidb/expected.json +4 -1
  63. package/conformance/cases/c63-s784-host-two-replicas/expected.json +4 -1
  64. package/conformance/cases/c64-s784-multitenant-local-store/expected.json +4 -1
  65. package/conformance/cases/c65-s784-pg-without-db/expected.json +4 -1
  66. package/conformance/cases/c66-s784-memory-backend-mismatch/expected.json +4 -1
  67. package/conformance/cases/c67-s784-retired-field-loud/expected.json +4 -1
  68. package/conformance/cases/c68-s784-device-local-store/expected.json +4 -1
  69. package/conformance/cases/c69-deep-encoded-token-past-every-reading/expected.json +4 -1
  70. package/conformance/cases/c70-rewritten-token-in-front-of-encoded-pem-header/expected.json +4 -1
  71. package/conformance/cases/c71-one-scanner-write-reads-display-forms/expected.json +4 -1
  72. package/conformance/cases/c72-dangling-reference-write-seat-refuses/expected.json +4 -1
  73. package/conformance/cases/c73-projects-extended-registration-reads/expected.json +4 -1
  74. package/conformance/cases/c74-projects-over-bound-refused/expected.json +4 -1
  75. package/conformance/cases/c75-projects-patch-remote-uniqueness/expected.json +4 -1
  76. package/conformance/cases/c76-projects-entry-salvage-nested/expected.json +4 -1
  77. package/conformance/cases/c77-prompts-center-artifact-carried/expected.json +4 -1
  78. package/conformance/cases/c78-prompts-empty-bindings-refused/expected.json +4 -1
  79. package/conformance/cases/c79-prompts-bad-worker-artifact-not-salvaged/expected.json +4 -1
  80. package/conformance/cases/c80-prompts-wire-v2-verbatim/expected.json +7 -1
  81. package/conformance/cases/c81-prompts-declaration-bindings-refused/expected.json +4 -1
  82. package/conformance/cases/c82-prompts-v1-catalog-refused/expected.json +4 -1
  83. package/conformance/cases/c83-prompts-bad-overlay-not-salvaged/expected.json +4 -1
  84. package/conformance/cases/c84-sandbox-git-block-carried-verbatim/expected.json +7 -1
  85. package/conformance/cases/c85-sandbox-git-refused-block-still-carried/expected.json +7 -1
  86. package/conformance/cases/c86-a2a-peers-legal/expected.json +135 -0
  87. package/conformance/cases/c86-a2a-peers-legal/input.json +32 -0
  88. package/conformance/cases/c86-a2a-peers-legal/meta.json +5 -0
  89. package/conformance/cases/c87-a2a-credential-refs-not-partially-salvaged/expected.json +123 -0
  90. package/conformance/cases/c87-a2a-credential-refs-not-partially-salvaged/input.json +39 -0
  91. package/conformance/cases/c87-a2a-credential-refs-not-partially-salvaged/meta.json +5 -0
  92. package/conformance/cases/cc01-mcp-toolfaces-non-object/expected.json +4 -1
  93. package/conformance/cases/cc02-mcp-source-key-is-transported/expected.json +4 -1
  94. package/conformance/cases/cc03-model-compat-unknown-subkey/expected.json +4 -1
  95. package/conformance/cases/cli01-model-name-nfc-vs-nfd/expected.json +4 -1
  96. package/conformance/cases/cli02-control-and-zero-width-chars/expected.json +4 -1
  97. package/conformance/cases/cli03-credential-pasted-into-unknown-key/expected.json +4 -1
  98. package/conformance/cases/cli04-env-value-with-newline/expected.json +4 -1
  99. package/conformance/cases/cli05-long-and-prefix-colliding-names/expected.json +4 -1
  100. package/conformance/cases/t01-absent-domain-key-not-null/expected.json +4 -1
  101. package/conformance/cases/t03-prototype-name-key-not-swallowed/expected.json +4 -1
  102. package/conformance/cases/t04-secret-literal-never-in-warning-value/expected.json +4 -1
  103. package/conformance/cases/z01-every-domain-empty-object/expected.json +4 -1
  104. package/conformance/cases/z02-every-domain-unknown-key/expected.json +4 -1
  105. package/dist/center-refs.d.ts +4 -3
  106. package/dist/center-refs.js +8 -6
  107. package/dist/cli.d.ts +1 -1
  108. package/dist/config-fns.d.ts +6 -1
  109. package/dist/config-fns.js +16 -2
  110. package/dist/execution-lanes.d.ts +158 -11
  111. package/dist/execution-lanes.js +76 -11
  112. package/dist/file-edit.d.ts +1 -1
  113. package/dist/file-edit.js +2 -1
  114. package/dist/hooks-config.d.ts +23 -5
  115. package/dist/hooks-config.js +33 -5
  116. package/dist/hooks.d.ts +6 -4
  117. package/dist/hooks.js +3 -1
  118. package/dist/mcp-request-entry.d.ts +11 -21
  119. package/dist/mcp-request-entry.js +21 -38
  120. package/dist/one-time-migrations.js +1 -1
  121. package/dist/portable-domains.d.ts +1 -1
  122. package/dist/portable-domains.js +1 -1
  123. package/dist/remote-exec.d.ts +5 -0
  124. package/dist/remote-exec.js +5 -0
  125. package/dist/reserved-member-name.d.ts +13 -0
  126. package/dist/reserved-member-name.js +14 -0
  127. package/dist/retired-envs.js +2 -0
  128. package/dist/secret-refs.d.ts +1 -1
  129. package/dist/secret-refs.js +5 -1
  130. package/dist/types.d.ts +70 -41
  131. package/dist/types.js +179 -32
  132. package/dist/url-credential.d.ts +12 -2
  133. package/dist/url-credential.js +164 -9
  134. package/dist/wire-name.d.ts +19 -0
  135. package/dist/wire-name.js +21 -0
  136. package/docs/API-SURFACE.md +27 -6
  137. package/docs/CC-DIVERGENCE.md +2 -2
  138. package/docs/CONSUMER-INTEGRATION.md +72 -7
  139. package/llms-full.txt +38 -18
  140. package/llms.txt +10 -10
  141. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -8,6 +8,222 @@
8
8
 
9
9
  ## Unreleased
10
10
 
11
+ ## 19.0.0 — 2026-11-03 — major:hook 条目承运 `args`(command 的 exec 形参数表)与 `onFailure`(command / http:失败按放行还是按 exit 2 阻断)· 词闭集 `HOOK_ON_FAILURE_WORDS` / 型 `HookOnFailure` · 这两个键的坏值自此是坏块(校验收紧)
12
+
13
+ > 档位(按发版纪律):**major** —— 校验收紧、同一份配置解析出不同结果(发版纪律「破坏性变更必 bump major」点名的两类),理由是下面「会变的三处」,尤其第 ②:守卫事件里一个坏值能让整份设置不装。加性的部分:新导出两个(`HOOK_ON_FAILURE_WORDS` 值、`HookOnFailure` 型);hook 条目字段表多两个可选列(`CommandHookEntry` 多可选键 `args` 与 `onFailure`,`HttpHookEntry` 多可选键 `onFailure`;对 `keyof` 写穷举表的消费方在提货时编译红,是提货成本)。
14
+ > **同一输入解析结果会变的三处**:① 带这两个键的条目,装上的那一份自此带着它们(此前被当作契约外的键剥掉);② 这两个键带**坏值**的条目 —— 词表外的 `onFailure`、不是串数组或含 NUL 元素的 `args` —— 自此是坏块:非守卫事件里剔那一条,**守卫事件(`PreToolUse` / `PermissionRequest`)里整份设置不装,同文件的 `permissions.deny` 一起不生效**;此前这两个键不论值是什么都被剥掉、整份照装(值里藏守卫迹象的除外:那一直是整份拒,见 `classifyHooksConfig` 头注)。上面是分类器的读法;zod 面(`HooksConfig` / `HookEntry` / 逐型五只)对该值**整个拒**,`readSettingsUnit("hooks", …)` 对该设置单元**整个答 `unreadable`**(此前都受理)——不止「剔那一条」;
15
+ > ③ 已经是坏块的条目若还带着这两个键的坏值,`field` 点名字段表序里第一个坏字段 —— `args` 在表里排在 `shell` / `async` / `asyncRewake` / `onFailure` 与公共字段(`if` / `timeout` / `statusMessage` / `once`)之前,`onFailure` 排在公共字段之前(command 里在 `async*` 之后,http 里在 `headers` / `allowedEnvVars` 之后),所以 `{ type: "command", command: "x", args: [1], shell: "zsh" }` 的 `field` 由 `shell` 变 `args`(`async: "yes"` / `asyncRewake: 5` 同),`{ type: "command", command: "x", onFailure: "retry", timeout: 0 }` 的由 `timeout` 变 `onFailure`(结局不变:仍是同一条坏块)。对不带这两个键的文档,读数逐字不变(差分门语料里原先拿 `onFailure` 当契约外键的样本换成了 `rewakeSummary`,其余样本零翻面)。
16
+ > **迁移**:不配一次性迁移 —— 坏值没有可猜的正确值,要人改。升级前检查设置文件、请求体里的 `hooks`(含存下来要续跑的):把词表外的 `onFailure` 改成 `continue` | `block`、把不合形的 `args` 改成串数组(元素不含 NUL;`[]` 与空串元素合法),或把这两个键整个删掉(删掉后读数逐字同 18.0.0)。不确定就先跑一遍 `classifyHooksConfig`:结局不是 `loaded`,或 `field` 是 `args` / `onFailure`,就是要改的那一条。
17
+ > 律:hook 条目的字段集只有一张表(`HOOK_ENTRY_FIELDS`),分类器、zod 面、条目类型同读它;「承运」与「执行」是两件事 —— 本包只判形,读到 `onFailure: "block"` 的消费方执行它或明拒它,静默不执行等于守卫起不来照放行。
18
+
19
+ ### 字段表两列与词闭集
20
+
21
+ - **`args`(只 command)**:exec 形参数表(CC `cli309.js:252382`:`args` 在场时 `command` 是一个可执行文件、带这些参数直接 spawn,不过 shell;在场本身就是开关,`[]` 也是 exec 形)。值 = 串数组,装上时拷贝;本包另判**元素零 NUL**(`spawn()` 对含 NUL 的参数抛;CC 的 `C(o())` 不判);空串元素是值(空参数是合法的 exec 参数)。别的四型上写 `args` 仍是契约外的键(剥掉,不算坏块;键下装着守卫迹象的除外)。
22
+ - **`onFailure`(command 与 http)**:这个 hook 的**失败**怎么办 —— 起不来(脚本缺失)、超时、退出码非 0 非 2、输出的 JSON 非法或校验不过。`continue`:失败被报告,动作照做;`block`:失败按 exit 2 算,事件所守卫的动作被阻断(CC 的 `onFailure:At()` 只在 command 与 http 两个 schema 上;对异步条目与 `Stop` / `SubagentStop` / `TaskCompleted` / `TeammateIdle` 事件不生效,那是执行方的事)。
23
+ 缺席就是缺席:本包不补缺省(CC 的缺省是 `continue`,读方自己补)。prompt / agent / mcp_tool 上写 `onFailure` 仍是契约外的键。
24
+ - **`HOOK_ON_FAILURE_WORDS = ["continue", "block"] as const`**(包根与 `./hooks`)· 型 **`HookOnFailure`**。登记表 `docs/API-SURFACE.md` 已重生。
25
+ - **一事一源**:字段表仍是唯一声明 —— 两个新取值类(`argv` · `onFailure`)是表里的两个词,分类器的取值判、zod 面、条目类型都从表读;没有按字段名写的分支。词表的运行期镜像是分类器闭包私有的 `Record<HookOnFailure, true>`(分类器被消费方的生成器整函数抄走,自由名只有 `HOOK_EVENTS`,读不了导出的词表),
26
+ 编译器双向咬死 —— 导出词表加一个词而镜像不补一行、或镜像多一行,`tsc` 红;钉再核一遍:分类器受理的值恰是导出的词表。
27
+ - **仍不承运**(`docs/CC-DIVERGENCE.md` H7 留):command / http 的 `rewakeMessage` · `rewakeSummary` · `cloud`(CC 标 `@internal`)与 prompt 的 `continueOnBlock` —— 本版仍按契约外的键剥掉、不看值:守卫事件里 `rewakeMessage: ""`、非布尔的 `continueOnBlock` 照装,比 CC 松(CC 的 schema 判这两个值;`cloud` 的坏值 CC 读成 `skip` 照装,与本包同)。**已知限制**,随下一个 major 承运这四个余键时一并收(键下装着守卫迹象的除外:那一直是整份拒,不因本版改变)。
28
+ - **三问** —— **谁需要**:把 `hooks` 当守卫写的部署与壳:`onFailure: "block"` 让「守卫起不来 / 超时 / 吐坏 JSON」按拒绝算而不是照放行;`args` 让带引号 / `$` / 反引号的路径不过 shell 解析器;此前这两个键一进契约就被剥掉,守卫起不来照放行、exec 形条目只剩可执行名去跑。
29
+ **谁受伤**:第 ① 处,依消费方是否执行 exec 形而定 —— 带 `args` 且 `command` 是整行 shell 命令的条目(例 `{ command: "/g.sh --strict", args: [] }`):18.0.0 的消费方把 `args` 剥掉,整行过 shell 照跑;执行 exec 形的 19.0.0 消费方把整行当可执行文件名去 spawn,起不来,缺省 `continue` 下被守卫的动作照做(CC 同读,这类文档对 CC 本来就是错的);第 ② 处 —— 在这两个键上写过坏值的设置文档(词表外的 `onFailure`、不合形的 `args`);守卫事件里是整份不装。CC 的 schema 对这两个键同样判值(`onFailure` 是 `continue` | `block` 的枚举,`args` 是串数组),所以按 CC 写的文档只在一种情形下受伤:`args` 的元素含 NUL(CC 不判,本包判)。
30
+ **补偿**:坏块的 `field` 点名 `args` / `onFailure`;改成 `continue` | `block` / 串数组即可。不想要这两个键的文档删掉它们,读数逐字同 18.0.0。
31
+
32
+ ### 消费方提货
33
+
34
+ - **server 7.147.0**:`CommandHookEntry` / `HttpHookEntry` 的 `onFailure`(随条目到达,`block` 的失败按 exit 2 执行;不执行就要在受理面明拒)· `args`(契约字段)· `HOOK_ON_FAILURE_WORDS` / `HookOnFailure`(穷举处读词表)。
35
+ - **cli**:`CommandHookEntry` / `HttpHookEntry` 的两个键 —— 壳若自己执行 hook(引擎属主事件 `ENGINE_OWNED_HOOK_EVENTS` 以外)执行它们或明拒;「能不能装」仍只问 `classifyHooksConfig`。
36
+ - **client-core**:由 `classifyHooksConfig` 生成的读器副本 —— 闭包多一个私有件 `HOOK_ON_FAILURE_ACCEPTED`(与 `HOOK_SHELLS` 同法随函数抄走),自由名仍只有 `HOOK_EVENTS`;生成器照旧整函数抄。
37
+ - **web-admin**:`HookEntry` 一族的编辑面可选地承运两列;不读也不受影响(加性的类型面)。
38
+ - **sdk**:类型面 —— 多两个可选键;对 `CommandHookEntry` / `HttpHookEntry` 的 `keyof` 写穷举表的地方编译红,补两列。
39
+ - 文书:README hooks 条一句 + 升级指引(18.0.x → 19.0.0)· `llms.txt` / `llms-full.txt` · `docs/CONSUMER-INTEGRATION.md` §18 · `docs/CC-DIVERGENCE.md` H7 改准 · `docs/API-SURFACE.md` 重生。
40
+
41
+ ### 钉
42
+
43
+ `test/hooks-command-fields-19.0.0.test.ts`(承运集:每型装上的键与键序、类型面 `keyof` 精确 · `args` 正控 / `[]` 与空串元素 / 坏形(非数组 · 非串元素 · 含 NUL)× 守卫与非守卫 / 别的四型不带 · `onFailure` 两词 × 两型 × 两类事件 / 缺席不补缺省 / 词表外与非串(含大小写变体与原型名)× 两型 × 两类事件 / 别的三型不带 · zod 面投影 ·
44
+ 词表导出与分类器同一份读法〔含原型名;分类器私有镜像的键从源码字面量读出,与导出元组逐词比〕· 四个仍不承运的键〕)· `test/hooks-classify-13.0.0.test.ts`(两处把 `onFailure` 当「契约外键」的例子换成 `rewakeSummary`,判不变:契约外的键剥掉、不算坏块;差分门语料的 `extra` 样本同换)· `test/docs-19.0.0.test.ts`(文书对账)。
45
+
46
+ **自 v18.0.0 起运行期代码有改动的公开导出(机器重算;上界 —— 可达 ≠ 一定变,不可达 ⇒ 一定不变;本版新增的导出不入表)**
47
+
48
+ ```text
49
+ AgentHookEntry [., ./hooks]
50
+ CommandHookEntry [., ./hooks]
51
+ HookEntry [., ./hooks]
52
+ HookMatcherEntry [., ./hooks]
53
+ HooksConfig [., ./hooks]
54
+ HttpHookEntry [., ./hooks]
55
+ McpToolHookEntry [., ./hooks]
56
+ PromptHookEntry [., ./hooks]
57
+ classifyHooksConfig [., ./hooks]
58
+ readSettingsUnit [.]
59
+ ```
60
+
61
+ ## 18.0.0 — 2026-11-03 — major:车道词 `none`(不给智能体的工具提供执行环境)· `REQUIRE_EXECUTION_LANE` 进墓碑表 · 车道集单一判官 `laneSetFlaws` / `LANE_SET_RULE` · 便携新域 `a2a`(常驻出站 A2A 对端名册)· 凭据引用集合不可部分抢救 `ATOMIC_SALVAGE` · 复合凭据名 `credentialParamWordOf`
62
+
63
+ > 档位(按发版纪律):**major** —— 三处不加性边:① 词表联合加成员(`ExecutionLane` 加 `none`、`TenantSeparationBasis` 加 `no-execution-target`、`RemoteExecSpec` 加 `none` 臂、`DomainName` 尾插 `a2a`;对它们写穷举 `switch` / `Record<…>` 的消费方编译红,把不认识的词读成某条车道的消费方运行期读错;公开记录读器的保留成员名由一个名改成一张表 —— `PLAIN_STRING_RECORD_RESERVED_MEMBER` 删除、`PlainStringRecordRead` 的 `reservedMember: boolean` 改名 `reservedMembers`,读它们的消费方编译红);
64
+ > ② `EffectiveConfig` 多一个**必填**成员 `a2a`(自己构造 `EffectiveConfig` 对象的消费方编译红;不在 minor 档的「可选键(无默认)」内);③ **同一输入解析结果改变**:本地 `config.d/a2a.json` 由不读(`unread-config-file`)变读,远端 `/effective.a2a` 由原样透传变契约解析(补缺省、剥未知键、逐条抢救),
65
+ > 本地腿的内容哈希版本对同一组文件变一次(哈希里多了 `a2a` 这一格),直接对 `WorkersConfig` 调 `salvageEntries` 时 `secretEnv` 带坏引用的 worker 整条丢(此前只丢那一条引用),请求面传输的 `env` / `headers` 与中心引用解析口对名叫 `constructor` / `prototype` 的成员同 `__proto__` 一样答保留(剔出并各记一条 `lost` / 整台 `refs_unreadable`,此前照收),凭据引用集合里有叫 `__proto__` / `constructor` / `prototype` 的引用 ⇒ 集合坏、条目整条丢(此前 `__proto__` 被剥掉、只告警 `unknown-keys-dropped`,条目带其余引用存活;`constructor` / `prototype` 作头名受理),`REQUIRE_EXECUTION_LANE` 在墓碑表里(读这张表的引擎起服 / 壳 / 渲染器见之拒),车道集、「enabled 的 worker 必须声明车道」与多租户拒句三句的文字随车道表改(多租户拒句「分租户的车道」出路列表多了 `none`),车道表里的重复与兄弟字段的不可续错误并行报(见判官小节),凭据参数名判官对复合名的答案由否变是(`isCredentialParamName` / `findUrlCredential` 对 `db_password` / `dbPassword` / `x-db-secret` / `user_pwd` / `PGPASSWORD` / `SECRET_KEY` 一类名字:带这类参数的 URL,受理口由受理变拒)。
66
+ > 律:车道集的合法性只有一个答者(判官 `laneSetFlaws`,写闸只调它;此前是枚举 + `.min(1)` + 手写去重三处各判一块);「没有执行环境」是一个声明(`lanes: ["none"]` / `REMOTE_EXEC=none`),不是「没写」;「点名了没有」只剩 `REMOTE_EXEC` 一个答者(总开关进墓碑表)。
67
+ > 导出面:根桶 + `./execution-lanes` 加 `laneSetFlaws` / `LANE_SET_RULE` 与类型 `LaneSetFlaw` / `StandaloneLane`;根桶 + `./types` 加 `A2aPeerSpec` / `A2aConfig`(值 + 类型)与 `ATOMIC_SALVAGE`;根桶加 `credentialParamWordOf`(值);根桶 + `./mcp-request-entry` 加 `RESERVED_MEMBER_NAMES` / `isReservedMemberName` 与类型 `ReservedMemberName`,`PLAIN_STRING_RECORD_RESERVED_MEMBER` 删除(零别名;登记表 `docs/API-SURFACE.md` 已重生)。零别名、零双读;不需要一次性迁移(没有要改写的存量:`none` 与 `a2a` 都是新形)。
68
+
69
+ ### 车道词 `none` 与 `REQUIRE_EXECUTION_LANE` 墓碑
70
+
71
+ - **`none` 进 `EXECUTION_LANE_WORDS`(第八个词,尾插)**。用户面行为:智能体的工具**没有执行环境**(什么都不挂载)。表行:分租户 `tenantSeparation: "supported"`,依据是新的第三个依据词 `no-execution-target`(`TENANT_SEPARATION_BASES`:没有执行目标,就没有跨租户共享的目标)、
72
+ 不挂副本(`singleReplica: false`)、四栏 env 全空(没有坐标、没有密钥)。车道表头注里「`in-process` 不在表里 …… 先定用户面行为再给词」一段换成 `none` 的定义;`in-process` 仍不是可声明的车道词。
73
+ - **只能独成一集**:声明了依据列为 `no-execution-target` 的车道,车道表就只能有它这一项 —— 判官按**依据列**判、不点名车道词(先例 `singleReplica`),这一类车道的型 `StandaloneLane` 也从表行派生(今天 = `none`)。拒因是判官的 `not_alone`(见下节),与非空 / 去重 / 认词同一只判官。
74
+ 不给工具提供执行环境的 worker 写 `runtime.execution.lanes: ["none"]`;车道集必填那一句(`LANES_REQUIRED`)由「没有『无手』车道,停用 worker」改指 `lanes: ["none"]`。
75
+ - **`REQUIRE_EXECUTION_LANE` 进墓碑表 `RETIRED_ENVS`**:`replaced` → `REMOTE_EXEC`(每个部署都点名自己的车道之后它恒真;「没有执行环境」也是一个声明,`REMOTE_EXEC=none`)。旧名在场即拒,替代名在不在都一样;空串 = 未设,不拒。
76
+ 它随之离开保留名表(`RESERVED_WORKER_ENV`):worker 的 `env` / `secretEnv` 里写它,拒句由「归 `runtime.execution.lanes`」变成墓碑句本身(`retiredEnvRefusal`,唯一铸点)。一次性迁移 SS-M4 识别的车道旧键集(`LANE_WORD_KEYS`)不动。
77
+ - **车道文件 `RemoteExecSpec` 加零字段臂 `{ provider: "none" }`**:`config.d/remote-exec.json` 里 `REMOTE_EXEC=none` 的文件形;没有可配的字段、没有 secret(`listRequiredEnvNames` 对它不列任何名)。
78
+ - **执行域策略 `allowedLanes`(开放词)**:类型面只认 `none`;切换期(还有引擎答旧状态名、也有引擎答 `none` 时)策略**数据**并列 `"in-process"` 与 `"none"`,所有读它的引擎都答 `none` 之后从数据里删掉 `"in-process"` —— 这是开放列表的合法内容,不是代码里的第二种读法。
79
+
80
+ ### 车道集单一判官 `laneSetFlaws` / `LANE_SET_RULE`
81
+
82
+ - **`laneSetFlaws(lanes: readonly unknown[]): readonly LaneSetFlaw[]`**(根桶 + `./execution-lanes` 零依赖叶模块,先例 `deviceRelayFlaws` / `DEVICE_RELAY_RULE`)。拒因闭集 `LaneSetFlaw`:`empty_set` · `blank_entry{at}`(空串或只含空白,判官 `isBlankCoordinate`)· `unknown{at, word}`(不是车道词 —— 含根本不是字符串的项,`word` 是原值)· `retired{at, word}`(车道值墓碑里的旧词)·
83
+ `duplicate{at, lane}`(第二次出现的那一格)· `not_alone{lane}`(独占车道与别的项同集)。空表恒答恰一条 `empty_set`;每格先判是不是字符串、再判空白、再判认词(重复 / 墓碑 / 不认识),最后判独占。入参是任意值的表(读 JSON 的写闸原样交进来,引擎切段后交字符串):「每一项都是车道词」只此一处判。
84
+ 按下标读(`0 … length-1`):稀疏表的空洞读成 `undefined`,是一项不是字符串的项(`unknown{at, word: undefined}`,与写闸的下标快照同答;`new Array(1)` 不是合法的车道表,`["none", ,]` 也不是独占)。
85
+ - **`LANE_SET_RULE`**:规则句(词表与独占形从表派生,不手抄),写闸的车道集拒句都以它收尾。
86
+ - **写闸只调它**:`WorkerSpec` 的 `runtime.execution.lanes` 只判「是一个列表」,整张交给判官,每条拒因一条 issue(穷举 `switch`:判官加一种拒因而写闸不补 ⇒ 编译红)。issue 的机读码与坐标与此前三处判据各自给的逐一相同 —— 词形坏(不是字符串 / 空白 / 不认识 / 墓碑词)= `invalid_value`(`values` = 车道词表;墓碑词的句子是墓碑句)且不可续,
87
+ 空表 = `too_small`,重复 = `custom`;独占 = `custom`,落在整张表上。**一处有意的差**:一张表里坏词与重复同在(`["kata","host","host"]`)⇒ 两条都报(判官交回全部拒因);17.2.0 的写闸在坏词处中断,重复那一格不报。结论(拒)不变。
88
+ **第二处差(同一个原因)**:重复判搬进了 `lanes` 自身,与同一 `runtime.execution` 里兄弟字段 `coords` / `secretRefs` 的不可续错误并行报(`{lanes:["host","host"],coords:42}` ⇒ 重复 @`lanes.1` 与型错 @`coords` 两条);17.2.0 的重复判挂在对象上,兄弟字段坏时不跑、只报兄弟那一条。结论(拒)不变。读车道集的消费方(引擎读声明的车道表)调同一只判官,不抄第二份。
89
+
90
+ ### 便携新域 `a2a` 与凭据引用集合不可部分抢救
91
+
92
+ - **`A2aPeerSpec` / `A2aConfig`(`DOMAIN_SCHEMAS` 尾插 `a2a`)**:`{ peers: A2aPeerSpec[] }`(缺省空表 = 不拨任何对端),对端名唯一(重名拒,同 `McpConfig`)。`A2aPeerSpec = { name, url, cardUrl?, headerRefs?, principalHeader?, allowSkills?, scenarios(缺省 []), enabled(缺省 true) }`;
93
+ 判官全复用、按身份同一只:`name` = 线上名判官 `isUsableWireName`(对端名是线上工具名 `a2a__<名>__…` 的身份片;判据搬进包内零依赖叶子,`./mcp-request-entry` 照旧转出同一个函数对象)、`url` / `cardUrl` = `NON_SECRET_URL`(与 mcp `transport.url` 同座:不带凭据与 fragment;
94
+ 名形判官 `findUrlCredential` 不接进读已落盘字节的 schema)、`headerRefs` = mcp 的头名 → env-NAME 引用集合(中心只存 env-NAME,值在读方自己的环境里)、`principalHeader` = 头名判官。首版不收 `notes` / `rosters` / `toolAxes`(剥掉并告警 `unknown-keys-dropped`)。
95
+ - **按域表**:`PORTABLE_DOMAINS` 加 `a2a`(本地 `config.d/a2a.json`;与非便携理由表成对编译咬死)· `DOMAIN_READ_FALLBACK.a2a = "default"`(整域读不进 ⇒ 空名册:能力消失,没有闸因此丢掉)· `DOMAIN_ENTRY_SALVAGE.a2a = "salvage"`(坏对端逐条丢)·
96
+ `DOMAIN_WRITE_ROLE.a2a = "publisher"`(**显式写**:那张表是 `Partial`,漏写会静默退回缺省 `editor`;一个对端就是一组挂进智能体的远端技能加上它的凭据引用,与 mcp 同档)· `EffectiveConfig.a2a`(两腿恒物化 `{ peers: [] }`)。
97
+ 一次性迁移 SS-M7 的 URL 座位由 schema 派生,自动多出 `a2a.peers[].url` / `a2a.peers[].cardUrl`。密钥引用清单 `collectEnvRefs`(与随它的本地「还缺哪些密钥」面板 `listRequiredEnvNames`)列出每个对端的每条头引用(域 `a2a`,坐标 `peer "<名>" headerRefs.<头名>`)。
98
+ - **`ATOMIC_SALVAGE`(按 schema 身份的集合)**:凭据引用集合 —— mcp 的 `envRefs` / `headerRefs`(a2a 对端的 `headerRefs` 复用后者)、车道块的 `secretRefs` 与 worker 的 `secretEnv` —— **不部分抢救**:逐条抢救走到成员不下钻,集合里任一键 / 值坏形 ⇒ 它所属的条目整条 `entry-dropped`、兄弟条目保留。
99
+ 丢掉一条坏引用不是「更窄」,而是让条目带着一半凭据活下来去拨远端(读方对任一引用的 env 缺席本来就整条跳过,同一个方向)。别的集合字段(`allowSkills` / `scenarios` / `allowTools` …)照旧逐条丢。新的凭据引用集合复用这几只 schema 或登记进这里(按身份判,换一只同形的新 schema 不算成员)。
100
+ 律是按类收的,不按字段挑:worker 的 `secretEnv` 与车道块的 `secretRefs` 同形(服务变量名 → 宿主 env-NAME),同在。
101
+ **成员读键按自有属性名判**(名集 = `Object.getOwnPropertyNames` 的串键;经包的读内核读,不调 getter):`__proto__` / `constructor` / `prototype` 任一作引用名 ⇒ 这只集合坏 ⇒ 条目整条 `entry-dropped`、兄弟保留(写口同拒);
102
+ 名字读不出(访问器成员 / 隐藏的自有键 / 陷阱抛 —— 只有内存对象会这样,JSON 铸不出)同样判坏,句子是内核那一句(守卫看不清名字就不担保)。zod 的 record 读键前先跳过 `__proto__`、不判它的值 ——
103
+ 17.2.0 对 mcp 条目 `headerRefs: {"__proto__": …, "Authorization": "HOST_TOKEN"}` 读出「只有 `Authorization`」(告警 `unknown-keys-dropped` 点名那个键)、条目带着其余引用存活;`constructor` / `prototype` 作 HTTP 头名(mcp / a2a 的 `headerRefs`)曾受理,自此拒
104
+ (env 名形的三只成员本来就拒小写的 `constructor` / `prototype`,对它们只多了 `__proto__`)。只含这几个词的名字(`X-Constructor`、`PROTOTYPE`)照旧收;非成员的 `z.record` 座位不在本版。
105
+ **保留成员名只有一张表**(`RESERVED_MEMBER_NAMES` + 谓词 `isReservedMemberName`,根桶与 `./mcp-request-entry`):这道守卫、公开记录读器 `readPlainStringRecord` / `isStringRecord`(请求面传输的 `env` / `headers` 同读)、
106
+ 中心引用解析口 `resolveCenterRefs` 问同一个谓词,三处同答 —— 此前记录读器与解析口只保留 `__proto__`(`PLAIN_STRING_RECORD_RESERVED_MEMBER`,删除),`resolveCenterRefs({constructor: …})` 答 `resolved` 并铸出自有 `constructor`,
107
+ 与 schema 一问两答。读器的读数 `reservedMembers` 按自有键序列出在场的保留名(没进副本);解析口点名第一个。
108
+ **对已记录语料零变化**(workers 域不逐条抢救;mcp 的两只住在传输判别联合里,走查不进联合;车道块住在不是集合的 `runtime` 对象里);**新守卫的例外**:引用名为 `__proto__` / `constructor` / `prototype` 的条目整条丢
109
+ (17.2.0:`__proto__` 被剥并告警 `unknown-keys-dropped`、`constructor` / `prototype` 作头名照收 —— 条目都留着;带合法兄弟时自此只剩兄弟);**不加性的另一处**:直接对 `WorkersConfig` 调 `salvageEntries` 时,
110
+ `secretEnv` 里坏一项(键或值不是 env-NAME)的 worker 由「只丢那一条引用(`entry-key-invalid`)、worker 带其余引用存活」变「整个 worker `entry-dropped`(`entry-schema-invalid`)、兄弟 worker 保留」。
111
+ 这两句不只是推理:17.2.0 包对一组覆盖语料全部 case 与各域合成样本的真读数逐行对拍,改了读数的那一行逐行登记、新读数手写。
112
+ 密钥引用清单 `collectEnvRefs` 是手列的(它的坐标是给人读的,且还列不是集合的单个引用字段,所以不从成员表派生);两表同集由钉守:从 `DOMAIN_SCHEMAS` 派生出的每一个成员座位,清单都读得到。
113
+
114
+ ### 复合凭据名 `credentialParamWordOf`
115
+
116
+ - **病**:凭据参数名判官只认整名(表内 23 词)。`db_password` / `DB_PASSWORD` / `dbPassword` / `x-db-secret` / `user_pwd` / `PGPASSWORD` / `SECRET_KEY` 这类以强档词作末段的名字,受理口判官(`isCredentialParamName` / `findUrlCredential`)受理不拒,读同一张名表的日志脱敏器也不遮它们的值 ——
117
+ 判官与脱敏器给不出同一个答案之外,`?db_password=…` 里的真口令原样进日志、转录、同步体与流式帧。
118
+ - **导出(根桶,一只)**:`credentialParamWordOf(decodedName: string): CredentialParamName | undefined`,「这个已解码的参数名是不是凭据名」的唯一答者。① 整名(ASCII 大小写不敏感)在 `CREDENTIAL_PARAM_NAMES` 上 ⇒ 那个词(照旧;整名优先,`client_secret` 答 `client_secret`,不答它的末段 `secret`);
119
+ ② 否则名字按 `_` / `-` / `.` 与驼峰边界切段(空段不存在),**末段**的尾部是强档词(`password` / `passwd` / `pwd` / `secret` / `apikey`)⇒ 那个词 —— `db_password` · `DB_PASSWORD` · `dbPassword` · `x-db-secret` · `user_pwd` 与前缀粘连的 `PGPASSWORD` 都算,词不跨分隔符(`app_wd` 不是 `pwd`);
120
+ ③ 尾串闭集四条(逐词对齐,分隔符与大小写不论):`secret key` / `secret access key` ⇒ `secret`(`SECRET_KEY` · `AWS_SECRET_ACCESS_KEY`);`api key` ⇒ `api_key`(`x-api-key` · `X_API_KEY` · `xApiKey`);`access token` ⇒ `access_token`(`github_access_token` · `oauth-access-token`)。
121
+ **尾串答词只有一条律,不逐项特判**:尾串用 `_` 连起来若本身就是整名表里的词,答那个整名词(与整名的答案同形);否则答它的强段词(`secret_key` / `secret_access_key` 不在整名表,答 `secret`)。
122
+ 闭集,不做通配:别的名表多段词(`refresh_token` · `private_key` …)与裸 `access_key` 作末尾照今天的整名表;末段不是尾串的末词不命中(`api_key_count` · `token_count` · `api_key_id`)。
123
+ - **只看末尾**:前缀 / 中段命中不算,词后还有别的字就不是 —— `password_hash` · `password_policy` · `password_hint` · `secretName` · `secret_name` · `pwd_dir` · `passwordless` 逐条不是凭据名;数字尾巴不剥(`password2` 不是);
124
+ 名表里别的 18 个词(`token` / `key` / `refresh_token` / `private_key` …)作末尾时只认整名(上一条的尾词与尾串除外)—— `sort_key` · `token_count` 不因此被带进来。
125
+ 回显的词与整名一致:`x-api-key` ⇒ `api_key`,`github_access_token` ⇒ `access_token`,所以消费方拿它查自己的锚强度列时,带前缀的名字与整名落在同一档(`github_access_token=…` 与 `access_token=…` 在自由文本里同强)。
126
+ - **一事一源**:`isCredentialParamName` 与 `findUrlCredential` 的 query / fragment 臂都读它,模块里没有第二张表、第二条规则。名表同表多一列「这个词作为更长名字的末尾时算不算」(`Record<CredentialParamName, …>` 穷尽映射:名表加一个词而这一列不表态 ⇒ 编译红);
127
+ `findUrlCredential` 的 `name` 仍只回显表里的词 —— 复合名回显它收尾的那个词(`db_password` ⇒ `password`),调用方的名字字节不进答案、不进规则句。`CREDENTIAL_PARAM_NAMES` 不变(仍 23 词),`UrlCredential` 的形、拒因词与规则句逐字不变。
128
+ 返回的是**表词**:消费方拿它去查自己挂在名表上的那一列(例:日志脱敏器的自由文本锚强度),不再对整名查表。
129
+ - **三问**。谁需要:读「这个名字是不是凭据名」的每一处(含最常见的 API-key 头名 `x-api-key` 与 `github_access_token` 一类带前缀的令牌名)—— 服务端日志脱敏器的三个名字读者(URL 参数 · JSON 秘密字段 · 自由文本强锚)与诊断值位,受理口判官(MCP `transport.url` · A2A 对端 `url` / `cardUrl` · http 钩子 `url` · 搜索后端 `endpoint` · 图片 URL · 包源地址)—— 它们本来就该是一个答案。
130
+ 谁受伤:以强档词或尾串收尾、但值不是凭据的名字(`show_password=1` · `is_secret=true` · `has_password=false` · `has_access_token=false`)—— 受理口拒带这样参数的 URL、脱敏器遮它的值;方向是多拒多遮(少洗的一侧是真钥明文)。
131
+ 补偿:负控七词逐条写死(见『只看末尾』一条);带引号形与整名行为不变;不想被拒的非凭据参数换一个不以强档词收尾的名字。
132
+ - **不加性的一处**(已计入上面的 ③):同一输入的答案由否变是 —— 带复合名参数的 URL,受理口由受理变拒(`url_credential_param`);已存下来的数据零迁移(判官不接进读已落盘字节的 schema,载体律是座位的事)。
133
+
134
+ ### 🔴 硬顺序与消费方提货
135
+
136
+ - 🔴 **硬顺序**:web-admin 渲染器先停渲 `REQUIRE_EXECUTION_LANE`,中心起的 worker 才能上 server 7.147.0 —— 否则读这张墓碑表的引擎见之拒启,中心起的 worker 全部起不来。`none` 只对已经升级的部署产出(旧引擎、旧壳的车道表里没有这个词,读到即拒)。
137
+ - **server 7.147.0**:读 `EXECUTION_LANE_WORDS` / `EXECUTION_LANES`(`none` 行)· `RETIRED_ENVS`(起服见 `REQUIRE_EXECUTION_LANE` 拒启)· `RemoteExecSpec`(`none` 臂:文件声明的车道)· `laneSetFlaws`(读声明的车道表与写闸同一只)· `A2aConfig` / `EffectiveConfig.a2a` / `PORTABLE_DOMAINS`(本地 `config.d/a2a.json` 与中心 `/effective.a2a` 同一个声明座)· `credentialParamWordOf`(日志脱敏器的三个名字读者〔URL 参数 · JSON 秘密字段 · 自由文本强锚〕与诊断值位改读它,拿返回的词去查自己的锚强度列;受理口的 `isCredentialParamName` / `findUrlCredential` 读同一只 —— 判官与脱敏器同一版、同一天翻,不分两版)· `readRequestMcpTransport`(`env` / `headers` 里名叫 `constructor` / `prototype` 的成员自此与 `__proto__` 同剔、各记一条 `lost`〔`member_name_reserved`〕;续跑重放腿照挂、受理门据它拒)。
138
+ - **web-admin**:`RETIRED_ENVS`(先停渲总开关 —— 硬顺序)· 渲染器读 `runtime.execution.lanes`(`["none"]` ⇒ `REMOTE_EXEC=none`)· 执行域策略 `allowedLanes` 的数据在切换期并列 `"in-process"` 与 `"none"` · `a2a` 域的编辑面读 `A2aPeerSpec`,写权限读 `domainWriteRole("a2a")`(= publisher);凭据名判定不读。
139
+ - **cli**:由车道表派生的「车道 → 必需键」(`none` 行没有必需键)· 车道词闭集(`none` 不再是表外词)· 起本机引擎之前读 `RETIRED_ENVS`(`REQUIRE_EXECUTION_LANE` 在场即拒);凭据名判定无读点(壳零直调这组判官),不动。
140
+ - **client-core**:`ExecutionLane` 联合(穷举处补 `none`)· `EffectiveConfig.a2a`(必填成员;本地读腿多读 `config.d/a2a.json`)· 由 `dist/mcp-request-entry.js` 生成的请求面读器副本:`isUsableWireName` 与保留成员名谓词 `isReservedMemberName` 的函数体住在两只叶模块(`wire-name` / `reserved-member-name`),不再在同模块闭包里 —— 生成器跟随这两只叶模块或注入这两个名字;读数 `reservedMember` 改名 `reservedMembers`;`resolveCenterRefs` 对 `constructor` / `prototype` 答 `refs_unreadable`;凭据名判定无读点(只有一格探针扫本包 d.ts 的导出名,`credentialParamWordOf` 不命中它的『同类键名判官』扫描式),不动。
141
+ - **sdk**:类型面 —— `ExecutionLane` 联合加 `none`、`EffectiveConfig` 加必填 `a2a`;对它们写穷举或自造 `EffectiveConfig` 的地方编译红;凭据名判定不读(合同测里 `findUrlCredential` 的固定样例 `?token=` / `?api_key=` 照旧命中)。
142
+ - 文书:README 升级指引(17.2.x → 18.0.0)· `docs/CONSUMER-INTEGRATION.md` §17(§0.2 里旧的渲染句与保留名句加了指向 §17 的订正)· `llms.txt` / `llms-full.txt`。
143
+
144
+ ### 钉
145
+
146
+ `test/lane-set-judge-18.0.0.test.ts`(判官:每条拒因一格正负控 · 闭集 · 规则句从表派生 · 写闸同调:每条拒因一条 issue、码与此前三处判据逐一相同 · 空洞按下标读、判官与写闸同答 · 重复与兄弟字段的不可续错误并行报)· `test/none-lane-18.0.0.test.ts`(词与表行 · 独占按依据列判 · 写闸 · 墓碑与保留名离表 · 车道文件零字段臂)·
147
+ `test/a2a-domain-18.0.0.test.ts`(域形 · 复用的判官按身份 · 读法:逐条抢救 + 凭据引用整条丢 · 按域表四张 + 写权限直验 · 密钥引用清单)· `test/atomic-salvage-18.0.0.test.ts`(① 17.2.0 包真读数的逐行对拍,含三行带合法兄弟的凭据引用坏形;② 成员恰四只、按身份;走查遇成员不下钻;worker 正负控:坏 `secretEnv` ⇒ 整条丢、坏 `env` 键 ⇒ 只丢那一键;③ 两表同集:成员座位 ⇔ 密钥引用清单;④ 每个成员座位 × 三个原型名 ⇒ 域 schema 拒、抢救丢该条留兄弟,负控只含这些词的名字照收;⑤ 保留成员名一张表:三名各一行三读口同答〔schema · 记录读器 · 类型守卫 · 解析口零查找 · 请求面 lost〕、负控、单源源码钉)·
148
+ 一致性语料 c86(合法两对端,四腿同读)/ c87(凭据引用坏 ⇒ 整个对端丢,非凭据集合照旧逐条丢);既有 99 条 case 重新加冕,去掉 `effective.a2a`(恒 `{"peers":[]}`)与本地腿的内容哈希版本之后逐字等于旧金样,输入与 meta 零改。
149
+ `test/compound-credential-name-18.0.0.test.ts`(六个复合名 + `SECRET_KEY` / `AWS_SECRET_ACCESS_KEY` 各一格:判官拒 + URL 凭据判中〔query 与 fragment〕、只回显表词 · 负控七词各一格 · 整名照旧 23 词 · 切段 / 粘连 / 对齐边界 · 名表每个词作末段的态度逐词写死 · 一事一源〔两条老入口与新导出同答、模块里整名查表只一处〕· 浏览器安全〔无正则后顾断言〕· 线性读)·
150
+ `test/url-credential-14.5.0.test.ts`(原『复合名今天不是凭据名』的 🚧 held 格与整名表里的 `db_password` 负格翻面,其余格零改)。
151
+
152
+ **自 v17.2.0 起运行期代码有改动的公开导出(机器重算;上界 —— 可达 ≠ 一定变,不可达 ⇒ 一定不变;本版新增的导出不入表)**
153
+
154
+ ```text
155
+ DOMAINS [., ./types]
156
+ DOMAIN_ENTRY_SALVAGE [., ./config-fns]
157
+ DOMAIN_READ_FALLBACK [., ./config-fns]
158
+ DOMAIN_SCHEMAS [., ./types]
159
+ DOMAIN_WRITE_ROLE [., ./config-fns]
160
+ EXECUTION_LANES [., ./execution-lanes]
161
+ EXECUTION_LANE_WORDS [., ./execution-lanes]
162
+ FileConfigStore [./node]
163
+ McpConfig [., ./types]
164
+ McpServerSpec [., ./types]
165
+ McpTransport [., ./types]
166
+ NON_PORTABLE_DOMAINS [./conformance]
167
+ ONE_TIME_MIGRATIONS [./one-time-migrations]
168
+ PORTABLE_DOMAINS [./node]
169
+ RESERVED_WORKER_ENV [., ./types]
170
+ RETIRED_ENVS [.]
171
+ RemoteExecSpec [., ./remote-exec]
172
+ TENANT_SEPARATION_BASES [., ./execution-lanes]
173
+ TOOL_WIRE_NAME_MAX_CHARS [.]
174
+ WorkerSpec [., ./types]
175
+ WorkersConfig [., ./types]
176
+ buildEffective [., ./config-fns]
177
+ buildRetiredEnvWire [.]
178
+ collectEnvRefs [., ./secret-refs]
179
+ deriveLocalExpectation [./conformance]
180
+ deriveWireExpectation [./conformance]
181
+ describeBadMcpServerName [.]
182
+ describeBadWireName [.]
183
+ domainFilePath [./node]
184
+ domainWriteRole [., ./config-fns]
185
+ emptyEffective [., ./config-fns]
186
+ exportBundle [./node]
187
+ findUrlCredential [.]
188
+ foreignKeysOf [./conformance]
189
+ isCredentialParamName [.]
190
+ isDomainName [., ./types]
191
+ isStringRecord [.]
192
+ isUsableMcpServerName [.]
193
+ isUsableWireName [.]
194
+ listRequiredEnvNames [./node]
195
+ loadLocalConfig [./node]
196
+ loadRemoteExec [./node]
197
+ migrateConfigDirectory [./node]
198
+ migrateConfigDocuments [./node]
199
+ migrateEffectiveSnapshot [./one-time-migrations]
200
+ migrateEnvModelsDecision [./node]
201
+ migrateStoredDocuments [./one-time-migrations]
202
+ parseDomain [., ./config-fns]
203
+ parseDomainLoud [., ./config-fns]
204
+ parseDomainSalvaged [., ./config-fns]
205
+ planEnvModelTableWrite [.]
206
+ readBundle [./node]
207
+ readConfigDFileReadingSync [./node]
208
+ readEffectiveWire [., ./config-fns]
209
+ readPlainStringRecord [.]
210
+ readRequestMcpTransport [.]
211
+ readWorkersRows [.]
212
+ remoteExecPath [./node]
213
+ resolveCenterRefs [.]
214
+ resolveLegExpectation [./conformance]
215
+ retiredEnvRefusal [.]
216
+ runConformance [./conformance]
217
+ salvageEntries [., ./config-fns]
218
+ urlSeatPatterns [./one-time-migrations]
219
+ validateDomain [./node]
220
+ validateRemoteExec [./node]
221
+ writeBundle [./node]
222
+ writeDomainFile [./node]
223
+ writeRemoteExec [./node]
224
+ ```
225
+
226
+
11
227
  ## 17.2.0 — 2026-11-02 — minor:`./node` 出三只同步读写口(`config.d` 文档读数 · 决定文档读 / 写)· 根桶出「显式停用」谓词 `isExplicitlyDisabledEntry` · settings 单元读不进的处置律 · 关停位值域的实现差登记
12
228
 
13
229
  > 档位(按发版纪律):**minor** —— 新导出(`./node` 三个函数加四个类型,根桶一个函数)是加性的,既有导出的答案逐格不变;零别名、零双读。三只同步口与各自的异步口读 / 写同一份判据:读数、拒句、落盘字节、文件模式逐项相同(对拍钉)。
package/README.md CHANGED
@@ -47,6 +47,50 @@ therefore shows only `zod`. Node built-ins only (`node:crypto`, `node:fs`).
47
47
  > zod 3, nested inside every zod-4 host). The move to zod 4 did not change what any schema accepts or produces —
48
48
  > the conformance corpus reads byte-identically on both — only the wording of validation errors (see CHANGELOG 11.0.0).
49
49
 
50
+ ## 升级指引:18.0.x → 19.0.0(BREAKING:hook 条目承运 `args` / `onFailure`,这两个键的坏值自此是坏块)
51
+
52
+ 一处**不加性**的边(三问与逐条细节见 CHANGELOG 19.0.0):
53
+
54
+ 1. **`hooks` 条目的两个键此前被当作契约外的键剥掉,自此是契约字段**:command 条目的 `args`(exec 形参数表,串数组、元素不含 NUL;`[]` 与空串元素合法)、command / http 条目的 `onFailure`(`HOOK_ON_FAILURE_WORDS` = `continue` | `block`,型 `HookOnFailure`;缺席不补缺省)。别的条目型上写这两个键仍是契约外的键。
55
+ - 合形的值:装上的那一份自此带着它们(此前没有)。读到 `onFailure: "block"` 的一侧要执行它(失败按 exit 2)或在自己的受理面明拒,不能静默忽略。
56
+ - **坏值**(词表外的 `onFailure`、不是串数组或含 NUL 元素的 `args`):**非守卫事件里那一条 hook 被剔;守卫事件(`PreToolUse` / `PermissionRequest`)里整份设置不装,同文件的 `permissions.deny` 一起不生效**。此前这两个键不论值是什么都被剥掉、整份照装。**例外 —— 值里装着守卫事件名记号**(例:`Stop` 事件的条目 `args: { "PreToolUse": "guard" }`):18.0.0 与 19.0.0 **都**整份拒(`guard-entry-invalid`,`field` 点名 `args`),不是「18.0.0 剥掉后装、19.0.0 只剔那一条」;本版没改这一条。zod 面与 `readSettingsUnit("hooks", …)` 对坏值则整个拒 / 整个答 `unreadable`(此前都受理)。
57
+ - 动作:升级前把设置文件与请求体里(含存下来要续跑的)词表外的 `onFailure` 改成 `continue` | `block`、不合形的 `args` 改成串数组,或整个删掉这两个键(删掉后读数逐字同 18.0.0)。不确定就跑一遍 `classifyHooksConfig(settingsDoc)`:结局不是 `loaded`,或拒 / 剔项的 `field` 是 `args` / `onFailure`,就是要改的那一条。
58
+ 2. 对 `CommandHookEntry` / `HttpHookEntry` 的 `keyof` 写穷举表的地方编译红(多两个可选键):补两列。已是坏块的条目若还带着这两个键的坏值,`field` 点名字段表序里第一个坏字段(`args` 排在 `shell` / `async` / `asyncRewake` / `onFailure` 与公共字段之前,`onFailure` 排在公共字段之前)。
59
+
60
+ ## 升级指引:17.2.x → 18.0.0(BREAKING:车道词 `none` · `REQUIRE_EXECUTION_LANE` 进墓碑表 · 新域 `a2a` 成为 `EffectiveConfig` 的必填成员)
61
+
62
+ 三处**不加性**的边,逐条给读点与动作(三问与逐条细节见 CHANGELOG 18.0.0):
63
+
64
+ 1. **词表联合加成员** —— `ExecutionLane` 加 `none`(不给智能体的工具提供执行环境,只能独成一集)、`TenantSeparationBasis` 加 `no-execution-target`、`RemoteExecSpec` 加零字段臂 `{ provider: "none" }`、`DomainName` 尾插 `a2a`。
65
+ 对它们写穷举 `switch` / `Record<…>` 的地方编译红:补 `none` / `a2a` 的分支。公开记录读器的保留成员名改成一张表:旧的单名常量删除,改读 `RESERVED_MEMBER_NAMES` / `isReservedMemberName`;读数 `reservedMember: boolean` 改名 `reservedMembers`(在场的保留名,按自有键序)。车道集合不合法不要自己判 —— 调 `laneSetFlaws`(拒因闭集 `LaneSetFlaw`,规则句 `LANE_SET_RULE`),它与写闸是同一只判官。
66
+ 2. **`EffectiveConfig` 多一个必填成员 `a2a`**(`{ peers: A2aPeerSpec[] }`,缺席 ≡ 空表 = 不拨任何对端)—— 自己构造 `EffectiveConfig` 对象的地方编译红:补 `a2a: { peers: [] }`,或改用 `emptyEffective()` / `buildEffective`。
67
+ 3. **同一输入解析结果改变**:
68
+ - 本地 `config.d/a2a.json` 由「不是域、不读」(`unread-config-file` 告警)变成读进 `effective.a2a`;远端 `/effective.a2a` 由原样透传变契约解析 —— 补缺省(`scenarios: []`、`enabled: true`)、剥未知键(`notes` / `rosters` / `toolAxes` 首版不收)、坏对端逐条丢(凭据引用 `headerRefs` 里坏一项 ⇒ 整个对端丢,不部分抢救)。
69
+ - 本地腿的内容哈希版本对**同一组文件**变一次(哈希里多了 `a2a` 这一格):按版本号「没变就不重放」的消费方在升级后重放一次。
70
+ - `REQUIRE_EXECUTION_LANE` 在墓碑表 `RETIRED_ENVS` 里(`replaced` → `REMOTE_EXEC`;非空即拒,空串按未设):读这张表的引擎起服、壳、渲染器见之拒。worker `env` / `secretEnv` 里写它,拒句由「归 `runtime.execution.lanes`」变成墓碑句本身。
71
+ - 车道集必填那一句与「enabled 的 worker 必须声明车道」那一句的文字随规则句改(机读码与坐标逐格不变);一张表里坏词与重复同在时,重复那一格也报(此前在坏词处中断)。
72
+ - 本地「还缺哪些密钥」面板(`listRequiredEnvNames`)与密钥引用清单(`collectEnvRefs`)多列 `a2a` 对端的头引用。
73
+ - 凭据引用集合不部分抢救(`ATOMIC_SALVAGE`):直接对 `WorkersConfig` 调 `salvageEntries` 时,`secretEnv` 里坏一项的 worker 整条丢(此前只丢那一条引用、worker 带其余引用存活);兄弟 worker 不受影响,各域读数不变。
74
+ - 凭据引用集合(mcp / a2a 的 `headerRefs`、mcp 的 `envRefs`、车道块的 `secretRefs`、worker 的 `secretEnv`)里有叫 `__proto__` / `constructor` / `prototype` 的引用 ⇒ 集合坏、条目整条丢,写口同拒(此前 `__proto__` 被剥掉、只告警 `unknown-keys-dropped`,条目带其余引用存活;`constructor` / `prototype` 作头名受理):改名。记录读器 `readPlainStringRecord`(请求面传输的 `env` / `headers` 同读)与解析口 `resolveCenterRefs` 对这三个名字同答保留(剔出并点名 / `refs_unreadable`)—— 此前它们只认 `__proto__`。
75
+ - 车道表里的重复与同一 `runtime.execution` 里兄弟字段(`coords` / `secretRefs`)的不可续错误一起报(此前兄弟字段坏时重复不报);多租户拒句的出路列表多了 `none`。
76
+ - 凭据参数名判官认复合名:`isCredentialParamName` / `findUrlCredential` 对 `db_password` / `dbPassword` / `x-db-secret` / `user_pwd` / `PGPASSWORD` / `SECRET_KEY` 一类名字的答案由否变是(带这类参数的 URL,受理口由受理变拒);`password_hash` / `secretName` / `passwordless` 一类末段不是强档词的名字照旧不是。名字判定的唯一答者是新导出 `credentialParamWordOf`(返回表词或 `undefined`),自己读名表判名字的消费方改读它。
77
+
78
+ ```ts
79
+ import { LANE_SET_RULE, laneSetFlaws, retiredEnvRefusal } from "@sema-agent/settings-schema";
80
+
81
+ // 读一份 REMOTE_EXEC 车道表:按逗号切段之后整张交给判官(不要自己判非空 / 去重 / 认词 / 独占)
82
+ const flaws = laneSetFlaws(process.env.REMOTE_EXEC?.split(",") ?? []);
83
+ if (flaws.length > 0) throw new Error(`REMOTE_EXEC ${LANE_SET_RULE}`);
84
+
85
+ // 渲染 / 起服之前问墓碑表(整份 env;表里每个旧名,含 REQUIRE_EXECUTION_LANE):在场 ⇒ 拒句(唯一铸点),空串按未设
86
+ const refusal = retiredEnvRefusal(process.env);
87
+ if (refusal !== undefined) throw new Error(refusal);
88
+ ```
89
+
90
+ 🔴 **硬顺序**:web-admin 渲染器先停渲 `REQUIRE_EXECUTION_LANE`,中心起的 worker 才能上 server 7.147.0(否则墓碑令其全部拒启)。`none` 只对已经升级的部署产出 —— 旧引擎、旧壳的车道表里没有这个词。
91
+ 执行域策略 `allowedLanes` 的数据在切换期并列 `"in-process"` 与 `"none"`,所有读它的引擎都答 `none` 之后删掉 `"in-process"`。存下来的数据零迁移(`none` 与 `a2a` 都是新形)。
92
+ 各消费方读哪些键、做什么见 `docs/CONSUMER-INTEGRATION.md` §17。
93
+
50
94
  ## 升级指引:17.1.x → 17.2.0(加性,零动作可升)
51
95
 
52
96
  `./node` 多三只**同步**读写口,根桶多一只谓词;既有导出的答案逐格不变。在同步具名锁里读写配置根的壳(CLI)用得上 —— 以前包里只有异步口,壳只好自读文本(一只多出来的缺席读法:没有悬空符号链接判、空白读成缺席、过深不判)。
@@ -252,7 +296,7 @@ settings 单元读不进的成员**不是缺席**(`loosen` 可丢且要响,`tigh
252
296
  「迁 → 整域终判」一次调用、无 io;与目录形共用同一个内核(读目录之后的那一段语义只此一处),`documents` 的律逐字同。返回同一个闭集的无 io 形(`unreadable`〔覆盖面内某份文档不是 JSON 对象,不抛〕/ `no-documents` /
253
297
  `refused`〔`docs` 仍交回迁移后的那一份〕/ `noop`〔`docs` 是入参的同一引用〕/ `migrated`〔`docs` + `applied` + `changed` + `removed`〕),调用方穷举;入参不被改,重跑 `docs` ⇒ `noop`。
254
298
  一层一次调用:层序 / 覆盖 / 托管锁的合并读法不在这里,也别自己再把 `migrateStoredDocuments` 与 `parseDomain` 按这个顺序组装一遍。
255
- - **URL 内嵌凭据判官**(包根,14.5.0):`findUrlCredential(raw)` 判一个 URL 是否带凭据 —— userinfo,或 query / fragment 里名字整名在凭据名表 `CREDENTIAL_PARAM_NAMES` 上的参数(`URLSearchParams` 解一次码、ASCII 大小写不敏感);
299
+ - **URL 内嵌凭据判官**(包根,14.5.0):`findUrlCredential(raw)` 判一个 URL 是否带凭据 —— userinfo,或 query / fragment 里名字是凭据名的参数(`URLSearchParams` 解一次码、ASCII 大小写不敏感;凭据名 = 整名在凭据名表 `CREDENTIAL_PARAM_NAMES` 上,或 18.0.0 起末段 / 尾串收在强档词上 —— `db_password` · `PGPASSWORD` · `SECRET_KEY`,`password_hash` · `secretName` 不是;名字判定的唯一答者是 `credentialParamWordOf`,`isCredentialParamName` 读它);
256
300
  首个命中 `{ reason: "url_userinfo" }` / `{ reason: "url_credential_param", at, name }`(`URL_CREDENTIAL_REASONS` 闭集两词),值从不进答案,不透明形 ⇒ `undefined`。判官只判有没有:新提交门拒、续跑重放存量体的腿不拒这类载体律是座位的事,拒体的形也是座位的铸点。
257
301
  - **迁什么**(七条,`ONE_TIME_MIGRATIONS` 每行写着改写规则、删法、删后由谁接住):退役 `runtime` 域(治理三闸 → `governance`、五个限额键 → `limits`)·
258
302
  hosts 超界 · 调度店 durable 键(读时改写,下一个写者落盘)· workers 6.x 行 · 模型钥匙双设 · `atModelAllowlist` → `atMention` · URL fragment。
@@ -353,10 +397,11 @@ settings 单元读不进的成员**不是缺席**(`loosen` 可丢且要响,`tigh
353
397
 
354
398
  ## What's in it
355
399
 
356
- - **The zod contract** (`types.ts`): `DOMAIN_SCHEMAS` (16 domains — 0.10.0 adds `projects`, the project
400
+ - **The zod contract** (`types.ts`): `DOMAIN_SCHEMAS` (17 domains — 0.10.0 adds `projects`, the project
357
401
  identity ledger; 0.10.18 adds `prompts` — since 14.0.0 a single axis, the center artifact (`PromptsConfig` / `EffectivePromptsWire` /
358
402
  `promptArtifactFor`); 0.19.0 adds `limits`, the cost/rate-limit publication slot; 11.0.0 retires
359
- `runtime` — its tombstone is `RETIRED_DOMAINS`, see "One-time migrations" below),
403
+ `runtime` — its tombstone is `RETIRED_DOMAINS`, see "One-time migrations" below; 18.0.0 adds `a2a`, the standing outbound
404
+ A2A peer roster (`A2aConfig` / `A2aPeerSpec`, portable)),
360
405
  `EffectiveConfig`, `EffectiveWire`,
361
406
  `ENV_NAME`/`K8S_QUANTITY` boundaries, every domain's entry/config type.
362
407
  - **Pure config fns** (`config-fns.ts`): `buildEffective` (deterministic — `updatedAt` is a required param),
@@ -383,12 +428,13 @@ settings 单元读不进的成员**不是缺席**(`loosen` 可丢且要响,`tigh
383
428
  stays `invalid_value` / `invalid_union`).
384
429
  - **WorkerSpec execution lane + store (7.0.0, M-R2)** (`execution-lanes.ts`, also subpath `./execution-lanes`, + `types.ts`): the lane / store
385
430
  vocabulary has ONE source — the exported data `EXECUTION_LANE_WORDS`, `EXECUTION_LANES` (per lane:
386
- `tenantSeparation` — and, on a `supported` lane only, `tenantSeparationBasis`: `isolation` | `principal-binding`, a
431
+ `tenantSeparation` — and, on a `supported` lane only, `tenantSeparationBasis`: `isolation` | `principal-binding` | `no-execution-target` (18.0.0, the `none` lane), a
387
432
  discriminated union (11.0.0), so a rule reads WHY a lane separates tenants instead of naming lanes — + the env names it reads, in four columns `requiredEnv` / `requiredSecretEnv` / `optionalEnv` /
388
433
  `optionalSecretEnv`, copied from the engine with per-row coordinates), `STORE_BACKENDS`, `SESSION_BACKENDS`,
389
434
  `MEMORY_ENGINE_BACKENDS`. Web-admin's write gate (this package's `WorkerSpec.safeParse`), web-admin's env
390
435
  renderer and the engine's boot checks all read that one table, so they cannot drift. A worker declares
391
- `runtime.execution = { lanes, coords, secretRefs }` (16.0.0: an ordered, de-duplicated, non-empty lane set — the first one is the default;
436
+ `runtime.execution = { lanes, coords, secretRefs }` (16.0.0: an ordered, de-duplicated, non-empty lane set — the first one is the default; 18.0.0: the set
437
+ is judged by one function, `laneSetFlaws` / `LANE_SET_RULE`, and a worker whose agent gets no execution environment declares `lanes: ["none"]`, alone;
392
438
  non-secret coordinates as literals, secrets as host env-NAMEs, each key owned by a declared lane, every declared lane's required ones present
393
439
  and not blank — an empty or whitespace-only value counts as absent; a coordinate with a grammar — `DEVICE_RELAY_URL`, a ws(s) URL or the
394
440
  literal `none` — must also match it) and `runtime.store = { backend, session, memory,
@@ -652,7 +698,8 @@ settings 单元读不进的成员**不是缺席**(`loosen` 可丢且要响,`tigh
652
698
  `HOOK_EVENT_OWNER` (engine | shell), the matcher-field table, a per-event input schema (`HookInput`),
653
699
  the output/decision shapes (`SyncHookOutput` / `HookSpecificOutput` / `HookPermissionRequestDecision`),
654
700
  the config surface (defined in `hooks-config.ts`, re-exported by `./hooks`): `HOOK_ENTRY_TYPES` (CC 2.1.296's five: command / prompt / agent / http /
655
- `mcp_tool`) and the ONE classifier `classifyHooksConfig(settingsDoc)` — which pieces of a settings document's `hooks` drop
701
+ `mcp_tool`; the field table carries `args` — the exec-form argument list — on `command` entries and `onFailure` — `HOOK_ON_FAILURE_WORDS` = `continue` | `block`, type `HookOnFailure` —
702
+ on `command` and `http` entries; carried, not executed: a consumer that reads `block` executes it or refuses it) and the ONE classifier `classifyHooksConfig(settingsDoc)` — which pieces of a settings document's `hooks` drop
656
703
  (`HOOKS_DROPPED_PIECE_CODES`), whether the whole document is rejected because a guard (`PreToolUse` / `PermissionRequest`) may be
657
704
  in a bad piece (`HOOKS_REJECTION_CODES`), and what loads; codes + `ConfigPath` coordinates + the wrong key's name (`field`: for a matcher / entry, the contract
658
705
  field whose value is wrong, or the member that holds a guard sign; absent only when the piece is not an object), no sentences, self-contained (no zod;
@@ -1 +1 @@
1
- 17.2.0
1
+ 19.0.0
@@ -1,4 +1,7 @@
1
1
  {
2
+ "a2a": {
3
+ "peers": []
4
+ },
2
5
  "collab": {
3
6
  "templates": []
4
7
  },
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -107,6 +110,6 @@
107
110
  },
108
111
  "localRoot": {
109
112
  "derive": true,
110
- "localVersion": 654437760217277
113
+ "localVersion": 3322427891363428
111
114
  }
112
115
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -105,6 +108,6 @@
105
108
  },
106
109
  "localRoot": {
107
110
  "derive": true,
108
- "localVersion": 2617555914511015
111
+ "localVersion": 1531100058823047
109
112
  }
110
113
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -158,6 +161,6 @@
158
161
  },
159
162
  "localRoot": {
160
163
  "derive": true,
161
- "localVersion": 3532081824041502
164
+ "localVersion": 3699552373619901
162
165
  }
163
166
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -77,6 +80,6 @@
77
80
  },
78
81
  "localRoot": {
79
82
  "derive": true,
80
- "localVersion": 2762339062543970
83
+ "localVersion": 786856902779210
81
84
  }
82
85
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -72,6 +75,6 @@
72
75
  },
73
76
  "localRoot": {
74
77
  "derive": true,
75
- "localVersion": 2617555914511015
78
+ "localVersion": 1531100058823047
76
79
  }
77
80
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -607,6 +610,6 @@
607
610
  },
608
611
  "localRoot": {
609
612
  "derive": true,
610
- "localVersion": 3739988091963160
613
+ "localVersion": 997343748382977
611
614
  }
612
615
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -611,6 +614,6 @@
611
614
  },
612
615
  "localRoot": {
613
616
  "derive": true,
614
- "localVersion": 3995968292520333
617
+ "localVersion": 2261472140231940
615
618
  }
616
619
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -106,6 +109,6 @@
106
109
  },
107
110
  "localRoot": {
108
111
  "derive": true,
109
- "localVersion": 326836076429158
112
+ "localVersion": 996325746342161
110
113
  }
111
114
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -113,6 +116,6 @@
113
116
  },
114
117
  "localRoot": {
115
118
  "derive": true,
116
- "localVersion": 868799467991923
119
+ "localVersion": 3279031953139419
117
120
  }
118
121
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -72,6 +75,6 @@
72
75
  },
73
76
  "localRoot": {
74
77
  "derive": true,
75
- "localVersion": 2617555914511015
78
+ "localVersion": 1531100058823047
76
79
  }
77
80
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -77,6 +80,6 @@
77
80
  },
78
81
  "localRoot": {
79
82
  "derive": true,
80
- "localVersion": 3839291696409255
83
+ "localVersion": 2724669190611439
81
84
  }
82
85
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -86,6 +89,6 @@
86
89
  },
87
90
  "localRoot": {
88
91
  "derive": true,
89
- "localVersion": 2166713625838105
92
+ "localVersion": 3197714719227195
90
93
  }
91
94
  }
@@ -2,6 +2,9 @@
2
2
  "domains": {
3
3
  "outcome": "effective",
4
4
  "effective": {
5
+ "a2a": {
6
+ "peers": []
7
+ },
5
8
  "collab": {
6
9
  "templates": []
7
10
  },
@@ -77,6 +80,6 @@
77
80
  },
78
81
  "localRoot": {
79
82
  "derive": true,
80
- "localVersion": 2168990579017716
83
+ "localVersion": 1929276434918027
81
84
  }
82
85
  }