@sema-agent/settings-schema 7.0.0 → 8.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 (106) hide show
  1. package/CHANGELOG.md +173 -1
  2. package/README.md +47 -5
  3. package/conformance/VERSION +1 -1
  4. package/conformance/cases/c01-entry-salvage-then-typo/expected.json +5 -0
  5. package/conformance/cases/c02-hosts-clamp-stacked/expected.json +5 -0
  6. package/conformance/cases/c03-literal-dotted-top-key/expected.json +41 -0
  7. package/conformance/cases/c04-all-bad-collection-not-salvaged/expected.json +5 -0
  8. package/conformance/cases/c05-gate-domain-bad-entry-throws/expected.json +5 -0
  9. package/conformance/cases/c06-legacy-governance-lift/expected.json +12 -0
  10. package/conformance/cases/c07-hooks-is-not-a-config-domain/expected.json +5 -0
  11. package/conformance/cases/c08-limits-unknown-carried-64/expected.json +77 -0
  12. package/conformance/cases/c09-limits-unknown-carried-65/expected.json +78 -0
  13. package/conformance/cases/c10-record-key-secret-redacted-twice/expected.json +5 -0
  14. package/conformance/cases/c11-unicode-unknown-keys/expected.json +14 -0
  15. package/conformance/cases/c12-prototype-name-top-keys/expected.json +5 -0
  16. package/conformance/cases/c13-models-field-null/expected.json +5 -0
  17. package/conformance/cases/c14-models-field-empty-array/expected.json +16 -0
  18. package/conformance/cases/c15-models-field-number/expected.json +5 -0
  19. package/conformance/cases/c16-deep-nesting-205/expected.json +14 -0
  20. package/conformance/cases/c17-empty-domain-file/expected.json +10 -0
  21. package/conformance/cases/c18-wire-envelope-not-an-object/expected.json +10 -0
  22. package/conformance/cases/c19-wire-envelope-no-version/expected.json +10 -0
  23. package/conformance/cases/c20-governance-absent-lifts/expected.json +12 -0
  24. package/conformance/cases/c21-governance-empty-object-wins/expected.json +13 -0
  25. package/conformance/cases/c22-governance-null-throws/expected.json +5 -0
  26. package/conformance/cases/c23-mixed-validity-models/expected.json +5 -0
  27. package/conformance/cases/c24-valid-entries-with-unknown-keys/expected.json +29 -0
  28. package/conformance/cases/c25-published-roundtrip-zero-warnings/expected.json +33 -0
  29. package/conformance/cases/c26-hosts-array-1024/expected.json +7183 -0
  30. package/conformance/cases/c27-hosts-array-1025/expected.json +5 -0
  31. package/conformance/cases/c28-large-document-over-1mb/expected.json +14 -0
  32. package/conformance/cases/c29-salvage-then-domain-refine-fails/expected.json +5 -0
  33. package/conformance/cases/c30-version-triple-a-first/expected.json +29 -0
  34. package/conformance/cases/c31-version-triple-b-changed/expected.json +29 -0
  35. package/conformance/cases/c32-version-triple-a-restored/expected.json +29 -0
  36. package/conformance/cases/c33-limits-nested-carried-key/expected.json +17 -0
  37. package/conformance/cases/c34-skills-content-vs-manifest/expected.json +23 -0
  38. package/conformance/cases/c35-portable-domain-file-is-null/expected.json +5 -0
  39. package/conformance/cases/c36-skills-entry-without-content/expected.json +23 -0
  40. package/conformance/cases/c37-skills-field-null/expected.json +5 -0
  41. package/conformance/cases/c38-remote-exec-is-a-non-domain-file/expected.json +5 -0
  42. package/conformance/cases/c39-hidden-file-in-config-d/expected.json +5 -0
  43. package/conformance/cases/c40-s712-identity-only-what-reads-out/expected.json +5 -0
  44. package/conformance/cases/c41-s792-encoded-pem-identity/expected.json +5 -0
  45. package/conformance/cases/c42-s792-unknown-key-secret-redacted/expected.json +33 -0
  46. package/conformance/cases/c43-s792-form-and-deep-encoded-pem/expected.json +5 -0
  47. package/conformance/cases/c44-s792-utf8-escape-glued-token/expected.json +5 -0
  48. package/conformance/cases/c45-s792-identity-bounds-and-decode-depth/expected.json +5 -0
  49. package/conformance/cases/c46-s811-host-name-url-userinfo-characterization/expected.json +5 -0
  50. package/conformance/cases/c47-s811-roles-key-url-userinfo-characterization/expected.json +5 -0
  51. package/conformance/cases/c48-s935-model-headers-transported/expected.json +59 -0
  52. package/conformance/cases/c49-s935-model-headers-secret-entry-dropped/expected.json +5 -0
  53. package/conformance/cases/c50-s784-lane-host-legal/expected.json +44 -0
  54. package/conformance/cases/c51-s784-lane-e2b-legal/expected.json +46 -0
  55. package/conformance/cases/c52-s784-lane-k8s-legal/expected.json +48 -0
  56. package/conformance/cases/c53-s784-lane-ssh-legal/expected.json +48 -0
  57. package/conformance/cases/c54-s784-lane-adb-legal/expected.json +44 -0
  58. package/conformance/cases/c55-s784-lane-local-docker-legal/expected.json +45 -0
  59. package/conformance/cases/c56-s784-lane-device-legal/expected.json +51 -0
  60. package/conformance/cases/c57-s784-g1-enabled-no-lane/expected.json +5 -0
  61. package/conformance/cases/c58-s784-g2-multitenant-host/expected.json +5 -0
  62. package/conformance/cases/c59-s784-g3-k8s-missing-image/expected.json +5 -0
  63. package/conformance/cases/c60-s784-g3-e2b-missing-key/expected.json +5 -0
  64. package/conformance/cases/c61-s784-g3-other-lane-key/expected.json +5 -0
  65. package/conformance/cases/c62-s784-g7a-session-tidb/expected.json +5 -0
  66. package/conformance/cases/c63-s784-host-two-replicas/expected.json +5 -0
  67. package/conformance/cases/c64-s784-multitenant-local-store/expected.json +5 -0
  68. package/conformance/cases/c65-s784-pg-without-db/expected.json +5 -0
  69. package/conformance/cases/c66-s784-memory-backend-mismatch/expected.json +5 -0
  70. package/conformance/cases/c67-s784-retired-field-loud/expected.json +5 -0
  71. package/conformance/cases/c67-s784-retired-field-loud/meta.json +1 -1
  72. package/conformance/cases/c68-s784-device-local-store/expected.json +5 -0
  73. package/conformance/cases/cc01-mcp-toolfaces-non-object/expected.json +54 -0
  74. package/conformance/cases/cc02-mcp-source-key-is-transported/expected.json +27 -0
  75. package/conformance/cases/cc03-model-compat-unknown-subkey/expected.json +33 -0
  76. package/conformance/cases/cli01-model-name-nfc-vs-nfd/expected.json +5 -0
  77. package/conformance/cases/cli02-control-and-zero-width-chars/expected.json +5 -0
  78. package/conformance/cases/cli03-credential-pasted-into-unknown-key/expected.json +22 -0
  79. package/conformance/cases/cli04-env-value-with-newline/expected.json +46 -0
  80. package/conformance/cases/cli05-long-and-prefix-colliding-names/expected.json +53 -0
  81. package/conformance/cases/t01-absent-domain-key-not-null/expected.json +5 -0
  82. package/conformance/cases/t02-entry-salvage-vs-whole-domain-refusal/expected.json +5 -0
  83. package/conformance/cases/t03-prototype-name-key-not-swallowed/expected.json +29 -0
  84. package/conformance/cases/t04-secret-literal-never-in-warning-value/expected.json +5 -0
  85. package/conformance/cases/z01-every-domain-empty-object/expected.json +64 -0
  86. package/conformance/cases/z02-every-domain-unknown-key/expected.json +66 -0
  87. package/dist/cli.js +97 -25
  88. package/dist/config-fns.js +7 -1
  89. package/dist/conformance/contract-adapter.d.ts +4 -2
  90. package/dist/conformance/contract-adapter.js +21 -7
  91. package/dist/conformance/corpus.js +12 -7
  92. package/dist/conformance/derive.d.ts +26 -0
  93. package/dist/conformance/derive.js +25 -2
  94. package/dist/conformance/index.d.ts +4 -3
  95. package/dist/conformance/index.js +4 -3
  96. package/dist/conformance/run.d.ts +3 -3
  97. package/dist/conformance/run.js +87 -17
  98. package/dist/conformance/types.d.ts +57 -17
  99. package/dist/conformance/types.js +4 -2
  100. package/dist/execution-lane-index.d.ts +20 -1
  101. package/dist/execution-lane-index.js +24 -1
  102. package/dist/hooks.d.ts +4 -4
  103. package/dist/migrate-workers.d.ts +1 -1
  104. package/dist/migrate-workers.js +3 -7
  105. package/dist/types.js +13 -4
  106. package/package.json +2 -1
