@sema-agent/settings-schema 1.7.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,16 @@
6
6
  > `@sema-agent/registry-core`(更早还曾是 `@sema-ai/registry-core`)。本档 `0.19.0` 以下各节里的
7
7
  > 包名是**历史记录**,如实保留不追改。
8
8
 
9
+ ## 1.8.0 — 2026-09-07 — `ModelRole` 闭集对齐 core:加 `classifier` / `consolidate`(新词=minor)
10
+
11
+ - cli [6554] 真案:core `ModelRole` 早有 `classifier`(auto 权限分类器,FALLBACK classifier→summarize→default、tier 缺省 flash)
12
+ 与 `consolidate`(记忆整理),本闭集没跟上 ⇒ settings 写 `models.roles.classifier` 被 schema 拒,用户想单独钉分类器模型
13
+ 只能连带 summarize(或走 `MODEL_CHEAP_ID` 连带 subagent)。1.8.0 起两词合法;`advisor`(teacher mode)仍刻意排除(无消费方)。
14
+ - **roster 标记族不动**(`ROSTER_CHEAP_ROLES` 仍 subagent/summarize):新角色不派生、走 core 兜底链、只由 settings 显式钉——
15
+ 归 cheap 会让消费方把它钉死到 cheapRef,盖掉 `models.tiers.flash` 档位。反向门改为显式登记三个不派生角色各自理由。
16
+ - 消费方:sema-server 经 `apply-effective` 逐键落 `config.roles`,零改;server 侧加编译期子集钉(schema ⊆ core)。
17
+ - 红先:`test/model-role-1.8.test.ts`(1.7.2 上两格红)+ `resolve-roster.test.ts` 反向门更新。
18
+
9
19
  ## 1.7.2 — 2026-09-06 — `source` 改**解析透明**(`z.unknown()`;patch)
10
20
 
11
21
  - 1.7.1 的 `z.string()` 对 `source: null`(或数字/数组/对象)仍在解析处拒 ⇒ 整域 all-or-nothing 下**一个**非串标签让整套
@@ -1,7 +1,8 @@
1
1
  import { stableHash } from "./hash.js";
2
2
  import { toSkillsManifest } from "./skills-manifest.js";
3
3
  // ── 主/cheap 角色标记语义(0.6.3, E3)────────────────────────────────
4
- // service 现有 ModelRoles 口径:default/team/synthesize→主、subagent/summarize→cheap。`verifier` 刻意
4
+ // service 现有 ModelRoles 口径:default/team/synthesize→主、subagent/summarize→cheap。1.8.0 起 `classifier`/`consolidate`
5
+ // 同 `verifier` 一样**不派生**(归 cheap 会盖掉 models.tiers 档位与 core 兜底链)。`verifier` 刻意
5
6
  // 不派生(unset→core 的 default 兜底链,与 service 语义一致)。常量导出=单一语义源,service 收敛小单与
6
7
  // center 表单同源引用,别第二份。
7
8
  /** primaryModel 标记喂的角色族(§3)。 */
package/dist/types.d.ts CHANGED
@@ -315,7 +315,7 @@ export declare const ModelEntry: z.ZodEffects<z.ZodObject<{
315
315
  notes?: string | undefined;
316
316
  }>;
317
317
  export type ModelEntry = z.infer<typeof ModelEntry>;
318
- export declare const ModelRole: z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier"]>;
318
+ export declare const ModelRole: z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier", "classifier", "consolidate"]>;
319
319
  export type ModelRole = z.infer<typeof ModelRole>;
320
320
  /** A role resolves either to a model NAME, or by capability/price (core 1.25 `{ select }`). */
