@sema-agent/settings-schema 2.1.0 → 3.0.1

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 (203) hide show
  1. package/CHANGELOG.md +253 -1
  2. package/README.md +45 -10
  3. package/conformance/VERSION +1 -0
  4. package/conformance/baseline.json +55 -0
  5. package/conformance/cases/c01-entry-salvage-then-typo/expected.json +105 -0
  6. package/conformance/cases/c01-entry-salvage-then-typo/input.json +22 -0
  7. package/conformance/cases/c01-entry-salvage-then-typo/meta.json +10 -0
  8. package/conformance/cases/c02-hosts-clamp-stacked/expected.json +96 -0
  9. package/conformance/cases/c02-hosts-clamp-stacked/input.json +21 -0
  10. package/conformance/cases/c02-hosts-clamp-stacked/meta.json +10 -0
  11. package/conformance/cases/c03-literal-dotted-top-key/expected.json +112 -0
  12. package/conformance/cases/c03-literal-dotted-top-key/input.json +26 -0
  13. package/conformance/cases/c03-literal-dotted-top-key/meta.json +5 -0
  14. package/conformance/cases/c04-all-bad-collection-not-salvaged/expected.json +77 -0
  15. package/conformance/cases/c04-all-bad-collection-not-salvaged/input.json +18 -0
  16. package/conformance/cases/c04-all-bad-collection-not-salvaged/meta.json +5 -0
  17. package/conformance/cases/c05-gate-domain-bad-entry-throws/expected.json +16 -0
  18. package/conformance/cases/c05-gate-domain-bad-entry-throws/input.json +18 -0
  19. package/conformance/cases/c05-gate-domain-bad-entry-throws/meta.json +5 -0
  20. package/conformance/cases/c06-legacy-governance-lift/expected.json +99 -0
  21. package/conformance/cases/c06-legacy-governance-lift/input.json +20 -0
  22. package/conformance/cases/c06-legacy-governance-lift/meta.json +9 -0
  23. package/conformance/cases/c07-hooks-is-not-a-config-domain/expected.json +72 -0
  24. package/conformance/cases/c07-hooks-is-not-a-config-domain/input.json +43 -0
  25. package/conformance/cases/c07-hooks-is-not-a-config-domain/meta.json +6 -0
  26. package/conformance/cases/c08-limits-unknown-carried-64/expected.json +336 -0
  27. package/conformance/cases/c08-limits-unknown-carried-64/input.json +74 -0
  28. package/conformance/cases/c08-limits-unknown-carried-64/meta.json +5 -0
  29. package/conformance/cases/c09-limits-unknown-carried-65/expected.json +338 -0
  30. package/conformance/cases/c09-limits-unknown-carried-65/input.json +75 -0
  31. package/conformance/cases/c09-limits-unknown-carried-65/meta.json +7 -0
  32. package/conformance/cases/c10-record-key-secret-redacted-twice/expected.json +106 -0
  33. package/conformance/cases/c10-record-key-secret-redacted-twice/input.json +29 -0
  34. package/conformance/cases/c10-record-key-secret-redacted-twice/meta.json +13 -0
  35. package/conformance/cases/c11-unicode-unknown-keys/expected.json +88 -0
  36. package/conformance/cases/c11-unicode-unknown-keys/input.json +13 -0
  37. package/conformance/cases/c11-unicode-unknown-keys/meta.json +5 -0
  38. package/conformance/cases/c12-prototype-name-top-keys/expected.json +72 -0
  39. package/conformance/cases/c12-prototype-name-top-keys/input.json +20 -0
  40. package/conformance/cases/c12-prototype-name-top-keys/meta.json +11 -0
  41. package/conformance/cases/c13-models-field-null/expected.json +77 -0
  42. package/conformance/cases/c13-models-field-null/input.json +11 -0
  43. package/conformance/cases/c13-models-field-null/meta.json +5 -0
  44. package/conformance/cases/c14-models-field-empty-array/expected.json +72 -0
  45. package/conformance/cases/c14-models-field-empty-array/input.json +11 -0
  46. package/conformance/cases/c14-models-field-empty-array/meta.json +5 -0
  47. package/conformance/cases/c15-models-field-number/expected.json +77 -0
  48. package/conformance/cases/c15-models-field-number/input.json +11 -0
  49. package/conformance/cases/c15-models-field-number/meta.json +5 -0
  50. package/conformance/cases/c16-deep-nesting-205/expected.json +83 -0
  51. package/conformance/cases/c16-deep-nesting-205/input.json +421 -0
  52. package/conformance/cases/c16-deep-nesting-205/meta.json +5 -0
  53. package/conformance/cases/c17-empty-domain-file/expected.json +73 -0
  54. package/conformance/cases/c17-empty-domain-file/input.json +10 -0
  55. package/conformance/cases/c17-empty-domain-file/meta.json +5 -0
  56. package/conformance/cases/c18-wire-envelope-not-an-object/expected.json +74 -0
  57. package/conformance/cases/c18-wire-envelope-not-an-object/input.json +8 -0
  58. package/conformance/cases/c18-wire-envelope-not-an-object/meta.json +5 -0
  59. package/conformance/cases/c19-wire-envelope-no-version/expected.json +74 -0
  60. package/conformance/cases/c19-wire-envelope-no-version/input.json +13 -0
  61. package/conformance/cases/c19-wire-envelope-no-version/meta.json +5 -0
  62. package/conformance/cases/c20-governance-absent-lifts/expected.json +84 -0
  63. package/conformance/cases/c20-governance-absent-lifts/input.json +11 -0
  64. package/conformance/cases/c20-governance-absent-lifts/meta.json +9 -0
  65. package/conformance/cases/c21-governance-empty-object-wins/expected.json +72 -0
  66. package/conformance/cases/c21-governance-empty-object-wins/input.json +12 -0
  67. package/conformance/cases/c21-governance-empty-object-wins/meta.json +5 -0
  68. package/conformance/cases/c22-governance-null-throws/expected.json +16 -0
  69. package/conformance/cases/c22-governance-null-throws/input.json +9 -0
  70. package/conformance/cases/c22-governance-null-throws/meta.json +5 -0
  71. package/conformance/cases/c23-mixed-validity-models/expected.json +106 -0
  72. package/conformance/cases/c23-mixed-validity-models/input.json +27 -0
  73. package/conformance/cases/c23-mixed-validity-models/meta.json +9 -0
  74. package/conformance/cases/c24-valid-entries-with-unknown-keys/expected.json +100 -0
  75. package/conformance/cases/c24-valid-entries-with-unknown-keys/input.json +25 -0
  76. package/conformance/cases/c24-valid-entries-with-unknown-keys/meta.json +5 -0
  77. package/conformance/cases/c25-published-roundtrip-zero-warnings/expected.json +89 -0
  78. package/conformance/cases/c25-published-roundtrip-zero-warnings/input.json +24 -0
  79. package/conformance/cases/c25-published-roundtrip-zero-warnings/meta.json +5 -0
  80. package/conformance/cases/c26-hosts-array-1024/expected.json +7241 -0
  81. package/conformance/cases/c26-hosts-array-1024/input.json +3084 -0
  82. package/conformance/cases/c26-hosts-array-1024/meta.json +5 -0
  83. package/conformance/cases/c27-hosts-array-1025/expected.json +7248 -0
  84. package/conformance/cases/c27-hosts-array-1025/input.json +3087 -0
  85. package/conformance/cases/c27-hosts-array-1025/meta.json +5 -0
  86. package/conformance/cases/c28-large-document-over-1mb/expected.json +82 -0
  87. package/conformance/cases/c28-large-document-over-1mb/input.json +11 -0
  88. package/conformance/cases/c28-large-document-over-1mb/meta.json +5 -0
  89. package/conformance/cases/c29-salvage-then-domain-refine-fails/expected.json +77 -0
  90. package/conformance/cases/c29-salvage-then-domain-refine-fails/input.json +27 -0
  91. package/conformance/cases/c29-salvage-then-domain-refine-fails/meta.json +5 -0
  92. package/conformance/cases/c30-version-triple-a-first/expected.json +85 -0
  93. package/conformance/cases/c30-version-triple-a-first/input.json +18 -0
  94. package/conformance/cases/c30-version-triple-a-first/meta.json +5 -0
  95. package/conformance/cases/c31-version-triple-b-changed/expected.json +85 -0
  96. package/conformance/cases/c31-version-triple-b-changed/input.json +18 -0
  97. package/conformance/cases/c31-version-triple-b-changed/meta.json +5 -0
  98. package/conformance/cases/c32-version-triple-a-restored/expected.json +85 -0
  99. package/conformance/cases/c32-version-triple-a-restored/input.json +18 -0
  100. package/conformance/cases/c32-version-triple-a-restored/meta.json +5 -0
  101. package/conformance/cases/c33-limits-nested-carried-key/expected.json +91 -0
  102. package/conformance/cases/c33-limits-nested-carried-key/input.json +14 -0
  103. package/conformance/cases/c33-limits-nested-carried-key/meta.json +5 -0
  104. package/conformance/cases/c34-skills-content-vs-manifest/expected.json +160 -0
  105. package/conformance/cases/c34-skills-content-vs-manifest/input.json +18 -0
  106. package/conformance/cases/c34-skills-content-vs-manifest/meta.json +5 -0
  107. package/conformance/cases/c35-portable-domain-file-is-null/expected.json +76 -0
  108. package/conformance/cases/c35-portable-domain-file-is-null/input.json +9 -0
  109. package/conformance/cases/c35-portable-domain-file-is-null/meta.json +5 -0
  110. package/conformance/cases/c36-skills-entry-without-content/expected.json +144 -0
  111. package/conformance/cases/c36-skills-entry-without-content/input.json +16 -0
  112. package/conformance/cases/c36-skills-entry-without-content/meta.json +5 -0
  113. package/conformance/cases/c37-skills-field-null/expected.json +134 -0
  114. package/conformance/cases/c37-skills-field-null/input.json +9 -0
  115. package/conformance/cases/c37-skills-field-null/meta.json +5 -0
  116. package/conformance/cases/c38-remote-exec-is-a-non-domain-file/expected.json +72 -0
  117. package/conformance/cases/c38-remote-exec-is-a-non-domain-file/input.json +11 -0
  118. package/conformance/cases/c38-remote-exec-is-a-non-domain-file/meta.json +5 -0
  119. package/conformance/cases/c39-hidden-file-in-config-d/expected.json +72 -0
  120. package/conformance/cases/c39-hidden-file-in-config-d/input.json +11 -0
  121. package/conformance/cases/c39-hidden-file-in-config-d/meta.json +5 -0
  122. package/conformance/cases/cc01-mcp-toolfaces-non-object/expected.json +112 -0
  123. package/conformance/cases/cc01-mcp-toolfaces-non-object/input.json +39 -0
  124. package/conformance/cases/cc01-mcp-toolfaces-non-object/meta.json +8 -0
  125. package/conformance/cases/cc02-mcp-source-key-is-transported/expected.json +85 -0
  126. package/conformance/cases/cc02-mcp-source-key-is-transported/input.json +20 -0
  127. package/conformance/cases/cc02-mcp-source-key-is-transported/meta.json +8 -0
  128. package/conformance/cases/cc03-model-compat-unknown-subkey/expected.json +89 -0
  129. package/conformance/cases/cc03-model-compat-unknown-subkey/input.json +22 -0
  130. package/conformance/cases/cc03-model-compat-unknown-subkey/meta.json +8 -0
  131. package/conformance/cases/cli01-model-name-nfc-vs-nfd/expected.json +102 -0
  132. package/conformance/cases/cli01-model-name-nfc-vs-nfd/input.json +30 -0
  133. package/conformance/cases/cli01-model-name-nfc-vs-nfd/meta.json +9 -0
  134. package/conformance/cases/cli02-control-and-zero-width-chars/expected.json +115 -0
  135. package/conformance/cases/cli02-control-and-zero-width-chars/input.json +42 -0
  136. package/conformance/cases/cli02-control-and-zero-width-chars/meta.json +9 -0
  137. package/conformance/cases/cli03-credential-pasted-into-unknown-key/expected.json +92 -0
  138. package/conformance/cases/cli03-credential-pasted-into-unknown-key/input.json +16 -0
  139. package/conformance/cases/cli03-credential-pasted-into-unknown-key/meta.json +9 -0
  140. package/conformance/cases/cli04-env-value-with-newline/expected.json +93 -0
  141. package/conformance/cases/cli04-env-value-with-newline/input.json +23 -0
  142. package/conformance/cases/cli04-env-value-with-newline/meta.json +5 -0
  143. package/conformance/cases/cli05-long-and-prefix-colliding-names/expected.json +109 -0
  144. package/conformance/cases/cli05-long-and-prefix-colliding-names/input.json +30 -0
  145. package/conformance/cases/cli05-long-and-prefix-colliding-names/meta.json +5 -0
  146. package/conformance/cases/t01-absent-domain-key-not-null/expected.json +93 -0
  147. package/conformance/cases/t01-absent-domain-key-not-null/input.json +29 -0
  148. package/conformance/cases/t01-absent-domain-key-not-null/meta.json +6 -0
  149. package/conformance/cases/t02-entry-salvage-vs-whole-domain-refusal/expected.json +16 -0
  150. package/conformance/cases/t02-entry-salvage-vs-whole-domain-refusal/input.json +32 -0
  151. package/conformance/cases/t02-entry-salvage-vs-whole-domain-refusal/meta.json +6 -0
  152. package/conformance/cases/t03-prototype-name-key-not-swallowed/expected.json +107 -0
  153. package/conformance/cases/t03-prototype-name-key-not-swallowed/input.json +25 -0
  154. package/conformance/cases/t03-prototype-name-key-not-swallowed/meta.json +6 -0
  155. package/conformance/cases/t04-secret-literal-never-in-warning-value/expected.json +105 -0
  156. package/conformance/cases/t04-secret-literal-never-in-warning-value/input.json +25 -0
  157. package/conformance/cases/t04-secret-literal-never-in-warning-value/meta.json +14 -0
  158. package/conformance/cases/z01-every-domain-empty-object/expected.json +72 -0
  159. package/conformance/cases/z01-every-domain-empty-object/input.json +25 -0
  160. package/conformance/cases/z01-every-domain-empty-object/meta.json +5 -0
  161. package/conformance/cases/z02-every-domain-unknown-key/expected.json +228 -0
  162. package/conformance/cases/z02-every-domain-unknown-key/input.json +59 -0
  163. package/conformance/cases/z02-every-domain-unknown-key/meta.json +5 -0
  164. package/conformance/historical/settings-schema@1.0.0.json +1080 -0
  165. package/conformance/historical/settings-schema@1.10.0.json +1080 -0
  166. package/conformance/historical/settings-schema@1.5.0.json +1080 -0
  167. package/conformance/historical/settings-schema@2.0.0.json +1080 -0
  168. package/conformance/historical/settings-schema@2.1.0.json +1080 -0
  169. package/dist/api/auth.d.ts +42 -1
  170. package/dist/api/auth.js +71 -4
  171. package/dist/api/scopes.d.ts +9 -1
  172. package/dist/api/scopes.js +8 -2
  173. package/dist/config-fns.d.ts +60 -28
  174. package/dist/config-fns.js +94 -77
  175. package/dist/conformance/canonical.d.ts +36 -0
  176. package/dist/conformance/canonical.js +114 -0
  177. package/dist/conformance/contract-adapter.d.ts +20 -0
  178. package/dist/conformance/contract-adapter.js +74 -0
  179. package/dist/conformance/corpus.d.ts +73 -0
  180. package/dist/conformance/corpus.js +99 -0
  181. package/dist/conformance/derive.d.ts +48 -0
  182. package/dist/conformance/derive.js +136 -0
  183. package/dist/conformance/index.d.ts +22 -0
  184. package/dist/conformance/index.js +22 -0
  185. package/dist/conformance/run.d.ts +27 -0
  186. package/dist/conformance/run.js +424 -0
  187. package/dist/conformance/types.d.ts +288 -0
  188. package/dist/conformance/types.js +4 -0
  189. package/dist/conformance/warnings.d.ts +88 -0
  190. package/dist/conformance/warnings.js +144 -0
  191. package/dist/cross-domain.d.ts +1 -1
  192. package/dist/cross-domain.js +1 -1
  193. package/dist/file-store.d.ts +7 -0
  194. package/dist/file-store.js +6 -2
  195. package/dist/hooks.d.ts +2 -2
  196. package/dist/hooks.js +2 -2
  197. package/dist/scheduler-store.d.ts +1 -1
  198. package/dist/scheduler-store.js +1 -1
  199. package/dist/types.d.ts +2 -2
  200. package/dist/types.js +3 -3
  201. package/package.json +7 -5
  202. package/dist/api/wire.d.ts +0 -60
  203. package/dist/api/wire.js +0 -89