@@ -96,6 +96,54 @@
96
96
  "updatedAt": "2026-10-03T00:00:00.000Z"
97
97
  }
98
98
  },
99
+ "strictWrite": {
100
+ "outcome": "effective",
101
+ "effective": {
102
+ "workers": {
103
+ "workers": [
104
+ {
105
+ "coords": {},
106
+ "enabled": true,
107
+ "host": "default",
108
+ "image": "sema-server:latest",
109
+ "name": "w-ssh",
110
+ "runtime": {
111
+ "execution": {
112
+ "coords": {
113
+ "SSH_HOST": "deploy.internal",
114
+ "SSH_PORT": "2222",
115
+ "SSH_USER": "deploy"
116
+ },
117
+ "lane": "ssh",
118
+ "secretRefs": {
119
+ "SSH_PRIVATE_KEY": "HOST_SSH_KEY"
120
+ }
121
+ },
122
+ "rateLimitRpm": 0,
123
+ "requirePrincipal": false,
124
+ "store": {
125
+ "backend": "local",
126
+ "memory": {
127
+ "backend": "file",
128
+ "engine": "on"
129
+ },
130
+ "session": "auto"
131
+ }
132
+ },
133
+ "secretRefs": {
134
+ "apiKeyEnv": "MODEL_KEY"
135
+ }
136
+ }
137
+ ]
138
+ }
139
+ },
140
+ "warnings": [],
141
+ "metadata": {
142
+ "version": 7,
143
+ "updatedAt": "2026-10-03T00:00:00.000Z"
144
+ },
145
+ "why": "受理:合法的 ssh 车道 worker;严写受理,受理形等于读腿 workers 那一格。"
146
+ },
99
147
  "wire": {
100
148
  "derive": true
101
149
  },