321
321
  export declare const RoleTarget: z.ZodUnion<[z.ZodObject<{
@@ -640,7 +640,7 @@ export declare const ModelsConfig: z.ZodEffects<z.ZodObject<{
640
640
  * superRefine);未经 schema 的本地/存量 lane 由消费方 warn 降级(与 activeTierGroup 双层姿势一致)。 */
641
641
  default: z.ZodOptional<z.ZodString>;
642
642
  /** role → target. Unset roles fall back to `default` (core fallback chain). */
643
- roles: z.ZodDefault<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier"]>, z.ZodUnion<[z.ZodObject<{
643
+ roles: z.ZodDefault<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier", "classifier", "consolidate"]>, z.ZodUnion<[z.ZodObject<{
644
644
  model: z.ZodString;
645
645
  }, "strip", z.ZodTypeAny, {
646
646
  model: string;
@@ -755,7 +755,7 @@ export declare const ModelsConfig: z.ZodEffects<z.ZodObject<{
755
755
  extraBody?: Record<string, unknown> | undefined;
756
756
  notes?: string | undefined;
757
757
  }[];
758
- roles: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
758
+ roles: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
759
759
  model: string;
760
760
  } | {
761
761
  select: {
@@ -812,7 +812,7 @@ export declare const ModelsConfig: z.ZodEffects<z.ZodObject<{
812
812
  enabled?: boolean | undefined;
813
813
  notes?: string | undefined;
814
814
  }[] | undefined;
815
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
815
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
816
816
  model: string;
817
817
  } | {
818
818
  select: {
@@ -867,7 +867,7 @@ export declare const ModelsConfig: z.ZodEffects<z.ZodObject<{
867
867
  extraBody?: Record<string, unknown> | undefined;
868
868
  notes?: string | undefined;
869
869
  }[];
870
- roles: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
870
+ roles: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
871
871
  model: string;
872
872
  } | {
873
873
  select: {
@@ -924,7 +924,7 @@ export declare const ModelsConfig: z.ZodEffects<z.ZodObject<{
924
924
  enabled?: boolean | undefined;
925
925
  notes?: string | undefined;
926
926
  }[] | undefined;
927
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
927
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
928
928
  model: string;
929
929
  } | {
930
930
  select: {
@@ -955,14 +955,14 @@ export declare const RosterEntry: z.ZodObject<{
955
955
  /**
956
956
  * 主模型角色标记(0.6.3, E3)——catalog model NAME。worker.model 废除后 service 从 roster
957
957
  * 解析 boot 主模型的归宿位:解析语义(resolve-roster)= primary 喂 `default`/`team`/`synthesize` 三角色、
958
- * cheap 喂 `subagent`/`summarize`(service 现有 ModelRoles 口径;`verifier` 不派生——unset→default 兜底链)。
958
+ * cheap 喂 `subagent`/`summarize`(service 现有 ModelRoles 口径;`verifier`/`classifier`/`consolidate` 不派生——unset 走 core 兜底链)。
959
959
  * 显式 `roles` **逐角色**优先于标记派生;标记优先于全局 models.roles。additive:不设=行为与 0.6.2 全等。
960
960
  */
961
961
  primaryModel: z.ZodOptional<z.ZodString>;
962
962
  /** cheap 模型角色标记(同上;worker.model.cheapId 的迁移归宿,§3②)。 */
963
963
  cheapModel: z.ZodOptional<z.ZodString>;
964
964
  /** Role map override; unset roles fall back to marker-derived roles, then the global models.roles. */
965
- roles: z.ZodOptional<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier"]>, z.ZodUnion<[z.ZodObject<{
965
+ roles: z.ZodOptional<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier", "classifier", "consolidate"]>, z.ZodUnion<[z.ZodObject<{
966
966
  model: z.ZodString;
967
967
  }, "strip", z.ZodTypeAny, {
968
968
  model: string;
@@ -1002,7 +1002,7 @@ export declare const RosterEntry: z.ZodObject<{
1002
1002
  name: string;
1003
1003
  models: string[];
1004
1004
  notes?: string | undefined;
1005
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
1005
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
1006
1006
  model: string;
1007
1007
  } | {
1008
1008
  select: {
@@ -1018,7 +1018,7 @@ export declare const RosterEntry: z.ZodObject<{
1018
1018
  name: string;
1019
1019
  notes?: string | undefined;
1020
1020
  models?: string[] | undefined;
1021
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
1021
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
1022
1022
  model: string;
1023
1023
  } | {
1024
1024
  select: {
@@ -1040,14 +1040,14 @@ export declare const RostersConfig: z.ZodEffects<z.ZodObject<{
1040
1040
  /**
1041
1041
  * 主模型角色标记(0.6.3, E3)——catalog model NAME。worker.model 废除后 service 从 roster
1042
1042
  * 解析 boot 主模型的归宿位:解析语义(resolve-roster)= primary 喂 `default`/`team`/`synthesize` 三角色、
1043
- * cheap 喂 `subagent`/`summarize`(service 现有 ModelRoles 口径;`verifier` 不派生——unset→default 兜底链)。
1043
+ * cheap 喂 `subagent`/`summarize`(service 现有 ModelRoles 口径;`verifier`/`classifier`/`consolidate` 不派生——unset 走 core 兜底链)。
1044
1044
  * 显式 `roles` **逐角色**优先于标记派生;标记优先于全局 models.roles。additive:不设=行为与 0.6.2 全等。
1045
1045
  */
1046
1046
  primaryModel: z.ZodOptional<z.ZodString>;
1047
1047
  /** cheap 模型角色标记(同上;worker.model.cheapId 的迁移归宿,§3②)。 */
1048
1048
  cheapModel: z.ZodOptional<z.ZodString>;
1049
1049
  /** Role map override; unset roles fall back to marker-derived roles, then the global models.roles. */
1050
- roles: z.ZodOptional<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier"]>, z.ZodUnion<[z.ZodObject<{
1050
+ roles: z.ZodOptional<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier", "classifier", "consolidate"]>, z.ZodUnion<[z.ZodObject<{
1051
1051
  model: z.ZodString;
1052
1052
  }, "strip", z.ZodTypeAny, {
1053
1053
  model: string;
@@ -1087,7 +1087,7 @@ export declare const RostersConfig: z.ZodEffects<z.ZodObject<{
1087
1087
  name: string;
1088
1088
  models: string[];
1089
1089
  notes?: string | undefined;
1090
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
1090
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
1091
1091
  model: string;
1092
1092
  } | {
1093
1093
  select: {
@@ -1103,7 +1103,7 @@ export declare const RostersConfig: z.ZodEffects<z.ZodObject<{
1103
1103
  name: string;
1104
1104
  notes?: string | undefined;
1105
1105
  models?: string[] | undefined;
1106
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
1106
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
1107
1107
  model: string;
1108
1108
  } | {
1109
1109
  select: {
@@ -1121,7 +1121,7 @@ export declare const RostersConfig: z.ZodEffects<z.ZodObject<{
1121
1121
  name: string;
1122
1122
  models: string[];
1123
1123
  notes?: string | undefined;
1124
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
1124
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
1125
1125
  model: string;
1126
1126
  } | {
1127
1127
  select: {
@@ -1139,7 +1139,7 @@ export declare const RostersConfig: z.ZodEffects<z.ZodObject<{
1139
1139
  name: string;
1140
1140
  notes?: string | undefined;
1141
1141
  models?: string[] | undefined;
1142
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
1142
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
1143
1143
  model: string;
1144
1144
  } | {
1145
1145
  select: {
@@ -1157,7 +1157,7 @@ export declare const RostersConfig: z.ZodEffects<z.ZodObject<{
1157
1157
  name: string;
1158
1158
  models: string[];
1159
1159
  notes?: string | undefined;
1160
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
1160
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
1161
1161
  model: string;
1162
1162
  } | {
1163
1163
  select: {
@@ -1175,7 +1175,7 @@ export declare const RostersConfig: z.ZodEffects<z.ZodObject<{
1175
1175
  name: string;
1176
1176
  notes?: string | undefined;
1177
1177
  models?: string[] | undefined;
1178
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
1178
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
1179
1179
  model: string;
1180
1180
  } | {
1181
1181
  select: {
@@ -9515,7 +9515,7 @@ export declare const DOMAIN_SCHEMAS: {
9515
9515
  * superRefine);未经 schema 的本地/存量 lane 由消费方 warn 降级(与 activeTierGroup 双层姿势一致)。 */
9516
9516
  default: z.ZodOptional<z.ZodString>;
9517
9517
  /** role → target. Unset roles fall back to `default` (core fallback chain). */
9518
- roles: z.ZodDefault<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier"]>, z.ZodUnion<[z.ZodObject<{
9518
+ roles: z.ZodDefault<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier", "classifier", "consolidate"]>, z.ZodUnion<[z.ZodObject<{
9519
9519
  model: z.ZodString;
9520
9520
  }, "strip", z.ZodTypeAny, {
9521
9521
  model: string;
@@ -9630,7 +9630,7 @@ export declare const DOMAIN_SCHEMAS: {
9630
9630
  extraBody?: Record<string, unknown> | undefined;
9631
9631
  notes?: string | undefined;
9632
9632
  }[];
9633
- roles: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9633
+ roles: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9634
9634
  model: string;
9635
9635
  } | {
9636
9636
  select: {
@@ -9687,7 +9687,7 @@ export declare const DOMAIN_SCHEMAS: {
9687
9687
  enabled?: boolean | undefined;
9688
9688
  notes?: string | undefined;
9689
9689
  }[] | undefined;
9690
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9690
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9691
9691
  model: string;
9692
9692
  } | {
9693
9693
  select: {
@@ -9742,7 +9742,7 @@ export declare const DOMAIN_SCHEMAS: {
9742
9742
  extraBody?: Record<string, unknown> | undefined;
9743
9743
  notes?: string | undefined;
9744
9744
  }[];
9745
- roles: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9745
+ roles: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9746
9746
  model: string;
9747
9747
  } | {
9748
9748
  select: {
@@ -9799,7 +9799,7 @@ export declare const DOMAIN_SCHEMAS: {
9799
9799
  enabled?: boolean | undefined;
9800
9800
  notes?: string | undefined;
9801
9801
  }[] | undefined;
9802
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9802
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9803
9803
  model: string;
9804
9804
  } | {
9805
9805
  select: {
@@ -9830,14 +9830,14 @@ export declare const DOMAIN_SCHEMAS: {
9830
9830
  /**
9831
9831
  * 主模型角色标记(0.6.3, E3)——catalog model NAME。worker.model 废除后 service 从 roster
9832
9832
  * 解析 boot 主模型的归宿位:解析语义(resolve-roster)= primary 喂 `default`/`team`/`synthesize` 三角色、
9833
- * cheap 喂 `subagent`/`summarize`(service 现有 ModelRoles 口径;`verifier` 不派生——unset→default 兜底链)。
9833
+ * cheap 喂 `subagent`/`summarize`(service 现有 ModelRoles 口径;`verifier`/`classifier`/`consolidate` 不派生——unset 走 core 兜底链)。
9834
9834
  * 显式 `roles` **逐角色**优先于标记派生;标记优先于全局 models.roles。additive:不设=行为与 0.6.2 全等。
9835
9835
  */
9836
9836
  primaryModel: z.ZodOptional<z.ZodString>;
9837
9837
  /** cheap 模型角色标记(同上;worker.model.cheapId 的迁移归宿,§3②)。 */
9838
9838
  cheapModel: z.ZodOptional<z.ZodString>;
9839
9839
  /** Role map override; unset roles fall back to marker-derived roles, then the global models.roles. */
9840
- roles: z.ZodOptional<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier"]>, z.ZodUnion<[z.ZodObject<{
9840
+ roles: z.ZodOptional<z.ZodRecord<z.ZodEnum<["default", "summarize", "subagent", "team", "synthesize", "verifier", "classifier", "consolidate"]>, z.ZodUnion<[z.ZodObject<{
9841
9841
  model: z.ZodString;
9842
9842
  }, "strip", z.ZodTypeAny, {
9843
9843
  model: string;
@@ -9877,7 +9877,7 @@ export declare const DOMAIN_SCHEMAS: {
9877
9877
  name: string;
9878
9878
  models: string[];
9879
9879
  notes?: string | undefined;
9880
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9880
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9881
9881
  model: string;
9882
9882
  } | {
9883
9883
  select: {
@@ -9893,7 +9893,7 @@ export declare const DOMAIN_SCHEMAS: {
9893
9893
  name: string;
9894
9894
  notes?: string | undefined;
9895
9895
  models?: string[] | undefined;
9896
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9896
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9897
9897
  model: string;
9898
9898
  } | {
9899
9899
  select: {
@@ -9911,7 +9911,7 @@ export declare const DOMAIN_SCHEMAS: {
9911
9911
  name: string;
9912
9912
  models: string[];
9913
9913
  notes?: string | undefined;
9914
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9914
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9915
9915
  model: string;
9916
9916
  } | {
9917
9917
  select: {
@@ -9929,7 +9929,7 @@ export declare const DOMAIN_SCHEMAS: {
9929
9929
  name: string;
9930
9930
  notes?: string | undefined;
9931
9931
  models?: string[] | undefined;
9932
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9932
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9933
9933
  model: string;
9934
9934
  } | {
9935
9935
  select: {
@@ -9947,7 +9947,7 @@ export declare const DOMAIN_SCHEMAS: {
9947
9947
  name: string;
9948
9948
  models: string[];
9949
9949
  notes?: string | undefined;
9950
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9950
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9951
9951
  model: string;
9952
9952
  } | {
9953
9953
  select: {
@@ -9965,7 +9965,7 @@ export declare const DOMAIN_SCHEMAS: {
9965
9965
  name: string;
9966
9966
  notes?: string | undefined;
9967
9967
  models?: string[] | undefined;
9968
- roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier", {
9968
+ roles?: Partial<Record<"default" | "summarize" | "subagent" | "team" | "synthesize" | "verifier" | "classifier" | "consolidate", {
9969
9969
  model: string;
9970
9970
  } | {
9971
9971
  select: {
package/dist/types.js CHANGED
@@ -368,9 +368,16 @@ export const ModelEntry = z.object({
368
368
  });
369
369
  // `verifier` (2026-06-11, SERVICE-RESPONSE-…-PHASE2): real consumer = core's verification gate
370
370
  // (runWithVerification/resumeWithVerification resolve the verifier sub-task model via this role). Fallback
371
- // semantics per core: a roster that doesn't set `verifier` uses `default`. core also has `advisor` (teacher
372
- // mode) — deliberately NOT added: Service AI evaluated teacher mode and won't consume it (no consumer, no key).
373
- export const ModelRole = z.enum(["default", "summarize", "subagent", "team", "synthesize", "verifier"]);
371
+ // semantics per core: a roster that doesn't set `verifier` uses `default`.
372
+ // 1.8.0(消费方壳侧真案):对齐 core `ModelRole`(9 词)里**有真消费方**的两个缺席角色 ——
373
+ // `classifier` = auto 模式权限分类器(core FALLBACK classifier→summarize→default;tier 缺省 flash);此前 settings
374
+ // 写 `roles.classifier` 被本闭集拒,用户想单独钉分类器模型只能连带 summarize。
375
+ // `consolidate` = 记忆整理(core FALLBACK consolidate→summarize)。
376
+ // 两个词都**不进** roster 标记族(resolve-roster.ts):显式归 cheap 会让 server 把它钉死到 cheapRef,盖掉用户
377
+ // `models.tiers.flash` 的档位与 core 兜底链 —— 新角色「不派生、走 core 兜底、只由 settings 显式钉」。
378
+ // `advisor`(teacher mode)仍 deliberately NOT added: no consumer, no key —— 谁消费谁来加。
379
+ // 子集关系由消费方服务端的型面对账钉(编译期 `satisfies`)钉住(本仓不依赖 core)。
380
+ export const ModelRole = z.enum(["default", "summarize", "subagent", "team", "synthesize", "verifier", "classifier", "consolidate"]);
374
381
  /** A role resolves either to a model NAME, or by capability/price (core 1.25 `{ select }`). */
375
382
  export const RoleTarget = z.union([
376
383
  z.object({ model: z.string().min(1) }),
@@ -474,7 +481,7 @@ export const RosterEntry = z.object({
474
481
  /**
475
482
  * 主模型角色标记(0.6.3, E3)——catalog model NAME。worker.model 废除后 service 从 roster
476
483
  * 解析 boot 主模型的归宿位:解析语义(resolve-roster)= primary 喂 `default`/`team`/`synthesize` 三角色、
477
- * cheap 喂 `subagent`/`summarize`(service 现有 ModelRoles 口径;`verifier` 不派生——unset→default 兜底链)。
484
+ * cheap 喂 `subagent`/`summarize`(service 现有 ModelRoles 口径;`verifier`/`classifier`/`consolidate` 不派生——unset 走 core 兜底链)。
478
485
  * 显式 `roles` **逐角色**优先于标记派生;标记优先于全局 models.roles。additive:不设=行为与 0.6.2 全等。
479
486
  */
480
487
  primaryModel: z.string().min(1).optional(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/settings-schema",
3
- "version": "1.7.2",
3
+ "version": "1.8.0",
4
4
  "description": "Sema settings schema — pure config contract (zod domains + effective-config + roster resolution + ref-integrity + remoteExec) shared by sema-registry, sema-server, and the TOC desktop/CLI. One source of truth. (Renamed at 1.0.0 from @sema-agent/registry-core — name and docs only, no behavior change; note the range moves 0.19.0 -> 1.0.0, so a dependency must become ^1.0.0. The old names @sema-agent/registry-core <=0.19.0 and @sema-ai/registry-core remain published, frozen, for migration.)",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",