由 domain:devx 执行席在复核 #18915(已发布 README 示例编译,PR #18968)时,从施工席的 open_questions 接出。⛔ 未分级。
⚠️ 这是 #18915 执行过程中冒出来的余项,⛔ 不是那张卡的派发问题 —— 按 H52 的处置,⛔ 不把 needs-user-decision 重新挂回 #18915,而是另立本卡并链回去。
冲突,两边都由本席在 PR head a8b75f978 上实读
适配器读 source.options.datasetId(packages/plugins/knowledge-ragflow/src/index.ts):
:60 function extractRagflowOptions(source: KnowledgeSource): RagflowSourceOptions {
:66 `RAGFlow adapter requires source.options.datasetId on source '${source.id}'`,
:108 const { datasetId } = extractRagflowOptions(ctx.source);
而 schema 声明的是 adapterConfig(packages/spec/src/ai/knowledge-source.zod.ts):
:124 export const KnowledgeSourceSchema = lazySchema(() => z.object({
:137 adapterConfig: z.record(z.string(), z.unknown()).default({}).optional(),
⭐ 要害在 z.object 三个字:它没有 .passthrough(),所以任何一条真的调用 KnowledgeSourceSchema.parse 的路径,都会把适配器赖以工作的那个 options 键悄悄剥掉。⇒ 今天它之所以能用,是因为没有人在那条路上 parse。
后果之一已经量到:packages/plugins/knowledge-ragflow/README.md 记的是 options,因此编译不过,而它正是 #18915 的 44 个已发布错块里唯一没被修的那一个 —— 因为把文档改成 adapterConfig 会让它编译通过但停止工作。
为什么必须由人裁,⛔ 执行席不自答
两种收法都是运行时改动,而本卡的来源是一张文档卡。改文档只会二选一地把错误从一处搬到另一处。
|
做什么 |
成本 |
风险 |
| A |
规格为准:改适配器(和 README)读 source.adapterConfig |
一处运行时改动,在 knowledge-ragflow 内;⛔ 不动 spec |
任何已经在写 options 的宿主会坏 —— ⚠️ 但它们本来在任何 parse 路径上就会被剥掉 |
| B |
适配器为准:把 options 声明进 KnowledgeSourceSchema(或按 ADR-0087 做一次 options → adapterConfig 转换) |
改 spec,外加它带动的生成物 |
把一个「只因为没人 parse 才没出事」的拼写正式册封 |
| C |
两边都留,什么都不改 |
零 |
⛔ 施工席已按 Prime Directive #10「声明了却不执行」否掉 |
建议 A,退路 B。 理由:adapterConfig 是被声明的那个键;extractRagflowOptions 里那个 cast 正是 Prime Directive #12 禁止的消费侧宽容;而 B 册封的拼写今天能用只是因为无人 parse。
⚠️ 本席的置信缺口,明写:① 本席⛔ 没有测过今天有没有真实宿主在写 options(有的话 A 的迁移成本就不是零);② 本席⛔ 没有测过 KnowledgeSourceSchema.parse 今天到底在哪些路径上被调用 —— 「没人 parse」是读代码形状推出来的,不是量出来的。⛔ 这两项该在裁决前补测,不该由建议代替。
去重
REST /search/issues 对本席回 403,改用全量枚举:2026-09-18T08:57Z 枚举全部 open 非 PR issue 523 条。adapterConfig / datasetId / KnowledgeSourceSchema / extractRagflowOptions 各 0 命中;ragflow 5 条(#10572 #8249 #7849 #4606 #4311)—— 逐条读过标题,都是包清单里顺带提到,非本卡。同总体阳性对照:README 13 条、driver-memory 20 条 ⇒ 读法有反应,这些零不是空读。
去重词:knowledge source options adapterConfig · ragflow datasetId undeclared key · KnowledgeSourceSchema strips unknown keys · adapter config spelling drift
os-decision-facets
- ① 项目长远合理性 —— 一个已发布适配器读的键,和它所属 schema 声明的键不是同一个,而 schema 会剥掉前者。这不是命名口味:它意味着协议面上有一处今天靠「没人执行」维持的默契。
- ② 实际业务拉动 —— 直接受害者已量到一个:
knowledge-ragflow 的已发布 README 记着一个类型系统拒绝的键,照抄即错。⚠️ 有多少宿主在写 options,本席未测。
- ③ 防 AI 犯错 —— 决定性。一个 agent 读已发布 README 照抄
options,类型检查会拒绝它;若它转而"修正"成 adapterConfig,运行时会静默不工作。⇒ 两条路都把它送进坑里,而且第二条没有任何声音。
- ④ 创业阶段不扩散 —— A 是一处包内运行时改动、不动 spec;B 要改 spec 并带动生成物。⛔ 两者都超出文档卡的面,所以本卡只呈报,不执行。
Prior rulings read: objectstack,knowledge-ragflow,reads,source,options,datasetid,knowledgesourceschema,declares,adapterconfig,strips,unknown,keys (+2 more) → 135 hits; ADR-0021 D1, ADR-0056 D5, ADR-0068 D1, ADR-0076 D1, ADR-0076 D10, ADR-0087 D1, ADR-0087 D5, ADR-0090 D6 —— ⚠️ 八条都读过。最近的是 ADR-0087(metadata-protocol-upgrade-contract,Accepted;D1「Enforce the protocol handshake, with machine-readable refusal」、D5「The consumer's verify loop is the acceptance test」),它提供 B 所需的转换机制,但⛔ 没有裁过哪个拼写是契约。其余几条命中的是 source / options / keys 这类通用词,主题分别是分析维度、权限落地校验、元数据面,均不裁本问。⇒ 本卡是决策,⛔ 不是执行。
读数时刻 2026-09-18T08:58Z
Generated by Claude Code
由
domain:devx执行席在复核 #18915(已发布 README 示例编译,PR #18968)时,从施工席的open_questions接出。⛔ 未分级。needs-user-decision重新挂回 #18915,而是另立本卡并链回去。冲突,两边都由本席在 PR head
a8b75f978上实读适配器读
source.options.datasetId(packages/plugins/knowledge-ragflow/src/index.ts):而 schema 声明的是
adapterConfig(packages/spec/src/ai/knowledge-source.zod.ts):⭐ 要害在
z.object三个字:它没有.passthrough(),所以任何一条真的调用KnowledgeSourceSchema.parse的路径,都会把适配器赖以工作的那个options键悄悄剥掉。⇒ 今天它之所以能用,是因为没有人在那条路上 parse。后果之一已经量到:
packages/plugins/knowledge-ragflow/README.md记的是options,因此编译不过,而它正是 #18915 的 44 个已发布错块里唯一没被修的那一个 —— 因为把文档改成adapterConfig会让它编译通过但停止工作。为什么必须由人裁,⛔ 执行席不自答
两种收法都是运行时改动,而本卡的来源是一张文档卡。改文档只会二选一地把错误从一处搬到另一处。
source.adapterConfigknowledge-ragflow内;⛔ 不动 specoptions的宿主会坏 ——options声明进KnowledgeSourceSchema(或按 ADR-0087 做一次options→adapterConfig转换)建议 A,退路 B。 理由:
adapterConfig是被声明的那个键;extractRagflowOptions里那个 cast 正是 Prime Directive #12 禁止的消费侧宽容;而 B 册封的拼写今天能用只是因为无人 parse。options(有的话 A 的迁移成本就不是零);② 本席⛔ 没有测过KnowledgeSourceSchema.parse今天到底在哪些路径上被调用 —— 「没人 parse」是读代码形状推出来的,不是量出来的。⛔ 这两项该在裁决前补测,不该由建议代替。去重
REST
/search/issues对本席回 403,改用全量枚举:2026-09-18T08:57Z 枚举全部 open 非 PR issue 523 条。adapterConfig/datasetId/KnowledgeSourceSchema/extractRagflowOptions各 0 命中;ragflow5 条(#10572 #8249 #7849 #4606 #4311)—— 逐条读过标题,都是包清单里顺带提到,非本卡。同总体阳性对照:README13 条、driver-memory20 条 ⇒ 读法有反应,这些零不是空读。去重词:knowledge source options adapterConfig · ragflow datasetId undeclared key · KnowledgeSourceSchema strips unknown keys · adapter config spelling drift
os-decision-facets
knowledge-ragflow的已发布 README 记着一个类型系统拒绝的键,照抄即错。options,本席未测。options,类型检查会拒绝它;若它转而"修正"成adapterConfig,运行时会静默不工作。⇒ 两条路都把它送进坑里,而且第二条没有任何声音。Prior rulings read: objectstack,knowledge-ragflow,reads,source,options,datasetid,knowledgesourceschema,declares,adapterconfig,strips,unknown,keys (+2 more) → 135 hits; ADR-0021 D1, ADR-0056 D5, ADR-0068 D1, ADR-0076 D1, ADR-0076 D10, ADR-0087 D1, ADR-0087 D5, ADR-0090 D6 ——⚠️ 八条都读过。最近的是 ADR-0087(metadata-protocol-upgrade-contract,Accepted;D1「Enforce the protocol handshake, with machine-readable refusal」、D5「The consumer's verify loop is the acceptance test」),它提供 B 所需的转换机制,但⛔ 没有裁过哪个拼写是契约。其余几条命中的是
source/options/keys这类通用词,主题分别是分析维度、权限落地校验、元数据面,均不裁本问。⇒ 本卡是决策,⛔ 不是执行。读数时刻 2026-09-18T08:58Z
Generated by Claude Code