@@ -92,6 +92,50 @@
92
92
  "updatedAt": "2026-10-03T00:00:00.000Z"
93
93
  }
94
94
  },
95
+ "strictWrite": {
96
+ "outcome": "effective",
97
+ "effective": {
98
+ "workers": {
99
+ "workers": [
100
+ {
101
+ "coords": {},
102
+ "enabled": true,
103
+ "host": "default",
104
+ "image": "sema-server:latest",
105
+ "name": "w-adb",
106
+ "runtime": {
107
+ "execution": {
108
+ "coords": {
109
+ "ADB_SERIAL": "emulator-5554"
110
+ },
111
+ "lane": "adb",
112
+ "secretRefs": {}
113
+ },
114
+ "rateLimitRpm": 0,
115
+ "requirePrincipal": false,
116
+ "store": {
117
+ "backend": "local",
118
+ "memory": {
119
+ "backend": "file",
120
+ "engine": "on"
121
+ },
122
+ "session": "auto"
123
+ }
124
+ },
125
+ "secretRefs": {
126
+ "apiKeyEnv": "MODEL_KEY"
127
+ }
128
+ }
129
+ ]
130
+ }
131
+ },
132
+ "warnings": [],
133
+ "metadata": {
134
+ "version": 7,
135
+ "updatedAt": "2026-10-03T00:00:00.000Z"
136
+ },
137
+ "why": "受理:合法的 adb 车道 worker;严写受理,受理形等于读腿 workers 那一格。"
138
+ },
95
139
  "wire": {
96
140
  "derive": true
97
141
  },
@@ -93,6 +93,51 @@
93
93
  "updatedAt": "2026-10-03T00:00:00.000Z"
94
94
  }
95
95
  },