@@ -0,0 +1,16 @@
1
+ {
2
+ "domains": {
3
+ "outcome": "rejected",
4
+ "stage": "validate"
5
+ },
6
+ "wire": {
7
+ "outcome": "rejected",
8
+ "stage": "validate",
9
+ "why": "domains 腿是拒绝态,不派生;wire 腿把同一份 rosters 文档交给同一个 buildEffective(skills/prompts 之外零改道),闸门域的 throw 穿过信封层 ⇒ 拒绝层与 domains 腿相同"
10
+ },
11
+ "localRoot": {
12
+ "outcome": "rejected",
13
+ "stage": "validate",
14
+ "why": "models 与 rosters 都是便携域,两份文件层都过得去(都是 JSON 对象),拒绝发生在域校验层而不是 parse 层"
15
+ }
16
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "meta": {
3
+ "version": 7,
4
+ "updatedAt": "2026-09-16T00:00:00.000Z"
5
+ },
6
+ "domains": {
7
+ "models": {
8
+ "models": [
9
+ {
10
+ "name": "keep",
11
+ "provider": "openai",
12
+ "id": "keep-id",
13
+ "apiKeyEnv": "OPENAI_API_KEY"
14
+ },
15
+ {
16
+ "name": 5,
17
+ "id": "bad-id"
18
+ }
19
+ ]
20
+ },
21
+ "rosters": {
22
+ "rosters": [
23
+ {
24
+ "name": "r1"
25
+ },
26
+ {
27
+ "name": 5
28
+ }
29
+ ]
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "contributor": "test",
3
+ "claim": "同一份坏条目,放进逐条容错的域(`models`,`DOMAIN_READ_FALLBACK=\"default\"`)与放进 fail-loud 的闸门域(`rosters`,`=\"throw\"`),结论必须不同:前者丢那一条并恰报一条 `entry-dropped`、**不得同时**报 `domain-defaulted`(一域一个结论);后者**整份读在 validate 层被拒**(不是回落到 schema 默认 —— 对闸门域回落就是放宽闸门)。server [6782] 与 web-admin [7285] G2/G4 是同一件事的两半,跨腿读错会把『逐条容错』顺手放宽到闸门域,把这条设计为拒的输入读成绿(带两条 `entry-dropped`)。",
4
+ "firstRedOn": [],
5
+ "note": "【claim 措辞订正 2026-09-19,test 自纠】初稿写的是「后者整域回落」—— **是本方写错**:「回落」是 `DOMAIN_READ_FALLBACK=\"default\"` 那一族的动作,闸门域是 `\"throw\"` = fail-loud,整份读被拒。出处:契约自述 `config-fns.js` 的 `DOMAIN_READ_FALLBACK` 头注(defaulting would LOOSEN gates)+ 契约自带 `c05-gate-domain-bad-entry-throws` 金样(rejected/validate)+ 本仓 historical 实跑五版一致。claim 已按实测改写,对抗意图不变。两域放**同形**坏条目(`name` 是数字):`models`(DOMAIN_READ_FALLBACK=\"default\")与 `rosters`(=\"throw\",且是唯一一个便携的数组形闸门域)。3.0.0 实测:闸门域坏条目使**整份读**在 `validate` 层拒,三腿同形 —— 因此本条的期望是 `rejected/validate`,`models` 那半场在同一份输入里**结构上观察不到**。这正是本条的判别力所在:一个把逐条容错顺手放宽到闸门域的消费方,会把这条设计为拒的 case 读成绿(带两条 `entry-dropped`)。claim 前半场(`models` 恰一条 `entry-dropped`、零 `domain-defaulted`)由 verify.mjs 的配对正控臂(同一份输入去掉 `rosters` 域)钉住,读数记在 _SUMMARY.json 的 t02.pairedControl。claim 里「闸门域整域回落」的『回落』一词与契约自述的 `\"throw\"` = fail-loud 不符 —— 见 _SUMMARY.json 的 claimVsObserved。firstRedOn 空是**实跑**出来的:1.0.0/1.5.0/1.10.0/2.0.0/2.1.0 五版在本条上都是 expected-rejected(闸门域坏条目整份拒这条律从 1.0.0 起一字未动)⇒ 护栏,不是回归凭证。"
6
+ }
@@ -0,0 +1,107 @@
1
+ {
2
+ "domains": {
3
+ "outcome": "effective",
4
+ "effective": {
5
+ "collab": {
6
+ "templates": []
7
+ },
8
+ "entitlement": {
9
+ "budgetGroups": [],
10
+ "groupBindings": [],
11
+ "subjects": [],
12
+ "tiers": []
13
+ },
14
+ "execution": {
15
+ "allowedLanes": [
16
+ "host"
17
+ ],
18
+ "required": false
19
+ },
20
+ "governance": {},
21
+ "hosts": {
22
+ "hosts": []
23
+ },
24
+ "limits": {},
25
+ "mcp": {
26
+ "servers": []
27
+ },
28
+ "models": {
29
+ "models": [
30
+ {
31
+ "api": "openai-completions",
32
+ "apiKeyEnv": "OPENAI_API_KEY",
33
+ "enabled": true,
34
+ "id": "m0-id",
35
+ "name": "m0",
36
+ "provider": "openai",
37
+ "quotaWeight": 1,
38
+ "reasoning": false,
39
+ "tier": "standard",
40
+ "vision": false
41
+ }
42
+ ],
43
+ "roles": {},
44
+ "tierGroups": []
45
+ },
46
+ "plugins": {
47
+ "plugins": []
48
+ },
49
+ "projects": {
50
+ "projects": {}
51
+ },
52
+ "prompts": {
53
+ "bindings": []
54
+ },
55
+ "rosters": {
56
+ "rosters": []
57
+ },
58
+ "runtime": {},
59
+ "scenarios": {
60
+ "scenarios": []
61
+ },
62
+ "skills": {
63
+ "skills": []
64
+ },
65
+ "systems": {
66
+ "systems": []
67
+ },
68
+ "workers": {
69
+ "workers": []
70
+ }
71
+ },
72
+ "warnings": [
73
+ {
74
+ "domain": "models",
75
+ "keys": [
76
+ [
77
+ "models",
78
+ 0,
79
+ "__proto__"
80
+ ],
81
+ [
82
+ "models",
83
+ 0,
84
+ "constructor"
85
+ ],
86
+ [
87
+ "models",
88
+ 0,
89
+ "toString"
90
+ ]
91
+ ],
92
+ "kind": "unknown-keys-dropped"
93
+ }
94
+ ],
95
+ "metadata": {
96
+ "version": 7,
97
+ "updatedAt": "2026-09-16T00:00:00.000Z"
98
+ }
99
+ },
100
+ "wire": {
101
+ "derive": true
102
+ },
103
+ "localRoot": {
104
+ "derive": true,
105
+ "localVersion": 3232605402901914
106
+ }
107
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "meta": {
3
+ "version": 7,
4
+ "updatedAt": "2026-09-16T00:00:00.000Z"
5
+ },
6
+ "domains": {
7
+ "models": {
8
+ "models": [
9
+ {
10
+ "name": "m0",
11
+ "provider": "openai",
12
+ "id": "m0-id",
13
+ "apiKeyEnv": "OPENAI_API_KEY",
14
+ "__proto__": {
15
+ "polluted": true
16
+ },
17
+ "constructor": {
18
+ "polluted": true
19
+ },
20
+ "toString": "nope"
21
+ }
22
+ ]
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "contributor": "test",
3
+ "claim": "`__proto__` / `constructor` / `toString` 作为域内条目的键,**在坏条目上**:告警坐标必须把它当**普通字面键**点名、`effective` 的原型必须不被污染、三腿读法一致。本方在 server 7.87.0 G6 实测过同族(`answer.answers[0].__proto__` ⇒ `400 request.field_invalid` 且 `unknownKeys` 逐字点名);也在本仓自证里把 `__proto__` 的断言方向搞反过一次(`JSON.parse` + spread **保留** own 属性、plain assignment 才污染原型),所以这条同时是护栏。",
4
+ "firstRedOn": [],
5
+ "note": "【claim 收窄 2026-09-19,server [7621] ① 指出、主会话亲验】初稿把 `__proto__` **作好条目的 record 键**也算进「当普通字面键报进坐标」。**实测不成立**:`parseDomainLoud('limits', {__proto__:1, ok:2}, …)` 的告警 keys 只有 `['ok']`,`parsed` 上无 own `__proto__`(原型仍是 `Object.prototype`)—— 好条目上的原型名键在 zod 3 正常解析路径上本来就被丢,是 [7617] 已知限制,不是本条要钉的东西。claim 已收窄到**坏条目**那半场(真的、可判、有判别力);好条目那半场不入语料。与契约仓 c12 的差别:c12 打的是**顶层键**(`k in built` 一路问到 Object.prototype ⇒ open-world 承诺失效),本条打的是**域内条目的键**(剥键扫描 `collectDropped` 的 `Object.keys` / `hasOwnProperty` 两处判据,以及 salvage/rebase 路径上的对象重建)。构造坑(本方亲踩,记在此处防下一个人重踩):用 JS 对象字面量 `{\"__proto__\": {...}}` 造这条输入会**设置原型而不是加一个键**,于是 `isPlainJsonObject` 判假、整条扫描被跳过、case 测了个寂寞;语料走 `JSON.parse` 才拿到自有键 —— 这也是为什么这条必须以磁盘语料形存在,而不是测试里一个内联对象。firstRedOn 空是**实跑**出来的:五个旧版(1.0.0/1.5.0/1.10.0/2.0.0/2.1.0)在本条上全绿 —— S-332 那个 bug 只落在**顶层键**那一层(契约 c12 五版全红),域内条目键这一层从 1.0.0 起就一直对 ⇒ 本条是护栏,不是回归凭证。"
6
+ }
@@ -0,0 +1,105 @@
1
+ {
2
+ "domains": {
3
+ "outcome": "effective",
4
+ "effective": {
5
+ "collab": {
6
+ "templates": []
7
+ },
8
+ "entitlement": {
9
+ "budgetGroups": [],
10
+ "groupBindings": [],
11
+ "subjects": [],
12
+ "tiers": []
13
+ },
14
+ "execution": {
15
+ "allowedLanes": [
16
+ "host"
17
+ ],
18
+ "required": false
19
+ },
20
+ "governance": {},
21
+ "hosts": {
22
+ "hosts": []
23
+ },
24
+ "limits": {},
25
+ "mcp": {
26
+ "servers": []
27
+ },
28
+ "models": {
29
+ "models": [
30
+ {
31
+ "api": "openai-completions",
32
+ "apiKeyEnv": "OPENAI_API_KEY",
33
+ "enabled": true,
34
+ "id": "keep-id",
35
+ "name": "keep",
36
+ "provider": "openai",
37
+ "quotaWeight": 1,
38
+ "reasoning": false,
39
+ "tier": "standard",
40
+ "vision": false
41
+ }
42
+ ],
43
+ "roles": {},
44
+ "tierGroups": []
45
+ },
46
+ "plugins": {
47
+ "plugins": []
48
+ },
49
+ "projects": {
50
+ "projects": {}
51
+ },
52
+ "prompts": {
53
+ "bindings": []
54
+ },
55
+ "rosters": {
56
+ "rosters": []
57
+ },
58
+ "runtime": {},
59
+ "scenarios": {
60
+ "scenarios": []
61
+ },
62
+ "skills": {
63
+ "skills": []
64
+ },
65
+ "systems": {
66
+ "systems": []
67
+ },
68
+ "workers": {
69
+ "workers": []
70
+ }
71
+ },
72
+ "warnings": [
73
+ {
74
+ "domain": "models",
75
+ "kind": "entry-dropped",
76
+ "path": [
77
+ "models",
78
+ 1
79
+ ]
80
+ },
81
+ {
82
+ "domain": "models",
83
+ "keys": [
84
+ [
85
+ "models",
86
+ 0,
87
+ "apiKeyInline"
88
+ ]
89
+ ],
90
+ "kind": "unknown-keys-dropped"
91
+ }
92
+ ],
93
+ "metadata": {
94
+ "version": 7,
95
+ "updatedAt": "2026-09-16T00:00:00.000Z"
96
+ }
97
+ },
98
+ "wire": {
99
+ "derive": true
100
+ },
101
+ "localRoot": {
102
+ "derive": true,
103
+ "localVersion": 2614200563056761
104
+ }
105
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "meta": {
3
+ "version": 7,
4
+ "updatedAt": "2026-09-16T00:00:00.000Z"
5
+ },
6
+ "domains": {
7
+ "models": {
8
+ "models": [
9
+ {
10
+ "name": "keep",
11
+ "provider": "openai",
12
+ "id": "keep-id",
13
+ "apiKeyEnv": "OPENAI_API_KEY",
14
+ "apiKeyInline": "sk-FAKE-CORPUS-0000000000000000"
15
+ },
16
+ {
17
+ "name": "bad",
18
+ "provider": "openai",
19
+ "id": "bad-id",
20
+ "api": "ghp_FAKE-CORPUS-1111111111111111"
21
+ }
22
+ ]
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "contributor": "test",
3
+ "claim": "坏条目的**值**里埋 `sk-`/`ghp_` 形秘密字面:告警面必须**名字上线、值永不上线**(与 `hosts-grandfathered` 同律)。本方给 web-admin G3 加过同款正控 —— 没有正控时『没打印秘密』与『判据没跑到那一行』同形。",
4
+ "firstRedOn": [
5
+ "settings-schema@1.0.0",
6
+ "settings-schema@1.10.0",
7
+ "settings-schema@1.5.0"
8
+ ],
9
+ "secrets": [
10
+ "sk-FAKE-CORPUS-0000000000000000",
11
+ "ghp_FAKE-CORPUS-1111111111111111"
12
+ ],
13
+ "note": "两条秘密走**两条不同的告警路径**,所以「值不上线」在两条路上分别被判:①`sk-` 那把是**存活条目**上一个未知键的值 ⇒ 只该出现在 `unknown-keys-dropped` 的键坐标里(键名 `apiKeyInline` 上线、值不上线);②`ghp_` 那把是**被丢条目**上一个 enum 字段的值 ⇒ zod 的 `invalid_enum_value` 会把 `received` 原样回显,只有 `sanitizeZodError`/`redactSecrets` 挡着 ⇒ 它落在 `entry-dropped.error` 的文案面上,而 `findSecretLeaks` 恰恰扫这一面。正控(判据到达性)由 expected 的两条告警坐标承担:`[\"models\",0,\"apiKeyInline\"]` 与 `[\"models\",1]` 必须在场,证明剥键扫描与抢救路径都真跑到了。扫描器自身的判别力由 verify.mjs 的 decoy 臂钉住(把一个**非**秘密形的 enum 值当秘密登记 ⇒ findSecretLeaks 必须命中),否则「零命中」与「扫描器恒返回空」同形。语料里的两把是**假串**,不是任何真凭据。⚠️ firstRedOn 里的三个旧版**不是在秘密轴上红的**:逐版直读 `findSecretLeaks`(1.0.0/1.5.0/1.10.0/2.0.0/2.1.0)**五版全零命中**;那三版红是因为 1.11.0 才有的逐条容错还不存在,整个 `models` 域退默认(只报一条 `domain-defaulted`),于是 effective 与告警多重集都对不上。⇒ 在**秘密轴**上这条同样是护栏;把「这条 case 在旧版上红」读成「旧版泄过秘密」是从读数推到结论的那一类错,读数见 _historical-readout.json#t04SecretAxis。"
14
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "domains": {
3
+ "outcome": "effective",
4
+ "effective": {
5
+ "collab": {
6
+ "templates": []
7
+ },
8
+ "entitlement": {
9
+ "budgetGroups": [],
10
+ "groupBindings": [],
11
+ "subjects": [],
12
+ "tiers": []
13
+ },
14
+ "execution": {
15
+ "allowedLanes": [
16
+ "host"
17
+ ],
18
+ "required": false
19
+ },
20
+ "governance": {},
21
+ "hosts": {
22
+ "hosts": []
23
+ },
24
+ "limits": {},
25
+ "mcp": {
26
+ "servers": []
27
+ },
28
+ "models": {
29
+ "models": [],
30
+ "roles": {},
31
+ "tierGroups": []
32
+ },
33
+ "plugins": {
34
+ "plugins": []
35
+ },
36
+ "projects": {
37
+ "projects": {}
38
+ },
39
+ "prompts": {
40
+ "bindings": []
41
+ },
42
+ "rosters": {
43
+ "rosters": []
44
+ },
45
+ "runtime": {},
46
+ "scenarios": {
47
+ "scenarios": []
48
+ },
49
+ "skills": {
50
+ "skills": []
51
+ },
52
+ "systems": {
53
+ "systems": []
54
+ },
55
+ "workers": {
56
+ "workers": []
57
+ }
58
+ },
59
+ "warnings": [],
60
+ "metadata": {
61
+ "version": 7,
62
+ "updatedAt": "2026-09-16T00:00:00.000Z"
63
+ }
64
+ },
65
+ "wire": {
66
+ "derive": true
67
+ },
68
+ "localRoot": {
69
+ "derive": true,
70
+ "localVersion": 209075514147757
71
+ }
72
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "meta": {
3
+ "version": 7,
4
+ "updatedAt": "2026-09-16T00:00:00.000Z"
5
+ },
6
+ "domains": {
7
+ "models": {},
8
+ "rosters": {},
9
+ "skills": {},
10
+ "mcp": {},
11
+ "plugins": {},
12
+ "scenarios": {},
13
+ "systems": {},
14
+ "collab": {},
15
+ "workers": {},
16
+ "hosts": {},
17
+ "runtime": {},
18
+ "governance": {},
19
+ "entitlement": {},
20
+ "execution": {},
21
+ "projects": {},
22
+ "prompts": {},
23
+ "limits": {}
24
+ }
25
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "contributor": "contract",
3
+ "claim": "十七个域各给一份**合法空文档** `{}` ⇒ 零告警、每域落 schema 默认。覆盖律的第一份:每个域至少被两条 case 摸过。它同时钉住「设了空」这一形在三腿上的读数,以及 local-root 腿对五个非便携域各报一条 unread-config-file。",
4
+ "firstRedOn": []
5
+ }
@@ -0,0 +1,228 @@
1
+ {
2
+ "domains": {
3
+ "outcome": "effective",
4
+ "effective": {
5
+ "collab": {
6
+ "templates": []
7
+ },
8
+ "entitlement": {
9
+ "budgetGroups": [],
10
+ "groupBindings": [],
11
+ "subjects": [],
12
+ "tiers": []
13
+ },
14
+ "execution": {
15
+ "allowedLanes": [
16
+ "host"
17
+ ],
18
+ "required": false
19
+ },
20
+ "governance": {},
21
+ "hosts": {
22
+ "hosts": []
23
+ },
24
+ "limits": {
25
+ "zzzUnknown": 1
26
+ },
27
+ "mcp": {
28
+ "servers": []
29
+ },
30
+ "models": {
31
+ "models": [],
32
+ "roles": {},
33
+ "tierGroups": []
34
+ },
35
+ "plugins": {
36
+ "plugins": []
37
+ },
38
+ "projects": {
39
+ "projects": {}
40
+ },
41
+ "prompts": {
42
+ "bindings": []
43
+ },
44
+ "rosters": {
45
+ "rosters": []
46
+ },
47
+ "runtime": {},
48
+ "scenarios": {
49
+ "scenarios": []
50
+ },
51
+ "skills": {
52
+ "skills": []
53
+ },
54
+ "systems": {
55
+ "systems": []
56
+ },
57
+ "workers": {
58
+ "workers": []
59
+ }
60
+ },
61
+ "warnings": [
62
+ {
63
+ "domain": "governance",
64
+ "keys": [
65
+ [
66
+ "zzzUnknown"
67
+ ]
68
+ ],
69
+ "kind": "unknown-keys-dropped"
70
+ },
71
+ {
72
+ "domain": "runtime",
73
+ "keys": [
74
+ [
75
+ "zzzUnknown"
76
+ ]
77
+ ],
78
+ "kind": "unknown-keys-dropped"
79
+ },
80
+ {
81
+ "domain": "models",
82
+ "keys": [
83
+ [
84
+ "zzzUnknown"
85
+ ]
86
+ ],
87
+ "kind": "unknown-keys-dropped"
88
+ },
89
+ {
90
+ "domain": "rosters",
91
+ "keys": [
92
+ [
93
+ "zzzUnknown"
94
+ ]
95
+ ],
96
+ "kind": "unknown-keys-dropped"
97
+ },
98
+ {
99
+ "domain": "skills",
100
+ "keys": [
101
+ [
102
+ "zzzUnknown"
103
+ ]
104
+ ],
105
+ "kind": "unknown-keys-dropped"
106
+ },
107
+ {
108
+ "domain": "mcp",
109
+ "keys": [
110
+ [
111
+ "zzzUnknown"
112
+ ]
113
+ ],
114
+ "kind": "unknown-keys-dropped"
115
+ },
116
+ {
117
+ "domain": "plugins",
118
+ "keys": [
119
+ [
120
+ "zzzUnknown"
121
+ ]
122
+ ],
123
+ "kind": "unknown-keys-dropped"
124
+ },
125
+ {
126
+ "domain": "scenarios",
127
+ "keys": [
128
+ [
129
+ "zzzUnknown"
130
+ ]
131
+ ],
132
+ "kind": "unknown-keys-dropped"
133
+ },
134
+ {
135
+ "domain": "systems",
136
+ "keys": [
137
+ [
138
+ "zzzUnknown"
139
+ ]
140
+ ],
141
+ "kind": "unknown-keys-dropped"
142
+ },
143
+ {
144
+ "domain": "collab",
145
+ "keys": [
146
+ [
147
+ "zzzUnknown"
148
+ ]
149
+ ],
150
+ "kind": "unknown-keys-dropped"
151
+ },
152
+ {
153
+ "domain": "workers",
154
+ "keys": [
155
+ [
156
+ "zzzUnknown"
157
+ ]
158
+ ],
159
+ "kind": "unknown-keys-dropped"
160
+ },
161
+ {
162
+ "domain": "hosts",
163
+ "keys": [
164
+ [
165
+ "zzzUnknown"
166
+ ]
167
+ ],
168
+ "kind": "unknown-keys-dropped"
169
+ },
170
+ {
171
+ "domain": "entitlement",
172
+ "keys": [
173
+ [
174
+ "zzzUnknown"
175
+ ]
176
+ ],
177
+ "kind": "unknown-keys-dropped"
178
+ },
179
+ {
180
+ "domain": "execution",
181
+ "keys": [
182
+ [
183
+ "zzzUnknown"
184
+ ]
185
+ ],
186
+ "kind": "unknown-keys-dropped"
187
+ },
188
+ {
189
+ "domain": "projects",
190
+ "keys": [
191
+ [
192
+ "zzzUnknown"
193
+ ]
194
+ ],
195
+ "kind": "unknown-keys-dropped"
196
+ },
197
+ {
198
+ "domain": "prompts",
199
+ "keys": [
200
+ [
201
+ "zzzUnknown"
202
+ ]
203
+ ],
204
+ "kind": "unknown-keys-dropped"
205
+ },
206
+ {
207
+ "domain": "limits",
208
+ "keys": [
209
+ [
210
+ "zzzUnknown"
211
+ ]
212
+ ],
213
+ "kind": "unknown-keys-carried"
214
+ }
215
+ ],
216
+ "metadata": {
217
+ "version": 7,
218
+ "updatedAt": "2026-09-16T00:00:00.000Z"
219
+ }
220
+ },
221
+ "wire": {
222
+ "derive": true
223
+ },
224
+ "localRoot": {
225
+ "derive": true,
226
+ "localVersion": 2336752390152956
227
+ }
228
+ }