96
+ "strictWrite": {
97
+ "outcome": "effective",
98
+ "effective": {
99
+ "workers": {
100
+ "workers": [
101
+ {
102
+ "coords": {},
103
+ "enabled": true,
104
+ "host": "default",
105
+ "image": "sema-server:latest",
106
+ "name": "w-local-docker",
107
+ "runtime": {
108
+ "execution": {
109
+ "coords": {
110
+ "DOCKER_HOST": "tcp://docker.internal:2376",
111
+ "DOCKER_IMAGE": "registry.internal/sandbox:1"
112
+ },
113
+ "lane": "local-docker",
114
+ "secretRefs": {}
115
+ },
116
+ "rateLimitRpm": 0,
117
+ "requirePrincipal": false,
118
+ "store": {
119
+ "backend": "local",
120
+ "memory": {
121
+ "backend": "file",
122
+ "engine": "on"
123
+ },
124
+ "session": "auto"
125
+ }
126
+ },
127
+ "secretRefs": {
128
+ "apiKeyEnv": "MODEL_KEY"
129
+ }
130
+ }
131
+ ]
132
+ }
133
+ },
134
+ "warnings": [],
135
+ "metadata": {
136
+ "version": 7,
137
+ "updatedAt": "2026-10-03T00:00:00.000Z"
138
+ },
139
+ "why": "受理:合法的 local-docker 车道 worker;严写受理,受理形等于读腿 workers 那一格。"
140
+ },
96
141
  "wire": {
97
142
  "derive": true
98
143
  },
@@ -99,6 +99,57 @@
99
99
  "updatedAt": "2026-10-03T00:00:00.000Z"
100
100
  }
101
101
  },
102
+ "strictWrite": {
103
+ "outcome": "effective",
104
+ "effective": {
105
+ "workers": {
106
+ "workers": [
107
+ {
108
+ "coords": {},
109
+ "enabled": true,
110
+ "host": "default",
111
+ "image": "sema-server:latest",
112
+ "name": "w-device",
113
+ "runtime": {
114
+ "execution": {
115
+ "coords": {
116
+ "DEVICE_SUPERSEDE": "deny"
117
+ },
118
+ "lane": "device",
119
+ "secretRefs": {}
120
+ },
121
+ "rateLimitRpm": 0,
122
+ "requirePrincipal": false,
123
+ "store": {
124
+ "backend": "pg",
125
+ "db": {
126
+ "database": "sema",
127
+ "host": "pg.internal",
128
+ "port": 5432,
129
+ "user": "svc"
130
+ },
131
+ "memory": {
132
+ "backend": "file",
133
+ "engine": "on"
134
+ },
135
+ "session": "auto"
136
+ }
137
+ },
138
+ "secretRefs": {
139
+ "apiKeyEnv": "MODEL_KEY",
140
+ "dbPasswordEnv": "HOST_DB_PW"
141
+ }
142
+ }
143
+ ]
144
+ }
145
+ },
146
+ "warnings": [],
147
+ "metadata": {
148
+ "version": 7,
149
+ "updatedAt": "2026-10-03T00:00:00.000Z"
150
+ },
151
+ "why": "受理:合法的 device 车道 worker(配 SQL 店);严写受理,受理形等于读腿 workers 那一格。"
152
+ },
102
153
  "wire": {
103
154
  "derive": true
104
155
  },
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:enabled 的 worker 没声明执行车道,workers 是 gate 域,读腿本就整域拒;严写同一份文档同样过不了写闸。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:多租户 worker 落在不分租户的 host 车道,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:k8s 车道缺必需坐标 K8S_SANDBOX_IMAGE,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:e2b 车道缺必需密钥引用 E2B_API_KEY,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:k8s 车道上写了属于 e2b 车道的坐标,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:store.session 写了不在闭集里的词,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:host 车道两副本,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:多租户 worker 配非 SQL 店,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:pg 店缺 store.db 坐标,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:记忆后端与店不匹配,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:写了 7.0.0 删除的旧字段 runtime.sessionBackend(读到即拒、拒因指路迁移),读腿整域拒;严写同样拒 —— 写入席同样不静默剥掉它。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "contributor": "contract",
3
- "claim": "7.0.0 删除项读到即**响亮拒**(runtime.sessionBackend,哪怕是停用的 worker),拒因指路 migrateWorkersDomain / settings-schema migrate-workers —— 不被 zod 静默剥成「什么都没声明」。",
3
+ "claim": "7.0.0 删除项读到即**响亮拒**(runtime.sessionBackend,哪怕是停用的 worker),拒因指路 migrateWorkersDomain / npx @sema-agent/settings-schema migrate-workers —— 不被 zod 静默剥成「什么都没声明」。",
4
4
  "firstRedOn": []
5
5
  }
@@ -4,6 +4,11 @@
4
4
  "stage": "validate",
5
5
  "why": "7.0.0 写闸(WorkerSpec)拒 —— workers 是 gate 域,一只坏 worker 整域拒,不逐条容错"
6
6
  },
7
+ "strictWrite": {
8
+ "outcome": "rejected",
9
+ "stage": "validate",
10
+ "why": "拒:device 车道配非 SQL 店,读腿整域拒;严写同样拒。"
11
+ },
7
12
  "wire": {
8
13
  "outcome": "rejected",
9
14
  "stage": "validate",
@@ -102,6 +102,60 @@
102
102
  "updatedAt": "2026-09-16T00:00:00.000Z"
103
103
  }
104
104
  },
105
+ "strictWrite": {
106
+ "outcome": "effective",
107
+ "effective": {
108
+ "mcp": {
109
+ "servers": [
110
+ {
111
+ "elicitation": false,
112
+ "enabled": true,
113
+ "name": "s-null",
114
+ "rosters": [],
115
+ "scenarios": [],
116
+ "toolFaces": null,
117
+ "transport": {
118
+ "kind": "http",
119
+ "url": "https://a.example"
120
+ }
121
+ },
122
+ {
123
+ "elicitation": false,
124
+ "enabled": true,
125
+ "name": "s-array",
126
+ "rosters": [],
127
+ "scenarios": [],
128
+ "toolFaces": [
129
+ 1,
130
+ 2
131
+ ],
132
+ "transport": {
133
+ "kind": "http",
134
+ "url": "https://b.example"
135
+ }
136
+ },
137
+ {
138
+ "elicitation": false,
139
+ "enabled": true,
140
+ "name": "s-string",
141
+ "rosters": [],
142
+ "scenarios": [],
143
+ "toolFaces": "not-an-object",
144
+ "transport": {
145
+ "kind": "http",
146
+ "url": "https://c.example"
147
+ }
148
+ }
149
+ ]
150
+ }
151
+ },
152
+ "warnings": [],
153
+ "metadata": {
154
+ "version": 7,
155
+ "updatedAt": "2026-09-16T00:00:00.000Z"
156
+ },
157
+ "why": "受理:mcp[].toolFaces 是解析透明键,数组 / null / 串三形读腿都逐字透传;严写同样逐字收下,受理形等于读腿 mcp 那一格。"
158
+ },
105
159
  "wire": {
106
160
  "derive": true
107
161
  },
@@ -75,6 +75,33 @@
75
75
  "updatedAt": "2026-09-16T00:00:00.000Z"
76
76
  }
77
77
  },
78
+ "strictWrite": {
79
+ "outcome": "effective",
80
+ "effective": {
81
+ "mcp": {
82
+ "servers": [
83
+ {
84
+ "elicitation": false,
85
+ "enabled": true,
86
+ "name": "s1",
87
+ "rosters": [],
88
+ "scenarios": [],
89
+ "source": "plugin",
90
+ "transport": {
91
+ "kind": "http",
92
+ "url": "https://x.example"
93
+ }
94
+ }
95
+ ]
96
+ }
97
+ },
98
+ "warnings": [],
99
+ "metadata": {
100
+ "version": 7,
101
+ "updatedAt": "2026-09-16T00:00:00.000Z"
102
+ },
103
+ "why": "受理:mcp[].source 是解析透明键,读腿逐字透传;严写同样逐字收下,受理形等于读腿 mcp 那一格。"
104
+ },
78
105
  "wire": {
79
106
  "derive": true
80
107
  },
@@ -79,6 +79,39 @@
79
79
  "updatedAt": "2026-09-16T00:00:00.000Z"
80
80
  }
81
81
  },
82
+ "strictWrite": {
83
+ "outcome": "effective",
84
+ "effective": {
85
+ "models": {
86
+ "models": [
87
+ {
88
+ "api": "openai-completions",
89
+ "apiKeyEnv": "OPENAI_API_KEY",
90
+ "compat": {
91
+ "thinkingFormat": "anthropic",
92
+ "zzz": 1
93
+ },
94
+ "enabled": true,
95
+ "id": "m0-id",
96
+ "name": "m0",
97
+ "provider": "openai",
98
+ "quotaWeight": 1,
99
+ "reasoning": false,
100
+ "tier": "standard",
101
+ "vision": false
102
+ }
103
+ ],
104
+ "roles": {},
105
+ "tierGroups": []
106
+ }
107
+ },
108
+ "warnings": [],
109
+ "metadata": {
110
+ "version": 7,
111
+ "updatedAt": "2026-09-16T00:00:00.000Z"
112
+ },
113
+ "why": "受理:models[].compat 的未知子键同形保留(自由形 + 安全判据);严写同样保留,受理形等于读腿 models 那一格。"
114
+ },
82
115
  "wire": {
83
116
  "derive": true
84
117
  },
@@ -92,6 +92,11 @@
92
92
  "updatedAt": "2026-09-16T00:00:00.000Z"
93
93
  }
94
94
  },
95
+ "strictWrite": {
96
+ "outcome": "rejected",
97
+ "stage": "validate",
98
+ "why": "拒:两条模型名带组合字符(不在名字字符集里),读腿逐条丢(entry-dropped);严写 ⇒ 整次不受理。"
99
+ },
95
100
  "wire": {
96
101
  "derive": true
97
102
  },
@@ -105,6 +105,11 @@
105
105
  "updatedAt": "2026-09-16T00:00:00.000Z"
106
106
  }
107
107
  },
108
+ "strictWrite": {
109
+ "outcome": "rejected",
110
+ "stage": "validate",
111
+ "why": "拒:models 里两条名字带控制 / 零宽字符,读腿逐条丢(entry-dropped);mcp 那一份干净,但严写在任何一份不受理时整次不受理。"
112
+ },
108
113
  "wire": {
109
114
  "derive": true
110
115
  },
@@ -82,6 +82,28 @@
82
82
  "updatedAt": "2026-09-16T00:00:00.000Z"
83
83
  }
84
84
  },
85
+ "strictWrite": {
86
+ "outcome": "effective",
87
+ "effective": {
88
+ "hosts": {
89
+ "hosts": [
90
+ {
91
+ "approved": false,
92
+ "drain": false,
93
+ "enabled": true,
94
+ "labels": [],
95
+ "name": "h1"
96
+ }
97
+ ]
98
+ }
99
+ },
100
+ "warnings": [],
101
+ "metadata": {
102
+ "version": 7,
103
+ "updatedAt": "2026-09-16T00:00:00.000Z"
104
+ },
105
+ "why": "受理:粘进 hosts 条目的 `url`(带凭据)是未知键,被 schema 剥掉(读腿只报键路径);严写同样剥 —— 凭据既不进受理形、也不进告警(告警面为空)。"
106
+ },
85
107
  "wire": {
86
108
  "derive": true
87
109
  },
@@ -94,6 +94,52 @@
94
94
  "updatedAt": "2026-09-16T00:00:00.000Z"
95
95
  }
96
96
  },
97
+ "strictWrite": {
98
+ "outcome": "effective",
99
+ "effective": {
100
+ "workers": {
101
+ "workers": [
102
+ {
103
+ "coords": {},
104
+ "enabled": true,
105
+ "env": {
106
+ "BAR": "c\rd",
107
+ "FOO": "a\nb"
108
+ },
109
+ "host": "default",
110
+ "image": "sema-server:latest",
111
+ "name": "w1",
112
+ "runtime": {
113
+ "execution": {
114
+ "coords": {},
115
+ "lane": "host",
116
+ "secretRefs": {}
117
+ },
118
+ "rateLimitRpm": 0,
119
+ "requirePrincipal": false,
120
+ "store": {
121
+ "backend": "local",
122
+ "memory": {
123
+ "backend": "file",
124
+ "engine": "on"
125
+ },
126
+ "session": "auto"
127
+ }
128
+ },
129
+ "secretRefs": {
130
+ "apiKeyEnv": "OPENAI_API_KEY"
131
+ }
132
+ }
133
+ ]
134
+ }
135
+ },
136
+ "warnings": [],
137
+ "metadata": {
138
+ "version": 7,
139
+ "updatedAt": "2026-09-16T00:00:00.000Z"
140
+ },
141
+ "why": "受理:worker 的 env 值里有换行 / 回车,读腿原样承运;严写同样原样收下,受理形等于读腿 workers 那一格。"
142
+ },
97
143
  "wire": {
98
144
  "derive": true
99
145
  },