From a220bf394fce2bc455a62950d0d0bbae9ca0a66d Mon Sep 17 00:00:00 2001 From: Jyong Date: Tue, 11 Aug 2026 11:51:08 -0400 Subject: [PATCH] docs(test): record KnowledgeFS workflow v2 coverage Document the executed Workflow Knowledge Retrieval v2 matrix, Linear issue mapping, fix verification, remaining environment blockers, and reusable DSL fixtures. --- .../knowledge-fs-detailed-test-cases.md | 567 +++++++++--------- .../knowledge-fs-functional-test-report.md | 180 +++--- ...dge-retrieval-v2-functional-test-report.md | 223 +++++++ .../test-data/kf-wf-v2-live-ceshi.yml | 75 +++ .../test-data/kf-wf-v2-unresolved-space.yml | 74 +++ 5 files changed, 769 insertions(+), 350 deletions(-) create mode 100644 test-results/knowledge-fs/2026-08-11/knowledge-retrieval-v2-functional-test-report.md create mode 100644 test-results/knowledge-fs/2026-08-11/test-data/kf-wf-v2-live-ceshi.yml create mode 100644 test-results/knowledge-fs/2026-08-11/test-data/kf-wf-v2-unresolved-space.yml diff --git a/test-results/knowledge-fs/2026-08-11/knowledge-fs-detailed-test-cases.md b/test-results/knowledge-fs/2026-08-11/knowledge-fs-detailed-test-cases.md index f2c9f3ceb9b..a97ab1fafe6 100644 --- a/test-results/knowledge-fs/2026-08-11/knowledge-fs-detailed-test-cases.md +++ b/test-results/knowledge-fs/2026-08-11/knowledge-fs-detailed-test-cases.md @@ -1,5 +1,7 @@ # KnowledgeFS 详细功能测试用例 +Workflow `knowledge-retrieval-v2` 的 39 个已执行场景、15 个环境阻塞项、3 个规格/实现阻塞项及完整证据见:[Workflow Knowledge Retrieval v2 / KnowledgeFS 功能补测报告](./knowledge-retrieval-v2-functional-test-report.md)。 + ## 使用说明 ### 通用前置条件 @@ -29,317 +31,336 @@ ## A. 入口、路由与导航 -| ID | P | 测试场景/步骤 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-NAV-001 | P0 | 直接访问 `/datasets?view=new` | 进入新版 Knowledge 列表,New 按钮为 pressed | PASS | -| TC-NAV-002 | P0 | 在列表点击“旧版”,再切回“新版” | 路由、选中状态和列表内容同步;新版恢复 `view=new` | PASS | -| TC-NAV-003 | P0 | 在概览/Sources/Documents/Retrieval/Quality/Settings 刷新 | 深链可独立恢复,不回到列表或旧版 | PASS | -| TC-NAV-004 | P0 | 打开合法 space ID 的深链 | 左侧导航、名称、模式和页面内容加载正常 | PASS | -| TC-NAV-005 | P0 | 打开不存在的 UUID 空间 | 显示本地化的不存在/无权页,不泄露后端信息 | FAIL,见 KF-BUG-004 | -| TC-NAV-006 | P1 | 点击“欢迎使用新版知识库”,关闭后再进入 | 引导弹层可关闭,不阻断页面操作 | PASS | -| TC-NAV-007 | P1 | 左侧导航折叠/展开后逐项访问 | 每个链接路由正确,焦点与选中项一致 | PARTIAL,路由已验证 | -| TC-NAV-008 | P1 | 390×844 视口访问所有二级导航 | 所有页签有明确滚动/折叠可达性,不遮挡内容 | FAIL-CANDIDATE,见 KF-BUG-012 | -| TC-NAV-009 | P1 | 使用 Tab/Shift+Tab/Enter/Escape 访问页签、菜单、抽屉和对话框 | 键盘可完成主流程,焦点不丢失 | NOT-RUN | -| TC-NAV-010 | P1 | 用无 new-rag feature flag 的 workspace 访问 | 不显示新版入口或给出明确说明 | NOT-RUN | +| ID | P | 测试场景/步骤 | 预期结果 | 本轮结果 | +| ---------- | --- | ------------------------------------------------------------ | ------------------------------------------------- | ----------------------------- | +| TC-NAV-001 | P0 | 直接访问 `/datasets?view=new` | 进入新版 Knowledge 列表,New 按钮为 pressed | PASS | +| TC-NAV-002 | P0 | 在列表点击“旧版”,再切回“新版” | 路由、选中状态和列表内容同步;新版恢复 `view=new` | PASS | +| TC-NAV-003 | P0 | 在概览/Sources/Documents/Retrieval/Quality/Settings 刷新 | 深链可独立恢复,不回到列表或旧版 | PASS | +| TC-NAV-004 | P0 | 打开合法 space ID 的深链 | 左侧导航、名称、模式和页面内容加载正常 | PASS | +| TC-NAV-005 | P0 | 打开不存在的 UUID 空间 | 显示本地化的不存在/无权页,不泄露后端信息 | FAIL,见 KF-BUG-004 | +| TC-NAV-006 | P1 | 点击“欢迎使用新版知识库”,关闭后再进入 | 引导弹层可关闭,不阻断页面操作 | PASS | +| TC-NAV-007 | P1 | 左侧导航折叠/展开后逐项访问 | 每个链接路由正确,焦点与选中项一致 | PARTIAL,路由已验证 | +| TC-NAV-008 | P1 | 390×844 视口访问所有二级导航 | 所有页签有明确滚动/折叠可达性,不遮挡内容 | FAIL-CANDIDATE,见 KF-BUG-012 | +| TC-NAV-009 | P1 | 使用 Tab/Shift+Tab/Enter/Escape 访问页签、菜单、抽屉和对话框 | 键盘可完成主流程,焦点不丢失 | NOT-RUN | +| TC-NAV-010 | P1 | 用无 new-rag feature flag 的 workspace 访问 | 不显示新版入口或给出明确说明 | NOT-RUN | ## B. 列表、搜索和筛选 -| ID | P | 测试场景/步骤 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-LI-001 | P0 | 加载有数据的新版列表 | 每张卡显示名称、描述、文档/应用计数、更新时间 | PASS | -| TC-LI-002 | P0 | 输入名称子串 `ces` | 只显示 `ceshi` | PASS | -| TC-LI-003 | P0 | 输入大写 `CESHI` | 搜索大小写不敏感,显示 `ceshi` | PASS | -| TC-LI-004 | P1 | 输入不存在的唯一字符串 | 显示“无搜索结果”及清除条件入口 | FAIL,见 KF-BUG-011 | -| TC-LI-005 | P1 | 清空搜索框 | 恢复全部列表 | PASS | -| TC-LI-006 | P1 | 打开“创建者”下拉 | 显示成员搜索、列表和重置入口 | PASS | -| TC-LI-007 | P1 | 搜索不存在的创建者 | 显示“没有找到创建者” | PASS | -| TC-LI-008 | P1 | 选中当前创建者 | 条件显示“创建者: 1”,结果与成员匹配 | PASS | -| TC-LI-009 | P1 | 重置创建者筛选 | 标签和列表恢复 | PASS | -| TC-LI-010 | P1 | 创建新空间后回列表 | 新空间出现在列表前部,描述和计数正确 | PASS | -| TC-LI-011 | P1 | 点击“标签” | 如后端未提供则给出明确不可用提示 | PASS,提示 KnowledgeFS 待提供 metadata | -| TC-LI-012 | P1 | 点击“外部知识库 API” | 打开管理抽屉,无凭据泄露 | PASS | -| TC-LI-013 | P1 | 点击“服务 API” | 显示 endpoint 和 key 管理入口 | PASS | -| TC-LI-014 | P1 | 超过一页数据时搜索只在末页出现的名称 | 搜索全数据集,不只过滤已加载卡片 | STATIC-RISK,数据不足未实证 | -| TC-LI-015 | P2 | 连续快速改变搜索和创建者条件 | 旧请求不覆盖新请求,无闪回 | NOT-RUN | +| ID | P | 测试场景/步骤 | 预期结果 | 本轮结果 | +| --------- | --- | ------------------------------------ | --------------------------------------------- | -------------------------------------- | +| TC-LI-001 | P0 | 加载有数据的新版列表 | 每张卡显示名称、描述、文档/应用计数、更新时间 | PASS | +| TC-LI-002 | P0 | 输入名称子串 `ces` | 只显示 `ceshi` | PASS | +| TC-LI-003 | P0 | 输入大写 `CESHI` | 搜索大小写不敏感,显示 `ceshi` | PASS | +| TC-LI-004 | P1 | 输入不存在的唯一字符串 | 显示“无搜索结果”及清除条件入口 | FAIL,见 KF-BUG-011 | +| TC-LI-005 | P1 | 清空搜索框 | 恢复全部列表 | PASS | +| TC-LI-006 | P1 | 打开“创建者”下拉 | 显示成员搜索、列表和重置入口 | PASS | +| TC-LI-007 | P1 | 搜索不存在的创建者 | 显示“没有找到创建者” | PASS | +| TC-LI-008 | P1 | 选中当前创建者 | 条件显示“创建者: 1”,结果与成员匹配 | PASS | +| TC-LI-009 | P1 | 重置创建者筛选 | 标签和列表恢复 | PASS | +| TC-LI-010 | P1 | 创建新空间后回列表 | 新空间出现在列表前部,描述和计数正确 | PASS | +| TC-LI-011 | P1 | 点击“标签” | 如后端未提供则给出明确不可用提示 | PASS,提示 KnowledgeFS 待提供 metadata | +| TC-LI-012 | P1 | 点击“外部知识库 API” | 打开管理抽屉,无凭据泄露 | PASS | +| TC-LI-013 | P1 | 点击“服务 API” | 显示 endpoint 和 key 管理入口 | PASS | +| TC-LI-014 | P1 | 超过一页数据时搜索只在末页出现的名称 | 搜索全数据集,不只过滤已加载卡片 | STATIC-RISK,数据不足未实证 | +| TC-LI-015 | P2 | 连续快速改变搜索和创建者条件 | 旧请求不覆盖新请求,无闪回 | NOT-RUN | ## C. 创建知识库 -| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-CR-001 | P0 | 点击“创建” | 打开创建对话框,默认从空白开始/only_me | PASS | -| TC-CR-002 | P0 | 名称留空 | 创建按钮禁用或显示必填错误 | PASS | -| TC-CR-003 | P0 | 名称仅空格 | 视为空值,禁止创建 | PASS | -| TC-CR-004 | P0 | 名称 1 字 | 创建成功 | NOT-RUN | -| TC-CR-005 | P0 | 名称精确 40 字 | 允许提交并保存成功 | PASS,在 QA Settings 验证同约束 | -| TC-CR-006 | P0 | 名称 41 字 | 字段级拦截,不请求后端 | FAIL,见 KF-BUG-002 | -| TC-CR-007 | P0 | 描述精确 2000 字 | 允许保存 | PASS,在 QA Settings 实测 | -| TC-CR-008 | P0 | 描述 2001 字 | 字段级拦截,不请求后端 | FAIL,Settings 同约束见 KF-BUG-003 | -| TC-CR-009 | P0 | 从空白开始 + 合法名称 | 只创建 1 个空间,202/provisioning 后进入 active Sources | PASS | -| TC-CR-010 | P0 | 在加载中连续双击“创建知识库” | 幂等,只创建 1 个空间 | NOT-RUN | -| TC-CR-011 | P0 | 提交后制造超时,再点重试 | 通过幂等 key 收敛到同一 space | NOT-RUN | -| TC-CR-012 | P1 | 可见权限选择 only_me | 只有 owner 可见,创建成功 | PASS | -| TC-CR-013 | P1 | 可见权限选择 all_team_members | 所有有效成员可以 viewer 身份查看 | NOT-RUN,缺多用户 | -| TC-CR-014 | P1 | 选择 partial_members 但不选成员 | 显示“至少一名成员”并禁止保存 | PASS,Settings 实测 | -| TC-CR-015 | P1 | 连接数据源方式创建 | 创建空间后进入 provider 配置,取消不留垃圾数据 | NOT-RUN | -| TC-CR-016 | P1 | 上传文件方式创建 | 创建与 staged upload claim 原子收敛,不重复文档 | ENV-BLOCKED,Documents 入口已证实 staging 服务异常,本轮未再创建空间 | -| TC-CR-017 | P1 | 模型配置 pending/fail/retry | 显示可解释状态和重试,不重复创建 | NOT-RUN | -| TC-CR-018 | P1 | 同 slug 不同创建意图/幂等载荷 | 返回可理解 409/4xx,不出现 500 | STATIC-RISK | +| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | +| --------- | --- | ------------------------------- | ------------------------------------------------------- | -------------------------------------------------------------------- | +| TC-CR-001 | P0 | 点击“创建” | 打开创建对话框,默认从空白开始/only_me | PASS | +| TC-CR-002 | P0 | 名称留空 | 创建按钮禁用或显示必填错误 | PASS | +| TC-CR-003 | P0 | 名称仅空格 | 视为空值,禁止创建 | PASS | +| TC-CR-004 | P0 | 名称 1 字 | 创建成功 | NOT-RUN | +| TC-CR-005 | P0 | 名称精确 40 字 | 允许提交并保存成功 | PASS,在 QA Settings 验证同约束 | +| TC-CR-006 | P0 | 名称 41 字 | 字段级拦截,不请求后端 | FAIL,见 KF-BUG-002 | +| TC-CR-007 | P0 | 描述精确 2000 字 | 允许保存 | PASS,在 QA Settings 实测 | +| TC-CR-008 | P0 | 描述 2001 字 | 字段级拦截,不请求后端 | FAIL,Settings 同约束见 KF-BUG-003 | +| TC-CR-009 | P0 | 从空白开始 + 合法名称 | 只创建 1 个空间,202/provisioning 后进入 active Sources | PASS | +| TC-CR-010 | P0 | 在加载中连续双击“创建知识库” | 幂等,只创建 1 个空间 | NOT-RUN | +| TC-CR-011 | P0 | 提交后制造超时,再点重试 | 通过幂等 key 收敛到同一 space | NOT-RUN | +| TC-CR-012 | P1 | 可见权限选择 only_me | 只有 owner 可见,创建成功 | PASS | +| TC-CR-013 | P1 | 可见权限选择 all_team_members | 所有有效成员可以 viewer 身份查看 | NOT-RUN,缺多用户 | +| TC-CR-014 | P1 | 选择 partial_members 但不选成员 | 显示“至少一名成员”并禁止保存 | PASS,Settings 实测 | +| TC-CR-015 | P1 | 连接数据源方式创建 | 创建空间后进入 provider 配置,取消不留垃圾数据 | NOT-RUN | +| TC-CR-016 | P1 | 上传文件方式创建 | 创建与 staged upload claim 原子收敛,不重复文档 | ENV-BLOCKED,Documents 入口已证实 staging 服务异常,本轮未再创建空间 | +| TC-CR-017 | P1 | 模型配置 pending/fail/retry | 显示可解释状态和重试,不重复创建 | NOT-RUN | +| TC-CR-018 | P1 | 同 slug 不同创建意图/幂等载荷 | 返回可理解 409/4xx,不出现 500 | STATIC-RISK | ## D. 数据源与网站抓取 -| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-SO-001 | P0 | 空间打开 Sources | 显示空状态、常用 provider 和“添加数据源” | PASS | -| TC-SO-002 | P0 | 打开添加数据源 | 显示 Website/Online Documents/Online Drive 三类 | PASS | -| TC-SO-003 | P0 | 检查 provider 清单 | Firecrawl/Jina/WaterCrawl、Notion/Google Docs/Confluence、Drive/OneDrive/S3 入口正确 | PASS | -| TC-SO-004 | P0 | Website 根 URL 输入 `not-a-url` | 提示必须为 http(s),抓取按钮禁用 | PASS | -| TC-SO-005 | P0 | Website 根 URL 输入 `https://example.com` | URL 校验通过,名称有效后可抓取 | PASS | -| TC-SO-006 | P0 | 最大页数输入 0 | 提示最小为 1,禁止抓取 | FAIL,可见 0/实际 1 | -| TC-SO-007 | P0 | 最大页数输入 1 | 允许抓取 1 页 | PASS | -| TC-SO-008 | P0 | 最大页数输入 1.5 | 提示只能是整数,禁止抓取 | FAIL,可见 1.5/实际 1 | -| TC-SO-009 | P0 | 最大页数输入 200 | 允许 | PASS | -| TC-SO-010 | P0 | 最大页数输入 1001 | 提示最大 200,禁止抓取 | FAIL,可见 1001/实际 200 | -| TC-SO-011 | P0 | Firecrawl 连接状态 | 显示已连接时才允许预览 | PASS | -| TC-SO-012 | P0 | Firecrawl 对 example.com 抓取预览 | 在可接受时间内返回页列表或明确失败 | ENV,36+ 秒仍 0 页 | -| TC-SO-013 | P0 | 抓取进行中点击 Stop | 进入 stopping,最终 stopped,表单可再操作 | PASS | -| TC-SO-014 | P0 | stopped 后点 Retry | 仅新建 1 个后续工作流,进度重置 | NOT-RUN,只检查入口 | -| TC-SO-015 | P0 | 抓取返回页面后全选/反选/单选 | 选中数量、最多 200 和添加按钮状态正确 | ENV | -| TC-SO-016 | P0 | 选择页面后“添加数据源” | 创建 source,文档进入解析/索引,不留临时 workflow | ENV | -| TC-SO-017 | P1 | 有草稿时点击取消/离开 | 弹出“放弃数据源更改”确认 | PASS | -| TC-SO-018 | P1 | 在确认对话框点“取消” | 草稿保留,返回配置页 | PASS | -| TC-SO-019 | P1 | 在确认对话框点“放弃草稿” | 临时配置/预览被清理,列表无 source | PENDING-CONFIRM | -| TC-SO-020 | P1 | 选 Jina Reader | 未安装时明确显示安装入口 | PASS,环境显示未安装 | -| TC-SO-021 | P1 | 选 WaterCrawl 并验证凭据 | 未安装/未配置时给出可操作的状态 | NOT-RUN | -| TC-SO-022 | P1 | 同时提供 connectionId 和 credentials | 请求被 422 拒绝,不创建 source | NOT-RUN | -| TC-SO-023 | P1 | Source PATCH 为空 payload | 拒绝无效操作,无 revision 变化 | NOT-RUN | -| TC-SO-024 | P1 | sync policy custom interval = 3599/3600/2592000/2592001 | 只允许 3600–2592000 秒 | NOT-RUN | -| TC-SO-025 | P1 | manual mode 同时提交 customInterval | 拒绝矛盾组合,不静默保留无效值 | STATIC-RISK | -| TC-SO-026 | P1 | stale expectedRevision/sourceVersion 保存数据源 | 返回 409,UI 提示刷新后重试 | NOT-RUN | -| TC-SO-027 | P1 | 删除 source 选 `documents=keep` | source 删除,文档和检索仍可用 | PENDING-CONFIRM | -| TC-SO-028 | P1 | 删除 source 选 `documents=cascade` | source 和所属文档按 durable job 完成清理 | PENDING-CONFIRM | +| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | +| --------- | --- | ------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------ | +| TC-SO-001 | P0 | 空间打开 Sources | 显示空状态、常用 provider 和“添加数据源” | PASS | +| TC-SO-002 | P0 | 打开添加数据源 | 显示 Website/Online Documents/Online Drive 三类 | PASS | +| TC-SO-003 | P0 | 检查 provider 清单 | Firecrawl/Jina/WaterCrawl、Notion/Google Docs/Confluence、Drive/OneDrive/S3 入口正确 | PASS | +| TC-SO-004 | P0 | Website 根 URL 输入 `not-a-url` | 提示必须为 http(s),抓取按钮禁用 | PASS | +| TC-SO-005 | P0 | Website 根 URL 输入 `https://example.com` | URL 校验通过,名称有效后可抓取 | PASS | +| TC-SO-006 | P0 | 最大页数输入 0 | 提示最小为 1,禁止抓取 | FAIL,可见 0/实际 1 | +| TC-SO-007 | P0 | 最大页数输入 1 | 允许抓取 1 页 | PASS | +| TC-SO-008 | P0 | 最大页数输入 1.5 | 提示只能是整数,禁止抓取 | FAIL,可见 1.5/实际 1 | +| TC-SO-009 | P0 | 最大页数输入 200 | 允许 | PASS | +| TC-SO-010 | P0 | 最大页数输入 1001 | 提示最大 200,禁止抓取 | FAIL,可见 1001/实际 200 | +| TC-SO-011 | P0 | Firecrawl 连接状态 | 显示已连接时才允许预览 | PASS | +| TC-SO-012 | P0 | Firecrawl 对 example.com 抓取预览 | 在可接受时间内返回页列表或明确失败 | ENV,36+ 秒仍 0 页 | +| TC-SO-013 | P0 | 抓取进行中点击 Stop | 进入 stopping,最终 stopped,表单可再操作 | PASS | +| TC-SO-014 | P0 | stopped 后点 Retry | 仅新建 1 个后续工作流,进度重置 | NOT-RUN,只检查入口 | +| TC-SO-015 | P0 | 抓取返回页面后全选/反选/单选 | 选中数量、最多 200 和添加按钮状态正确 | ENV | +| TC-SO-016 | P0 | 选择页面后“添加数据源” | 创建 source,文档进入解析/索引,不留临时 workflow | ENV | +| TC-SO-017 | P1 | 有草稿时点击取消/离开 | 弹出“放弃数据源更改”确认 | PASS | +| TC-SO-018 | P1 | 在确认对话框点“取消” | 草稿保留,返回配置页 | PASS | +| TC-SO-019 | P1 | 在确认对话框点“放弃草稿” | 临时配置/预览被清理,列表无 source | PENDING-CONFIRM | +| TC-SO-020 | P1 | 选 Jina Reader | 未安装时明确显示安装入口 | PASS,环境显示未安装 | +| TC-SO-021 | P1 | 选 WaterCrawl 并验证凭据 | 未安装/未配置时给出可操作的状态 | NOT-RUN | +| TC-SO-022 | P1 | 同时提供 connectionId 和 credentials | 请求被 422 拒绝,不创建 source | NOT-RUN | +| TC-SO-023 | P1 | Source PATCH 为空 payload | 拒绝无效操作,无 revision 变化 | NOT-RUN | +| TC-SO-024 | P1 | sync policy custom interval = 3599/3600/2592000/2592001 | 只允许 3600–2592000 秒 | NOT-RUN | +| TC-SO-025 | P1 | manual mode 同时提交 customInterval | 拒绝矛盾组合,不静默保留无效值 | STATIC-RISK | +| TC-SO-026 | P1 | stale expectedRevision/sourceVersion 保存数据源 | 返回 409,UI 提示刷新后重试 | NOT-RUN | +| TC-SO-027 | P1 | 删除 source 选 `documents=keep` | source 删除,文档和检索仍可用 | PENDING-CONFIRM | +| TC-SO-028 | P1 | 删除 source 选 `documents=cascade` | source 和所属文档按 durable job 完成清理 | PENDING-CONFIRM | ## E. 文档上传、列表与任务 -| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-DO-001 | P0 | 空知识库打开 Documents | 显示“暂无文档”和上传入口 | PASS | -| TC-DO-002 | P0 | 点击“添加文档” | 打开上传表单,显示支持格式和 15 MB 限制 | PASS | -| TC-DO-003 | P0 | 上传 TXT/MD/CSV/JSONL/HTML/PDF/DOCX/XLSX 小文件 | staged upload 成功,claim 一次,文档进入 processing→ready | FAIL,3 个合法 TXT/MD 均显示 `Internal Server Error`,0 文档 | -| TC-DO-004 | P0 | 上传 Unicode 文件名和中文内容 | 文件名、内容、分块和下载名不乱码 | FAIL-BLOCKED,中文文件名本地显示正常,但 staging 500,无法验证解析 | -| TC-DO-005 | P0 | 上传空文件 | 返回 422,UI 明确说明空文件,无空文档 | FAIL,0 B 被计为有效并启用提交,后端 422 仅显示英文通用错误 | -| TC-DO-006 | P0 | 上传不支持 `.exe` | 客户端或服务端拒绝,无 staged upload 残留 | PASS,本地显示“不支持或无效的文件类型”,0/1 有效且提交禁用 | -| TC-DO-007 | P0 | 上传精确 15 MiB 文件 | 根据合同允许边界值,不会 413 | PARTIAL/FAIL,前端正确接收,但 43+ 秒停留“正在上传…”;取消后无文档 | -| TC-DO-008 | P0 | 上传 15 MiB + 1 byte | 返回 413,UI 提示超限,无计费/索引任务 | PASS,本地标记“超过 15 MB 限制”,0/1 有效且未 staging | -| TC-DO-009 | P0 | 同时上传合法、空、超限和不支持文件 | 每个文件独立结果,部分失败不丢成功项,可重试失败项 | PARTIAL/FAIL,合法文件逐个报错并另有汇总错误;未能进入 claim 部分成功 | -| TC-DO-010 | P0 | 对同一 staged upload 网络重试 | 同 upload ID 仅被 claim 一次,无重复文档 | ENV-BLOCKED,staging 未成功返回 upload ID | -| TC-DO-011 | P0 | claim 前 abort staged upload | 上传被废弃,不可再 claim | PARTIAL,取消 15 MiB in-flight 上传后表单关闭且 0 文档,但请求随后仍弹失败提示 | -| TC-DO-012 | P0 | claim 后再 abort | 拒绝废弃,已创建文档状态不被破坏 | ENV-BLOCKED,无可 claim 的 upload ID | -| TC-DO-013 | P0 | 不同用户或不同 space 试图 claim upload | 统一返回无权/不存在,不能跨用户移动文件 | NOT-RUN | -| TC-DO-014 | P1 | 上传同内容不同文件名 | 产品按规则创建两个 logical document 或明确去重,不静默丢失 | ENV-BLOCKED,两个文件均 staging 500,未创建 logical document | -| TC-DO-015 | P0 | 现有文档列表加载 | 显示名称、来源、状态、修订、更新时间 | PASS,7 条 | -| TC-DO-016 | P0 | 状态筛选 Ready | 只显示 ready 文档 | PASS,4 条 | -| TC-DO-017 | P0 | 状态筛选 Failed | 只显示 failed 文档 | PASS,3 条 | -| TC-DO-018 | P1 | 文档名大小写不敏感搜索 | 返回匹配项,清空后恢复 | PASS | -| TC-DO-019 | P1 | 搜索无匹配 | 显示明确无结果空状态 | PASS | -| TC-DO-020 | P0 | 打开 Tasks 抽屉 | 显示需关注/失败任务、原因和可用操作 | PASS,5 条失败/中断 | -| TC-DO-021 | P0 | 对失败任务点 Retry | 只创建一个 retry attempt,状态可跟踪 | PENDING-CONFIRM,不重试既有业务文档 | -| TC-DO-022 | P1 | 对进行中任务 Cancel | 任务进入 canceling/canceled,无半索引残留 | PENDING-CONFIRM | -| TC-DO-023 | P1 | 任务 SSE 断网再连 | 续接或 polling 收敛,不倒退、不重复任务 | NOT-RUN | -| TC-DO-024 | P1 | 打开 Metadata schema 对话框 | 显示现有 schema;能力未开放时按钮禁用且有说明 | PASS,Add Metadata 禁用 | -| TC-DO-025 | P1 | 勾选一个文档 | 显示批量操作条和正确选中计数 | PASS | -| TC-DO-026 | P1 | 选中文档后查看 Reindex/Download/Delete 状态 | 按权限和实现能力准确启用/禁用 | PASS,Reindex 可用,Download/Delete 禁用 | -| TC-DO-027 | P0 | 批量 Reindex 选择 1/1000/1001 文档 | 只允许 1–1000;单一 durable job,不重复 | PENDING-CONFIRM | -| TC-DO-028 | P0 | Reindex payload 同时包含 `all=true` 和 documentIds | 返回 422,不运行任务 | NOT-RUN | -| TC-DO-029 | P0 | 批量删除含存在/不存在 ID | 事件结果可追踪,幂等重放不多删 | PENDING-CONFIRM | -| TC-DO-030 | P1 | 行菜单打开 | 根据状态显示 rename/reindex/disable/archive/download/delete | PASS | -| TC-DO-031 | P1 | Rename 留空 | 保存禁用或字段必填 | PASS | -| TC-DO-032 | P1 | Rename 输入 304 字 | 按后端合同限制,超限时前端拦截 | FAIL-CANDIDATE,保存仍可用,未提交 | -| TC-DO-033 | P1 | Ready/Failed/Processing 文档的禁用、归档、下载按钮 | 按状态机正确启用,禁用项有解释 | PARTIAL,已检查当前状态 | -| TC-DO-034 | P1 | 两标签页并发 metadata PATCH,使用 stale rowVersion | 第二个返回 409,UI 刷新后可重试 | NOT-RUN | -| TC-DO-035 | P0 | 删除文档时重复使用同 Idempotency-Key/不同 payload | 同 payload 重放同结果,不同 payload 返回冲突 | PENDING-CONFIRM | +| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | +| --------- | --- | -------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------ | +| TC-DO-001 | P0 | 空知识库打开 Documents | 显示“暂无文档”和上传入口 | PASS | +| TC-DO-002 | P0 | 点击“添加文档” | 打开上传表单,显示支持格式和 15 MB 限制 | PASS | +| TC-DO-003 | P0 | 上传 TXT/MD/CSV/JSONL/HTML/PDF/DOCX/XLSX 小文件 | staged upload 成功,claim 一次,文档进入 processing→ready | FAIL,3 个合法 TXT/MD 均显示 `Internal Server Error`,0 文档 | +| TC-DO-004 | P0 | 上传 Unicode 文件名和中文内容 | 文件名、内容、分块和下载名不乱码 | FAIL-BLOCKED,中文文件名本地显示正常,但 staging 500,无法验证解析 | +| TC-DO-005 | P0 | 上传空文件 | 返回 422,UI 明确说明空文件,无空文档 | FAIL,0 B 被计为有效并启用提交,后端 422 仅显示英文通用错误 | +| TC-DO-006 | P0 | 上传不支持 `.exe` | 客户端或服务端拒绝,无 staged upload 残留 | PASS,本地显示“不支持或无效的文件类型”,0/1 有效且提交禁用 | +| TC-DO-007 | P0 | 上传精确 15 MiB 文件 | 根据合同允许边界值,不会 413 | PARTIAL/FAIL,前端正确接收,但 43+ 秒停留“正在上传…”;取消后无文档 | +| TC-DO-008 | P0 | 上传 15 MiB + 1 byte | 返回 413,UI 提示超限,无计费/索引任务 | PASS,本地标记“超过 15 MB 限制”,0/1 有效且未 staging | +| TC-DO-009 | P0 | 同时上传合法、空、超限和不支持文件 | 每个文件独立结果,部分失败不丢成功项,可重试失败项 | PARTIAL/FAIL,合法文件逐个报错并另有汇总错误;未能进入 claim 部分成功 | +| TC-DO-010 | P0 | 对同一 staged upload 网络重试 | 同 upload ID 仅被 claim 一次,无重复文档 | ENV-BLOCKED,staging 未成功返回 upload ID | +| TC-DO-011 | P0 | claim 前 abort staged upload | 上传被废弃,不可再 claim | PARTIAL,取消 15 MiB in-flight 上传后表单关闭且 0 文档,但请求随后仍弹失败提示 | +| TC-DO-012 | P0 | claim 后再 abort | 拒绝废弃,已创建文档状态不被破坏 | ENV-BLOCKED,无可 claim 的 upload ID | +| TC-DO-013 | P0 | 不同用户或不同 space 试图 claim upload | 统一返回无权/不存在,不能跨用户移动文件 | NOT-RUN | +| TC-DO-014 | P1 | 上传同内容不同文件名 | 产品按规则创建两个 logical document 或明确去重,不静默丢失 | ENV-BLOCKED,两个文件均 staging 500,未创建 logical document | +| TC-DO-015 | P0 | 现有文档列表加载 | 显示名称、来源、状态、修订、更新时间 | PASS,7 条 | +| TC-DO-016 | P0 | 状态筛选 Ready | 只显示 ready 文档 | PASS,4 条 | +| TC-DO-017 | P0 | 状态筛选 Failed | 只显示 failed 文档 | PASS,3 条 | +| TC-DO-018 | P1 | 文档名大小写不敏感搜索 | 返回匹配项,清空后恢复 | PASS | +| TC-DO-019 | P1 | 搜索无匹配 | 显示明确无结果空状态 | PASS | +| TC-DO-020 | P0 | 打开 Tasks 抽屉 | 显示需关注/失败任务、原因和可用操作 | PASS,5 条失败/中断 | +| TC-DO-021 | P0 | 对失败任务点 Retry | 只创建一个 retry attempt,状态可跟踪 | PENDING-CONFIRM,不重试既有业务文档 | +| TC-DO-022 | P1 | 对进行中任务 Cancel | 任务进入 canceling/canceled,无半索引残留 | PENDING-CONFIRM | +| TC-DO-023 | P1 | 任务 SSE 断网再连 | 续接或 polling 收敛,不倒退、不重复任务 | NOT-RUN | +| TC-DO-024 | P1 | 打开 Metadata schema 对话框 | 显示现有 schema;能力未开放时按钮禁用且有说明 | PASS,Add Metadata 禁用 | +| TC-DO-025 | P1 | 勾选一个文档 | 显示批量操作条和正确选中计数 | PASS | +| TC-DO-026 | P1 | 选中文档后查看 Reindex/Download/Delete 状态 | 按权限和实现能力准确启用/禁用 | PASS,Reindex 可用,Download/Delete 禁用 | +| TC-DO-027 | P0 | 批量 Reindex 选择 1/1000/1001 文档 | 只允许 1–1000;单一 durable job,不重复 | PENDING-CONFIRM | +| TC-DO-028 | P0 | Reindex payload 同时包含 `all=true` 和 documentIds | 返回 422,不运行任务 | NOT-RUN | +| TC-DO-029 | P0 | 批量删除含存在/不存在 ID | 事件结果可追踪,幂等重放不多删 | PENDING-CONFIRM | +| TC-DO-030 | P1 | 行菜单打开 | 根据状态显示 rename/reindex/disable/archive/download/delete | PASS | +| TC-DO-031 | P1 | Rename 留空 | 保存禁用或字段必填 | PASS | +| TC-DO-032 | P1 | Rename 输入 304 字 | 按后端合同限制,超限时前端拦截 | FAIL-CANDIDATE,保存仍可用,未提交 | +| TC-DO-033 | P1 | Ready/Failed/Processing 文档的禁用、归档、下载按钮 | 按状态机正确启用,禁用项有解释 | PARTIAL,已检查当前状态 | +| TC-DO-034 | P1 | 两标签页并发 metadata PATCH,使用 stale rowVersion | 第二个返回 409,UI 刷新后可重试 | NOT-RUN | +| TC-DO-035 | P0 | 删除文档时重复使用同 Idempotency-Key/不同 payload | 同 payload 重放同结果,不同 payload 返回冲突 | PENDING-CONFIRM | ## F. 文档详情、修订、分块与 Metadata -| ID | P | 测试场景/步骤 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-DD-001 | P0 | 打开 Ready 文档详情 | 标题、内容、来源、状态正常加载,无错误 toast | FAIL,内容成功但 3 条 404 toast | -| TC-DD-002 | P0 | 详情页不展示未授权原始内容 | viewer 仅读且内容遵循 workspace 隔离 | NOT-RUN | -| TC-DD-003 | P1 | 点击 Metadata “编辑” | 打开编辑器或明确提示不支持,按钮可恢复 | FAIL,见 KF-BUG-007 | -| TC-DD-004 | P1 | 查看 revisions 列表 | 按时间倒序,active revision 明确标识 | PENDING-CONFIRM,需自有文档 | -| TC-DD-005 | P1 | 切换不同 revision | 内容、chunk 和 outline 与修订一致,无版本竞态 | PENDING-CONFIRM | -| TC-DD-006 | P1 | 查看 revision chunks | 分页/游标无重复丢失,chunk 内容与解析结果一致 | PENDING-CONFIRM | -| TC-DD-007 | P1 | 打开单个 chunk 详情 | 显示标识、位置、内容和 metadata,新版不提供编辑假入口 | PENDING-CONFIRM | -| TC-DD-008 | P1 | 查看 outline | 层级顺序与原文档匹配,空 outline 有空状态 | PENDING-CONFIRM | -| TC-DD-009 | P1 | schema 名称 1/255/256 字及重名 | 允许 1–255,拒绝 256/重名/内建名 | PENDING-CONFIRM | -| TC-DD-010 | P1 | schema type 为 string/number/time | 每种类型保存和文档值校验正确 | PENDING-CONFIRM | -| TC-DD-011 | P1 | stale schema expectedRowVersion 更新/删除 | 返回 409,不静默覆盖 | PENDING-CONFIRM | -| TC-DD-012 | P1 | metadata value 与 schema type 不匹配 | 字段级拒绝,其他值不受影响 | PENDING-CONFIRM | +| ID | P | 测试场景/步骤 | 预期结果 | 本轮结果 | +| --------- | --- | ----------------------------------------- | ----------------------------------------------------- | ------------------------------- | +| TC-DD-001 | P0 | 打开 Ready 文档详情 | 标题、内容、来源、状态正常加载,无错误 toast | FAIL,内容成功但 3 条 404 toast | +| TC-DD-002 | P0 | 详情页不展示未授权原始内容 | viewer 仅读且内容遵循 workspace 隔离 | NOT-RUN | +| TC-DD-003 | P1 | 点击 Metadata “编辑” | 打开编辑器或明确提示不支持,按钮可恢复 | FAIL,见 KF-BUG-007 | +| TC-DD-004 | P1 | 查看 revisions 列表 | 按时间倒序,active revision 明确标识 | PENDING-CONFIRM,需自有文档 | +| TC-DD-005 | P1 | 切换不同 revision | 内容、chunk 和 outline 与修订一致,无版本竞态 | PENDING-CONFIRM | +| TC-DD-006 | P1 | 查看 revision chunks | 分页/游标无重复丢失,chunk 内容与解析结果一致 | PENDING-CONFIRM | +| TC-DD-007 | P1 | 打开单个 chunk 详情 | 显示标识、位置、内容和 metadata,新版不提供编辑假入口 | PENDING-CONFIRM | +| TC-DD-008 | P1 | 查看 outline | 层级顺序与原文档匹配,空 outline 有空状态 | PENDING-CONFIRM | +| TC-DD-009 | P1 | schema 名称 1/255/256 字及重名 | 允许 1–255,拒绝 256/重名/内建名 | PENDING-CONFIRM | +| TC-DD-010 | P1 | schema type 为 string/number/time | 每种类型保存和文档值校验正确 | PENDING-CONFIRM | +| TC-DD-011 | P1 | stale schema expectedRowVersion 更新/删除 | 返回 409,不静默覆盖 | PENDING-CONFIRM | +| TC-DD-012 | P1 | metadata value 与 schema type 不匹配 | 字段级拒绝,其他值不受影响 | PENDING-CONFIRM | ## G. 概览与可观测性 -| ID | P | 测试场景/步骤 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-OV-001 | P0 | 新建空间打开 Overview | 显示添加第一个数据源 onboarding,指标为— | PASS | -| TC-OV-002 | P0 | 有数据空间查看 24h/30d 指标 | 时间范围切换后查询数、回答率和对比值一致 | PASS,24h 0,30d 11/100% | -| TC-OV-003 | P1 | 需要关注列表分页 | 前后翻页稳定,不重复丢失 | PASS,2 页 | -| TC-OV-004 | P1 | 打开最近活动抽屉 | Today/30d 和活动事件显示正常 | PASS | -| TC-OV-005 | P1 | 最近活动按 operator 筛选 | 只显示对应 actor/System 事件 | PASS | -| TC-OV-006 | P1 | 资产概况文档/实体/关系/覆盖数 | 与后端 inventory 一致 | PASS,4/398/380/104 | -| TC-OV-007 | P1 | Documents 列表包含 failed 文档时核对 Overview “文档” | 标签说明是 total 还是 ready,各页口径一致 | AMBIGUOUS,Overview=4,列表/卡片=7 | -| TC-OV-008 | P1 | 新上传文档完成后不刷新查看指标 | 按设计实时/轮询更新,不长期过期 | PENDING-CONFIRM | -| TC-OV-009 | P1 | 删除文档/source/space 后核对 stats | durable job 完成后计数无残留 | PENDING-CONFIRM | +| ID | P | 测试场景/步骤 | 预期结果 | 本轮结果 | +| --------- | --- | ---------------------------------------------------- | ----------------------------------------- | ---------------------------------- | +| TC-OV-001 | P0 | 新建空间打开 Overview | 显示添加第一个数据源 onboarding,指标为— | PASS | +| TC-OV-002 | P0 | 有数据空间查看 24h/30d 指标 | 时间范围切换后查询数、回答率和对比值一致 | PASS,24h 0,30d 11/100% | +| TC-OV-003 | P1 | 需要关注列表分页 | 前后翻页稳定,不重复丢失 | PASS,2 页 | +| TC-OV-004 | P1 | 打开最近活动抽屉 | Today/30d 和活动事件显示正常 | PASS | +| TC-OV-005 | P1 | 最近活动按 operator 筛选 | 只显示对应 actor/System 事件 | PASS | +| TC-OV-006 | P1 | 资产概况文档/实体/关系/覆盖数 | 与后端 inventory 一致 | PASS,4/398/380/104 | +| TC-OV-007 | P1 | Documents 列表包含 failed 文档时核对 Overview “文档” | 标签说明是 total 还是 ready,各页口径一致 | AMBIGUOUS,Overview=4,列表/卡片=7 | +| TC-OV-008 | P1 | 新上传文档完成后不刷新查看指标 | 按设计实时/轮询更新,不长期过期 | PENDING-CONFIRM | +| TC-OV-009 | P1 | 删除文档/source/space 后核对 stats | durable job 完成后计数无残留 | PENDING-CONFIRM | ## H. Fast / Deep / Research 检索 -| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-RE-001 | P0 | 空库打开 Retrieval | 显示输入框、三种模式和空记录状态 | PASS | -| TC-RE-002 | P0 | 问题留空或仅空格 | Start 禁用 | PASS | -| TC-RE-003 | P0 | 问题精确 2000 字 | UI 允许,后端 query 长度约束不冲突 | PARTIAL,已核对 maxLength=2000 | -| TC-RE-004 | P0 | 问题 2001 字 | UI 拦截/字段错误,不静默截断 | NOT-RUN | -| TC-RE-005 | P0 | 单次 Fast Start | 只产生 1 个 admission、1 个 SSE 任务、1 条记录 | PASS,QA 空库 813 ms 返回 1 条记录、0 分段 | -| TC-RE-006 | P0 | 单次 Fast Retry | 只生成 1 个新 attempt,与原 trace 关联 | FAIL,生成 2 条,KF-BUG-001 | -| TC-RE-007 | P0 | 单次 Deep Start | 只产生 1 个任务和 1 条记录 | FAIL,生成 2 条,KF-BUG-001 | -| TC-RE-008 | P0 | 单次 Research Start | 只产生 1 个 research task,阶段流式更新 | FAIL/PARTIAL,既有库可启动;QA 空库单击后 27+ 秒无任务、阶段或错误,见 KF-BUG-019 | -| TC-RE-009 | P0 | Fast 对唯一 marker 检索 | 答案包含 marker,citation 定位到正确 chunk | PENDING-CONFIRM,需上传并有额度 | -| TC-RE-010 | P0 | Deep 对同一 marker 检索 | 深度检索只生成一个结果,引用可回溯 | PENDING-CONFIRM | -| TC-RE-011 | P0 | Research 对多文档问题 | 计划→检索→分析→结果完整,证据与冲突可查 | PENDING-CONFIRM | -| TC-RE-012 | P0 | 无结果查询 | 明确“无充分证据”,不编造引用 | PASS,QA 空库 Fast/Deep 明确“未召回分段”,0 引用 | -| TC-RE-013 | P0 | Fast/Deep 正常查询 | 流式完成且无错误,记录状态与答案一致 | PARTIAL,QA 空库正常 0 结果;既有库受模型额度阻塞 | -| TC-RE-014 | P1 | Research 无召回 | 阶段和最终错误一致,可重试 | FAIL/PARTIAL,QA 空库静默回到 idle;既有库显示检索失败/未召回 | -| TC-RE-015 | P1 | 有历史记录时加载 Retrieval | 不再显示“暂无测试记录” | FAIL,见 KF-BUG-010 | -| TC-RE-016 | P1 | SSE 进行中断网、恢复网络 | 续接原 trace,不重复计费/任务 | NOT-RUN | -| TC-RE-017 | P1 | 进行中取消查询 | 服务端停止,记录为 canceled,不持续消耗额度 | NOT-RUN | -| TC-RE-018 | P1 | activeDocumentIds 100/101 | 允许 100,拒绝 101,UI 显示限制 | NOT-RUN | -| TC-RE-019 | P1 | query images 1/4/5,重复 UUID | 最多 4,重复被去重或拒绝,5 张拒绝 | NOT-RUN | -| TC-RE-020 | P1 | 图片 10 MB 边界、总 32 MB 边界、伪装 MIME | 仅 gif/jpeg/png/webp,严格限制单张/总大小 | NOT-RUN | -| TC-RE-021 | P1 | 引用点击/键盘激活 | 定位正确文档、revision 和 chunk,焦点可返回 | PENDING-CONFIRM | -| TC-RE-022 | P1 | Auto 模式通过 App/Workflow Knowledge Retrieval v2 运行 | 按 Settings 自动选 Fast/Deep/Research,运行和发布一致 | NOT-RUN | -| TC-RE-023 | P1 | 用废弃 `/queries` 路由 | UI 不调用该路由;服务返回明确 503/deprecated | STATIC-VERIFIED | +| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | +| --------- | --- | -------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| TC-RE-001 | P0 | 空库打开 Retrieval | 显示输入框、三种模式和空记录状态 | PASS | +| TC-RE-002 | P0 | 问题留空或仅空格 | Start 禁用 | PASS | +| TC-RE-003 | P0 | 问题精确 2000 字 | UI 允许,后端 query 长度约束不冲突 | PARTIAL,已核对 maxLength=2000 | +| TC-RE-004 | P0 | 问题 2001 字 | UI 拦截/字段错误,不静默截断 | NOT-RUN | +| TC-RE-005 | P0 | 单次 Fast Start | 只产生 1 个 admission、1 个 SSE 任务、1 条记录 | PASS,QA 空库 813 ms 返回 1 条记录、0 分段 | +| TC-RE-006 | P0 | 单次 Fast Retry | 只生成 1 个新 attempt,与原 trace 关联 | FAIL,生成 2 条,KF-BUG-001 | +| TC-RE-007 | P0 | 单次 Deep Start | 只产生 1 个任务和 1 条记录 | FAIL,生成 2 条,KF-BUG-001 | +| TC-RE-008 | P0 | 单次 Research Start | 只产生 1 个 research task,阶段流式更新 | FAIL/PARTIAL,既有库可启动;QA 空库单击后 27+ 秒无任务、阶段或错误,见 KF-BUG-019 | +| TC-RE-009 | P0 | Fast 对唯一 marker 检索 | 答案包含 marker,citation 定位到正确 chunk | PENDING-CONFIRM,需上传并有额度 | +| TC-RE-010 | P0 | Deep 对同一 marker 检索 | 深度检索只生成一个结果,引用可回溯 | PENDING-CONFIRM | +| TC-RE-011 | P0 | Research 对多文档问题 | 计划→检索→分析→结果完整,证据与冲突可查 | PENDING-CONFIRM | +| TC-RE-012 | P0 | 无结果查询 | 明确“无充分证据”,不编造引用 | PASS,QA 空库 Fast/Deep 明确“未召回分段”,0 引用 | +| TC-RE-013 | P0 | Fast/Deep 正常查询 | 流式完成且无错误,记录状态与答案一致 | PARTIAL,QA 空库正常 0 结果;既有库受模型额度阻塞 | +| TC-RE-014 | P1 | Research 无召回 | 阶段和最终错误一致,可重试 | FAIL/PARTIAL,QA 空库静默回到 idle;既有库显示检索失败/未召回 | +| TC-RE-015 | P1 | 有历史记录时加载 Retrieval | 不再显示“暂无测试记录” | FAIL,见 KF-BUG-010 | +| TC-RE-016 | P1 | SSE 进行中断网、恢复网络 | 续接原 trace,不重复计费/任务 | NOT-RUN | +| TC-RE-017 | P1 | 进行中取消查询 | 服务端停止,记录为 canceled,不持续消耗额度 | NOT-RUN | +| TC-RE-018 | P1 | activeDocumentIds 100/101 | 允许 100,拒绝 101,UI 显示限制 | NOT-RUN | +| TC-RE-019 | P1 | query images 1/4/5,重复 UUID | 最多 4,重复被去重或拒绝,5 张拒绝 | NOT-RUN | +| TC-RE-020 | P1 | 图片 10 MB 边界、总 32 MB 边界、伪装 MIME | 仅 gif/jpeg/png/webp,严格限制单张/总大小 | NOT-RUN | +| TC-RE-021 | P1 | 引用点击/键盘激活 | 定位正确文档、revision 和 chunk,焦点可返回 | PENDING-CONFIRM | +| TC-RE-022 | P1 | 省略 mode,通过 App/Workflow Knowledge Retrieval v2 跟随空间配置运行 | 使用各空间 Settings;草稿、发布 Web 与 Service API 一致 | 初测 FAIL/ENV-BLOCKED;配置、保存与发布通过,但所有运行入口均误报未绑定。KF-BUG-021 / WTA-1953 已完成代码修复和专项回归,待部署后验证真实草稿、Web 与 Service 正向结果;字面 `auto` 按合同应拒绝 | +| TC-RE-023 | P1 | 用废弃 `/queries` 路由 | UI 不调用该路由;服务返回明确 503/deprecated | STATIC-VERIFIED | ## I. Quality:参考问题、问题案例与 Replay -| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-QA-001 | P0 | 空空间打开 Quality | 参考问题 0、问题案例 0,空状态正确 | PASS | -| TC-QA-002 | P0 | 切换参考问题/问题案例 | tab 选中和 `?tab=bad-cases` 路由一致 | PASS | -| TC-QA-003 | P0 | 创建问题与备注留空 | 在字段下显示必填错误,不创建记录 | PASS | -| TC-QA-004 | P0 | 触发必填错误后输入合法问题/备注 | 错误和红色边框立即清除 | FAIL,见 KF-BUG-008 | -| TC-QA-005 | P0 | 合法问题+备注,不选证据直接保存 | 创建 1 条 draft,列表计数+1 | PASS | -| TC-QA-006 | P0 | 编辑已有 draft 备注并保存 | 列表内容和更新时间同步 | PASS | -| TC-QA-007 | P1 | 勾选一条参考问题 | 显示“已选 1”、删除入口和清除选择 | PASS | -| TC-QA-008 | P1 | 有效证据文本后点“查找证据” | 返回候选 chunk 或明确无匹配,不报未知错误 | FAIL/ENV,当前为“未知错误” | -| TC-QA-009 | P0 | 导入合法 CSV(question/evidence/tags) | 显示行级预览和导入结果,未匹配证据保存草稿 | FAIL,2 行预览正确;提交后仅显示“未知错误”,刷新仍为 1 条、无部分成功 | -| TC-QA-010 | P0 | CSV 使用中文表头、quoted commas/tags | 正确解析,不错列/乱码 | PARTIAL,英文表头与 quoted tags 正确预览;中文表头未执行 | -| TC-QA-011 | P0 | CSV 500/501 行 | 允许 500,拒绝 501,告知上限 | NOT-RUN,基础 2 行导入已失败 | -| TC-QA-012 | P0 | CSV 精确 1 MiB/1 MiB+1 | 允许边界,超限拒绝且无部分落库 | NOT-RUN,基础 2 行导入已失败 | -| TC-QA-013 | P1 | CSV 包含合法与非法行 | 行级结果清晰,可重试失败行,不重复成功行 | NOT-RUN,基础 2 行导入已失败 | -| TC-QA-014 | P1 | 执行 replay run | 重测每个问题,显示通过/失败/无证据和可追溯 trace | PENDING-CONFIRM | -| TC-QA-015 | P1 | replay 进行中断网/刷新 | 状态可恢复,不重复执行同一问题 | NOT-RUN | -| TC-QA-016 | P1 | 问题案例从真实查询转入 | 保留 query/trace/evidence 关联,列表计数及时更新 | NOT-RUN | -| TC-QA-017 | P1 | 删除单个/批量参考问题 | 仅删除选中项,重复确认不多删 | PENDING-CONFIRM | +| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | +| --------- | --- | -------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------- | +| TC-QA-001 | P0 | 空空间打开 Quality | 参考问题 0、问题案例 0,空状态正确 | PASS | +| TC-QA-002 | P0 | 切换参考问题/问题案例 | tab 选中和 `?tab=bad-cases` 路由一致 | PASS | +| TC-QA-003 | P0 | 创建问题与备注留空 | 在字段下显示必填错误,不创建记录 | PASS | +| TC-QA-004 | P0 | 触发必填错误后输入合法问题/备注 | 错误和红色边框立即清除 | FAIL,见 KF-BUG-008 | +| TC-QA-005 | P0 | 合法问题+备注,不选证据直接保存 | 创建 1 条 draft,列表计数+1 | PASS | +| TC-QA-006 | P0 | 编辑已有 draft 备注并保存 | 列表内容和更新时间同步 | PASS | +| TC-QA-007 | P1 | 勾选一条参考问题 | 显示“已选 1”、删除入口和清除选择 | PASS | +| TC-QA-008 | P1 | 有效证据文本后点“查找证据” | 返回候选 chunk 或明确无匹配,不报未知错误 | FAIL/ENV,当前为“未知错误” | +| TC-QA-009 | P0 | 导入合法 CSV(question/evidence/tags) | 显示行级预览和导入结果,未匹配证据保存草稿 | FAIL,2 行预览正确;提交后仅显示“未知错误”,刷新仍为 1 条、无部分成功 | +| TC-QA-010 | P0 | CSV 使用中文表头、quoted commas/tags | 正确解析,不错列/乱码 | PARTIAL,英文表头与 quoted tags 正确预览;中文表头未执行 | +| TC-QA-011 | P0 | CSV 500/501 行 | 允许 500,拒绝 501,告知上限 | NOT-RUN,基础 2 行导入已失败 | +| TC-QA-012 | P0 | CSV 精确 1 MiB/1 MiB+1 | 允许边界,超限拒绝且无部分落库 | NOT-RUN,基础 2 行导入已失败 | +| TC-QA-013 | P1 | CSV 包含合法与非法行 | 行级结果清晰,可重试失败行,不重复成功行 | NOT-RUN,基础 2 行导入已失败 | +| TC-QA-014 | P1 | 执行 replay run | 重测每个问题,显示通过/失败/无证据和可追溯 trace | PENDING-CONFIRM | +| TC-QA-015 | P1 | replay 进行中断网/刷新 | 状态可恢复,不重复执行同一问题 | NOT-RUN | +| TC-QA-016 | P1 | 问题案例从真实查询转入 | 保留 query/trace/evidence 关联,列表计数及时更新 | NOT-RUN | +| TC-QA-017 | P1 | 删除单个/批量参考问题 | 仅删除选中项,重复确认不多删 | PENDING-CONFIRM | ## J. Settings:基础信息、可见性与检索参数 -| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-ST-001 | P0 | 打开 Settings | 基础信息、API、模型、检索和危险操作加载正常 | PASS | -| TC-ST-002 | P0 | 名称留空/仅空格 | 显示必填错误,Save 禁用 | PASS | -| TC-ST-003 | P0 | 名称精确 40 字保存 | 保存成功,侧边栏/列表同步 | PASS,后已恢复 | -| TC-ST-004 | P0 | 名称 41 字 | 前端拦截和字段提示 | FAIL,创建页已证实 | -| TC-ST-005 | P0 | 描述精确 2000 字 | 保存成功 | PASS,后已恢复 | -| TC-ST-006 | P0 | 描述 2001 字 | 前端拦截,显示字段错误 | FAIL,见 KF-BUG-003 | -| TC-ST-007 | P0 | 合法名称/描述保存后刷新 | 持久值正确,Save 回到禁用 | PASS | -| TC-ST-008 | P1 | 改动后 Cancel | 恢复服务端值,不发 PATCH | PASS,可见性试改 | -| TC-ST-009 | P0 | 可见性 only_me/all/partial 下拉 | 三种选项齐全,与隐藏值一致 | PASS | -| TC-ST-010 | P0 | partial 不选任何成员 | 显示至少一人,禁止保存 | PASS | -| TC-ST-011 | P1 | partial 添加/移除成员并保存 | 成员权限和 auth epoch 正确更新 | NOT-RUN,缺多用户 | -| TC-ST-012 | P1 | API Access 开关 on/off | 立即保存或明确告知自动保存,侧边栏同步 | PASS,已恢复 off | -| TC-ST-013 | P0 | 系统推理模型下拉 | 只显示可用模型,缺失/失效时可解释 | PARTIAL,当前 gpt-5.6 | -| TC-ST-014 | P0 | Embedding 模型下拉 | 只显示可用 embedding,Fast/Deep 不允许缺失 | PARTIAL,当前 text-embedding-3-large | -| TC-ST-015 | P0 | 同时修改 embedding 与 retrieval settings | 产品要求拆分操作,返回明确 422 而非部分保存 | NOT-RUN | -| TC-ST-016 | P0 | embedding migration queued/running/succeeded/failed/canceled | 进度、checkpoint 和恢复入口清晰,激活前不破坏旧索引 | NOT-RUN | -| TC-ST-017 | P0 | 启用 Rerank 但不选模型 | 禁止保存并提示必选模型 | NOT-RUN | -| TC-ST-018 | P0 | Rerank 关闭时尝试启用 Fast/Deep Score threshold | threshold 禁用,规则清晰 | PASS,当前禁用 | -| TC-ST-019 | P0 | Retrieval mode Fast→Deep→Fast | 每次只保存一次,选中状态持久 | PASS,已恢复 Fast | -| TC-ST-020 | P0 | Retrieval mode Research | 模式保存并使 Retrieval 按钮语义变为开始研究 | PASS,在 Retrieval 已验证 | -| TC-ST-021 | P0 | Top K = 0 | 拦截或明确 clamp 到 1,显示值与保存值一致 | PASS,显示和 slider 均为 1 | -| TC-ST-022 | P0 | Top K = 1/10 | 允许边界值,持久后一致 | PASS | -| TC-ST-023 | P0 | Top K = 11 | 拦截或明确 clamp 到 10,显示值与保存值一致 | PASS,显示和 slider 均为 10 | -| TC-ST-024 | P0 | threshold = -0.01/0/1/1.01 | 只允许 0–1,保存值与显示一致 | NOT-RUN,rerank 未配置 | -| TC-ST-025 | P0 | 两标签页使用相同 expectedRevision 并发保存 | 第二次 409,给出刷新/合并引导,不静默覆盖 | NOT-RUN | -| TC-ST-026 | P1 | Save 返回 422/409/503 | 区分字段错误、冲突和服务不可用,不统一报网络 | FAIL,422 被误报网络 | -| TC-ST-027 | P0 | 点击删除空间 | 必须二次确认,完成后立即从列表隐藏 | PENDING-CONFIRM | +| ID | P | 测试场景/输入 | 预期结果 | 本轮结果 | +| --------- | --- | ------------------------------------------------------------ | --------------------------------------------------- | ------------------------------------ | +| TC-ST-001 | P0 | 打开 Settings | 基础信息、API、模型、检索和危险操作加载正常 | PASS | +| TC-ST-002 | P0 | 名称留空/仅空格 | 显示必填错误,Save 禁用 | PASS | +| TC-ST-003 | P0 | 名称精确 40 字保存 | 保存成功,侧边栏/列表同步 | PASS,后已恢复 | +| TC-ST-004 | P0 | 名称 41 字 | 前端拦截和字段提示 | FAIL,创建页已证实 | +| TC-ST-005 | P0 | 描述精确 2000 字 | 保存成功 | PASS,后已恢复 | +| TC-ST-006 | P0 | 描述 2001 字 | 前端拦截,显示字段错误 | FAIL,见 KF-BUG-003 | +| TC-ST-007 | P0 | 合法名称/描述保存后刷新 | 持久值正确,Save 回到禁用 | PASS | +| TC-ST-008 | P1 | 改动后 Cancel | 恢复服务端值,不发 PATCH | PASS,可见性试改 | +| TC-ST-009 | P0 | 可见性 only_me/all/partial 下拉 | 三种选项齐全,与隐藏值一致 | PASS | +| TC-ST-010 | P0 | partial 不选任何成员 | 显示至少一人,禁止保存 | PASS | +| TC-ST-011 | P1 | partial 添加/移除成员并保存 | 成员权限和 auth epoch 正确更新 | NOT-RUN,缺多用户 | +| TC-ST-012 | P1 | API Access 开关 on/off | 立即保存或明确告知自动保存,侧边栏同步 | PASS,已恢复 off | +| TC-ST-013 | P0 | 系统推理模型下拉 | 只显示可用模型,缺失/失效时可解释 | PARTIAL,当前 gpt-5.6 | +| TC-ST-014 | P0 | Embedding 模型下拉 | 只显示可用 embedding,Fast/Deep 不允许缺失 | PARTIAL,当前 text-embedding-3-large | +| TC-ST-015 | P0 | 同时修改 embedding 与 retrieval settings | 产品要求拆分操作,返回明确 422 而非部分保存 | NOT-RUN | +| TC-ST-016 | P0 | embedding migration queued/running/succeeded/failed/canceled | 进度、checkpoint 和恢复入口清晰,激活前不破坏旧索引 | NOT-RUN | +| TC-ST-017 | P0 | 启用 Rerank 但不选模型 | 禁止保存并提示必选模型 | NOT-RUN | +| TC-ST-018 | P0 | Rerank 关闭时尝试启用 Fast/Deep Score threshold | threshold 禁用,规则清晰 | PASS,当前禁用 | +| TC-ST-019 | P0 | Retrieval mode Fast→Deep→Fast | 每次只保存一次,选中状态持久 | PASS,已恢复 Fast | +| TC-ST-020 | P0 | Retrieval mode Research | 模式保存并使 Retrieval 按钮语义变为开始研究 | PASS,在 Retrieval 已验证 | +| TC-ST-021 | P0 | Top K = 0 | 拦截或明确 clamp 到 1,显示值与保存值一致 | PASS,显示和 slider 均为 1 | +| TC-ST-022 | P0 | Top K = 1/10 | 允许边界值,持久后一致 | PASS | +| TC-ST-023 | P0 | Top K = 11 | 拦截或明确 clamp 到 10,显示值与保存值一致 | PASS,显示和 slider 均为 10 | +| TC-ST-024 | P0 | threshold = -0.01/0/1/1.01 | 只允许 0–1,保存值与显示一致 | NOT-RUN,rerank 未配置 | +| TC-ST-025 | P0 | 两标签页使用相同 expectedRevision 并发保存 | 第二次 409,给出刷新/合并引导,不静默覆盖 | NOT-RUN | +| TC-ST-026 | P1 | Save 返回 422/409/503 | 区分字段错误、冲突和服务不可用,不统一报网络 | FAIL,422 被误报网络 | +| TC-ST-027 | P0 | 点击删除空间 | 必须二次确认,完成后立即从列表隐藏 | PENDING-CONFIRM | ## K. 权限、成员、API 和应用绑定 -| ID | P | 测试场景/角色 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-AU-001 | P0 | owner 访问列表/详情/上传/设置/成员/API/删除 | 所有功能可用 | PARTIAL,owner 主流程通过 | -| TC-AU-002 | P0 | editor 访问读/编辑/文档写/检索 | 允许;成员/API key/删库按合同禁止 | NOT-RUN | -| TC-AU-003 | P0 | viewer 访问读/检索 | 只读和 query 允许;所有写操作隐藏/禁止 | NOT-RUN | -| TC-AU-004 | P0 | only_me 下非 owner 访问深链 | 与不存在资源统一为 404 | NOT-RUN | -| TC-AU-005 | P0 | all_team_members 的未显式成员 | 以 viewer 访问,不获得编辑权 | NOT-RUN | -| TC-AU-006 | P0 | partial_members 的非选中成员 | 列表不可见,深链 404 | NOT-RUN | -| TC-AU-007 | P0 | RBAC 查询异常 | fail closed,不使用本地角色绕过 | NOT-RUN | -| TC-AU-008 | P0 | 成员被移除/可见性收窄时仍打开详情 | 页面下一次请求立即失效,旧 SSE/token 不能继续 | NOT-RUN | -| TC-AU-009 | P0 | 用旧 API credential 在撤权后访问 | 立即 401/403/404,不等 TTL 过期 | NOT-RUN | -| TC-AU-010 | P0 | External API endpoint 为 `not-a-url` | 只显示一条本地化字段错误,不保存 | FAIL,见 KF-BUG-009 | -| TC-AU-011 | P1 | External API 合法 endpoint/key 创建并测试 | 保存后可编辑/撤销,key 不再明文显示 | NOT-RUN,无可用外部 API | -| TC-AU-012 | P0 | 创建 Service API Key | 只在创建瞬间显示 secret,复制和撤销可用 | PASS,已创建 1 枚临时 key | -| TC-AU-013 | P0 | 撤销 Service API Key 后重试访问 | 立即失效,不会继续签发空间 token | PENDING-CONFIRM | -| TC-AU-014 | P0 | Agent/Agent Chat 绑定 Agent channel | 只允许支持的 app 类型且 space active/channel enabled | NOT-RUN | -| TC-AU-015 | P0 | Workflow/Advanced Chat 绑定 Workflow channel | 最多 10 个 space,第 11 个有明确错误 | NOT-RUN | -| TC-AU-016 | P0 | 解除 app binding 后运行已发布 app | 旧 binding 不再可用,运行给出明确错误 | NOT-RUN | -| TC-AU-017 | P0 | 使用新 Service API Key 请求 `/v1/datasets` | 返回 200 和合法分页 JSON | PASS | -| TC-AU-018 | P0 | 将 Service API Key 修改一位后请求 | 返回 401,不返回数据 | PASS | -| TC-AU-019 | P1 | 合法 key 使用成功后重新打开密钥列表 | 最后使用时间更新 | FAIL,仍显示“从未”,KF-BUG-013 | -| TC-AU-020 | P0 | QA space API Access = off 时用有效 key 请求该 space ID | 返回不可见/404 | PASS,返回 404 | -| TC-AU-021 | P0 | QA space API Access on→刷新→off→刷新 | 即时保存;两次刷新均与服务端一致,最终恢复关闭 | PASS,开启显示“已启用”,最终确认 `aria-checked=false` | -| TC-AU-022 | P0 | 用旧 Dataset Service API Key 调用 KFS admission | 旧 key 不可冒充 KFS scoped credential | PASS,API 域名返回 401 `knowledge_fs_invalid_credential` | -| TC-AU-023 | P0 | API Access 已开启时点击空间侧栏“API 访问” | 显示可用 endpoint、专属 credential 创建/管理或明确下一步 | FAIL,只弹空白“不可用”对话框,见 KF-BUG-018 | +| ID | P | 测试场景/角色 | 预期结果 | 本轮结果 | +| --------- | --- | ------------------------------------------------------ | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| TC-AU-001 | P0 | owner 访问列表/详情/上传/设置/成员/API/删除 | 所有功能可用 | PARTIAL,owner 主流程通过 | +| TC-AU-002 | P0 | editor 访问读/编辑/文档写/检索 | 允许;成员/API key/删库按合同禁止 | NOT-RUN | +| TC-AU-003 | P0 | viewer 访问读/检索 | 只读和 query 允许;所有写操作隐藏/禁止 | NOT-RUN | +| TC-AU-004 | P0 | only_me 下非 owner 访问深链 | 与不存在资源统一为 404 | NOT-RUN | +| TC-AU-005 | P0 | all_team_members 的未显式成员 | 以 viewer 访问,不获得编辑权 | NOT-RUN | +| TC-AU-006 | P0 | partial_members 的非选中成员 | 列表不可见,深链 404 | NOT-RUN | +| TC-AU-007 | P0 | RBAC 查询异常 | fail closed,不使用本地角色绕过 | NOT-RUN | +| TC-AU-008 | P0 | 成员被移除/可见性收窄时仍打开详情 | 页面下一次请求立即失效,旧 SSE/token 不能继续 | NOT-RUN | +| TC-AU-009 | P0 | 用旧 API credential 在撤权后访问 | 立即 401/403/404,不等 TTL 过期 | NOT-RUN | +| TC-AU-010 | P0 | External API endpoint 为 `not-a-url` | 只显示一条本地化字段错误,不保存 | FAIL,见 KF-BUG-009 | +| TC-AU-011 | P1 | External API 合法 endpoint/key 创建并测试 | 保存后可编辑/撤销,key 不再明文显示 | NOT-RUN,无可用外部 API | +| TC-AU-012 | P0 | 创建 Service API Key | 只在创建瞬间显示 secret,复制和撤销可用 | PASS,已创建 1 枚临时 key | +| TC-AU-013 | P0 | 撤销 Service API Key 后重试访问 | 立即失效,不会继续签发空间 token | PASS;临时 Workflow App key 删除后同 key 立即返回 401 | +| TC-AU-014 | P0 | Agent/Agent Chat 绑定 Agent channel | 只允许支持的 app 类型且 space active/channel enabled | NOT-RUN | +| TC-AU-015 | P0 | Workflow/Advanced Chat 绑定 Workflow channel | 最多 10 个 space,第 11 个有明确错误 | 初测 PARTIAL/FAIL;真实发布后 binding 精确建立,1/6 空间通过、10/11 由自动化合同覆盖。KF-BUG-021 / WTA-1953 已增加独立 Workflow Access 开关并细分 admission 错误,专项回归通过;尚未部署,真实 channel 正向运行仍为 ENV-BLOCKED | +| TC-AU-016 | P0 | 解除 app binding 后运行已发布 app | 旧 binding 不再可用,运行给出明确错误 | PARTIAL/ENV-BLOCKED;发布图从 `ceshi` 切到 QA 时旧 binding 由 1→0,切回恢复 1;KF-BUG-021 已补齐 binding/channel/space/auth 的可区分错误,但部署前仍无法验证真实旧 capability 撤权 | +| TC-AU-017 | P0 | 使用新 Service API Key 请求 `/v1/datasets` | 返回 200 和合法分页 JSON | PASS | +| TC-AU-018 | P0 | 将 Service API Key 修改一位后请求 | 返回 401,不返回数据 | PASS | +| TC-AU-019 | P1 | 合法 key 使用成功后重新打开密钥列表 | 最后使用时间更新 | FAIL,仍显示“从未”,KF-BUG-013 | +| TC-AU-020 | P0 | QA space API Access = off 时用有效 key 请求该 space ID | 返回不可见/404 | PASS,返回 404 | +| TC-AU-021 | P0 | QA space API Access on→刷新→off→刷新 | 即时保存;两次刷新均与服务端一致,最终恢复关闭 | PASS,开启显示“已启用”,最终确认 `aria-checked=false` | +| TC-AU-022 | P0 | 用旧 Dataset Service API Key 调用 KFS admission | 旧 key 不可冒充 KFS scoped credential | PASS,API 域名返回 401 `knowledge_fs_invalid_credential` | +| TC-AU-023 | P0 | API Access 已开启时点击空间侧栏“API 访问” | 显示可用 endpoint、专属 credential 创建/管理或明确下一步 | FAIL,只弹空白“不可用”对话框,见 KF-BUG-018 | ## L. 恢复性、错误映射与非功能 -| ID | P | 测试场景 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-RS-001 | P0 | API 返回 401 | 刷新身份后仅重放一次,不重复 reindex/query 等 POST | NOT-RUN | -| TC-RS-002 | P0 | API 返回 403/404 | 无权与不存在对外表现一致,不泄露资源 | FAIL-PARTIAL,404 toast 泄露路由 | -| TC-RS-003 | P0 | API 返回 409 revision conflict | 保留编辑,提示刷新/合并,不静默覆盖 | NOT-RUN | -| TC-RS-004 | P0 | API 返回 422 field validation | 错误映射到具体字段和限制 | FAIL,名称/描述均只给通用错误 | -| TC-RS-005 | P1 | API 返回 429 | 显示重试时间,按 Retry-After 控制,不密集重试 | NOT-RUN | -| TC-RS-006 | P1 | API 返回 503 | 区分服务不可用与网络断开,保留可重试数据 | ENV/PARTIAL | -| TC-RS-007 | P1 | 断网后在表单点 Save,恢复后 Retry | 不丢输入,仅提交一次 | NOT-RUN | -| TC-RS-008 | P1 | 长任务刷新/关闭再进入 | 根据 durable job ID 恢复进度,不新建任务 | NOT-RUN | -| TC-RS-009 | P1 | 快速连续点击 Start/Retry/Save | 前端防抖+后端幂等,仅一次运行 | FAIL,Retrieval 已复现重复 | -| TC-RS-010 | P1 | 多标签页交错加载列表/详情并返回 | 旧响应不覆盖新路由,焦点和状态正确 | NOT-RUN | -| TC-RS-011 | P1 | 390 px/768 px/1280 px 响应式 | 无内容遮挡、不可达导航和水平滚动陷阱 | PARTIAL,390 px 有导航溢出 | -| TC-RS-012 | P1 | WCAG A/AA 自动扫描新版六个页面 | 无 serious/critical,表单标签和对比度合格 | NOT-RUN,现有 a11y E2E 只扫 legacy | -| TC-RS-013 | P2 | Chrome 缩放 200%、系统大字体 | 无截断、遮挡、无法滚动的对话框 | NOT-RUN | +| ID | P | 测试场景 | 预期结果 | 本轮结果 | +| --------- | --- | --------------------------------- | -------------------------------------------------- | ---------------------------------- | +| TC-RS-001 | P0 | API 返回 401 | 刷新身份后仅重放一次,不重复 reindex/query 等 POST | NOT-RUN | +| TC-RS-002 | P0 | API 返回 403/404 | 无权与不存在对外表现一致,不泄露资源 | FAIL-PARTIAL,404 toast 泄露路由 | +| TC-RS-003 | P0 | API 返回 409 revision conflict | 保留编辑,提示刷新/合并,不静默覆盖 | NOT-RUN | +| TC-RS-004 | P0 | API 返回 422 field validation | 错误映射到具体字段和限制 | FAIL,名称/描述均只给通用错误 | +| TC-RS-005 | P1 | API 返回 429 | 显示重试时间,按 Retry-After 控制,不密集重试 | NOT-RUN | +| TC-RS-006 | P1 | API 返回 503 | 区分服务不可用与网络断开,保留可重试数据 | ENV/PARTIAL | +| TC-RS-007 | P1 | 断网后在表单点 Save,恢复后 Retry | 不丢输入,仅提交一次 | NOT-RUN | +| TC-RS-008 | P1 | 长任务刷新/关闭再进入 | 根据 durable job ID 恢复进度,不新建任务 | NOT-RUN | +| TC-RS-009 | P1 | 快速连续点击 Start/Retry/Save | 前端防抖+后端幂等,仅一次运行 | FAIL,Retrieval 已复现重复 | +| TC-RS-010 | P1 | 多标签页交错加载列表/详情并返回 | 旧响应不覆盖新路由,焦点和状态正确 | NOT-RUN | +| TC-RS-011 | P1 | 390 px/768 px/1280 px 响应式 | 无内容遮挡、不可达导航和水平滚动陷阱 | PARTIAL,390 px 有导航溢出 | +| TC-RS-012 | P1 | WCAG A/AA 自动扫描新版六个页面 | 无 serious/critical,表单标签和对比度合格 | NOT-RUN,现有 a11y E2E 只扫 legacy | +| TC-RS-013 | P2 | Chrome 缩放 200%、系统大字体 | 无截断、遮挡、无法滚动的对话框 | NOT-RUN | ## M. Legacy Dataset / RAG Pipeline 回归高风险用例 > 新版 KnowledgeFS 与旧 Dataset 后端仍并存。以下是为防止切流/兼容回归必须保留的用例,本轮没有在业务数据上执行。 -| ID | P | 测试场景 | 预期结果 | 本轮结果 | -|---|---|---|---|---| -| TC-LG-001 | P0 | 旧 segment 创建不传 `attachment_ids` | 正常创建、建向量且返回 2xx;不得“500 但已部分落库” | STATIC-RISK | -| TC-LG-002 | P0 | 旧 metadata rename 重名/冲突 | 明确失败,刷新后真实名称不变 | STATIC-RISK | -| TC-LG-003 | P0 | 旧 metadata delete 不存在 ID | 返回 404/4xx,不吞异常后 204 | STATIC-RISK | -| TC-LG-004 | P0 | 删除仍被 App/Workflow 使用的 dataset | use-check 阻止并指明关联应用,不断链 | STATIC-RISK | -| TC-LG-005 | P1 | hit test topK 0/超大/负数/NaN,score 越界 | 统一严格校验,不进入模型/数据库 | NOT-RUN | -| TC-LG-006 | P1 | segment 空内容、QA 空 answer、disabled 后编辑 | 按状态机拒绝,无向量残留 | NOT-RUN | -| TC-LG-007 | P1 | 上传后快速 pause/resume/retry/delete/archive | 按 indexing/paused/error/archived 状态机仅允许合法操作 | NOT-RUN | -| TC-LG-008 | P1 | Pipeline draft 用 JSON/text/plain/其他 Content-Type | 只接受 application/json 或 text/plain JSON,其他 415 | NOT-RUN | -| TC-LG-009 | P1 | 两标签页保存同一 draft hash | 第二次 DraftWorkflowNotSync,不静默覆盖 | NOT-RUN | -| TC-LG-010 | P1 | 无 draft/缺 knowledge-index node/缺 embedding/不兼容 chunk 发布 | 发布前完整验证,不产生半成品 published version | NOT-RUN | -| TC-LG-011 | P1 | 删除 active workflow/draft,restore draft | 阻止删 active/draft;只能从 published restore | NOT-RUN | -| TC-LG-012 | P1 | DSL import 无效 YAML/依赖 pending/export secret | 失败 400,依赖待确认 202,默认 export 剥离凭据 | NOT-RUN | +| ID | P | 测试场景 | 预期结果 | 本轮结果 | +| --------- | --- | --------------------------------------------------------------- | ------------------------------------------------------ | ----------- | +| TC-LG-001 | P0 | 旧 segment 创建不传 `attachment_ids` | 正常创建、建向量且返回 2xx;不得“500 但已部分落库” | STATIC-RISK | +| TC-LG-002 | P0 | 旧 metadata rename 重名/冲突 | 明确失败,刷新后真实名称不变 | STATIC-RISK | +| TC-LG-003 | P0 | 旧 metadata delete 不存在 ID | 返回 404/4xx,不吞异常后 204 | STATIC-RISK | +| TC-LG-004 | P0 | 删除仍被 App/Workflow 使用的 dataset | use-check 阻止并指明关联应用,不断链 | STATIC-RISK | +| TC-LG-005 | P1 | hit test topK 0/超大/负数/NaN,score 越界 | 统一严格校验,不进入模型/数据库 | NOT-RUN | +| TC-LG-006 | P1 | segment 空内容、QA 空 answer、disabled 后编辑 | 按状态机拒绝,无向量残留 | NOT-RUN | +| TC-LG-007 | P1 | 上传后快速 pause/resume/retry/delete/archive | 按 indexing/paused/error/archived 状态机仅允许合法操作 | NOT-RUN | +| TC-LG-008 | P1 | Pipeline draft 用 JSON/text/plain/其他 Content-Type | 只接受 application/json 或 text/plain JSON,其他 415 | NOT-RUN | +| TC-LG-009 | P1 | 两标签页保存同一 draft hash | 第二次 DraftWorkflowNotSync,不静默覆盖 | NOT-RUN | +| TC-LG-010 | P1 | 无 draft/缺 knowledge-index node/缺 embedding/不兼容 chunk 发布 | 发布前完整验证,不产生半成品 published version | NOT-RUN | +| TC-LG-011 | P1 | 删除 active workflow/draft,restore draft | 阻止删 active/draft;只能从 published restore | NOT-RUN | +| TC-LG-012 | P1 | DSL import 无效 YAML/依赖 pending/export secret | 失败 400,依赖待确认 202,默认 export 剥离凭据 | NOT-RUN | + +## N. Workflow Knowledge Retrieval v2 补测 + +本轮新增独立补测矩阵,共执行 39 个浏览器/核心合同场景:31 个通过或通过负向合同、5 个失败、1 个部分失败、2 个被同一运行缺陷阻断;这些是初测原始结果,继续保留。另有 15 个真实链路断言标记为 `ENV-BLOCKED`,3 个取消/error-strategy/retry 断言标记为规格或实现阻塞,未使用 mock 结果冒充端到端通过。 + +已确认问题: + +1. `KF-BUG-020` / [WTA-1954](https://linear.app/dify/issue/WTA-1954)(High,Done):初测从节点选择器新增 v2 节点后主编辑区空白并出现未处理 `AbortError`。根因是通用 `WorkflowHistoryStoreInitializer` 在约 500 ms 后接收到新的 history 对象便卸载整棵 Workflow 子树;`AbortError` 是卸载后查询取消的结果。代码已修复,更宽的 Workflow 组合回归 9 个 spec、27 个测试通过,待部署后真实 Chrome 复测。 +2. `KF-BUG-021` / [WTA-1953](https://linear.app/dify/issue/WTA-1953)(High,Done):初测时 binding 已建立,但 channel/permissions 未就绪的所有运行表面统一显示未绑定。代码已增加独立 `workflow_enabled` 开关,细分 binding/channel/space/auth admission 状态,并以稳定 marker 映射为 24 个 locale 的本地化消息;020/021 最终 Web 组合 7 个 spec、70 个测试通过,API 18 个测试通过,待部署后真实正向运行。 +3. `KF-BUG-022` / [WTA-1956](https://linear.app/dify/issue/WTA-1956)(High,Backlog):`created_after` / `created_before` 输入在刷新和 DSL 导出后静默丢失。 +4. `KF-BUG-023` / [WTA-1955](https://linear.app/dify/issue/WTA-1955)(Medium,Backlog):最后一个 node-kind filter 无法取消。 +5. `KF-BUG-024` / [WTA-1957](https://linear.app/dify/issue/WTA-1957)(Medium,Backlog):未解析空间在草稿检查清单中无持久警告,发布时才显示未本地化内部 ID。 + +以上五个 issue 均属于 Linear 项目 `Make RAG Great Again`、Milestone `测试联调`;020/021 已指派给 `jyong` 并完成,022~024 保持 Backlog。修复后的自动化结果不改写 WF2 原始浏览器 FAIL,也不代表尚未部署的真实 E2E 已通过。 + +另有一个已静态确认但未按浏览器缺陷编号的合同缺口:`KNOWLEDGE_FS_BASE_URL` 未配置时 composition root 会在 I/O 前 fail closed,但 v2 节点解析 runtime 的位置可能绕过其受控 `RetrievalUnavailable` 映射;详见补测报告 `WF2-CONTRACT-001`。 + +完整逐项结果、运行表面、自动化证据、测试对象和环境恢复记录见:[Workflow Knowledge Retrieval v2 / KnowledgeFS 功能补测报告](./knowledge-retrieval-v2-functional-test-report.md)。 ## 测试执行建议顺序 -1. 先解决 KF-BUG-001–005,补充有额度的模型环境。 -2. 经用户确认后执行 TC-DO-003–014,等索引 ready。 -3. 紧接执行 TC-DD-004–012、TC-RE-009–011、TC-QA-009–017,保证同一批合成语料可串联校验。 -4. 使用 owner/editor/viewer 三账号执行 TC-AU-001–009,并在正在运行的 SSE 中撤权。 -5. 最后执行删除和清理,核对列表、FS、检索、概览和 App binding 全部无残留。 +1. 部署已修复的 KF-BUG-020/021,在真实 Chrome 中先验证添加任意节点后等待超过 history 保存窗口仍不白屏,再通过独立 Workflow Access 开关启用 `workflow_enabled=true`;同时准备 permissions ready、含唯一 marker 的固定空间。 +2. 修复 KF-BUG-022,并用刷新、DSL 导出与真实 filtered retrieval 三层验证时间过滤;随后处理 KF-BUG-023/024。 +3. 经用户确认后执行 TC-DO-003–014,等索引 ready。 +4. 紧接执行 TC-DD-004–012、TC-RE-009–011、TC-QA-009–017 及补测报告 WF2-LIVE-001~015;先完成规格/实现后再执行 WF2-LIVE-016~018。 +5. 使用 owner/editor/viewer 三账号执行 TC-AU-001–009,并在正在运行的 SSE 中撤权。 +6. 最后执行删除和清理,核对列表、FS、检索、概览和 App binding 全部无残留。 diff --git a/test-results/knowledge-fs/2026-08-11/knowledge-fs-functional-test-report.md b/test-results/knowledge-fs/2026-08-11/knowledge-fs-functional-test-report.md index 35afb93d484..fa0881279a1 100644 --- a/test-results/knowledge-fs/2026-08-11/knowledge-fs-functional-test-report.md +++ b/test-results/knowledge-fs/2026-08-11/knowledge-fs-functional-test-report.md @@ -1,6 +1,6 @@ # KnowledgeFS 全功能测试报告 -配套交付:[详细测试用例](./knowledge-fs-detailed-test-cases.md) · [合成上传数据](./test-data/) +配套交付:[详细测试用例](./knowledge-fs-detailed-test-cases.md) · [Workflow Knowledge Retrieval v2 补测报告](./knowledge-retrieval-v2-functional-test-report.md) · [合成测试数据](./test-data/) ## 1. 测试摘要 @@ -9,17 +9,18 @@ - 测试终端:用户已登录的 Google Chrome,桌面视口 + 390×844 移动视口 - 测试角色:当前 workspace 的 owner 用户 - 测试方法:真实浏览器功能测试、边界值、错误处理、状态流转、恢复性、静态代码/现有自动化测试对照 -- 用例库:已编制 242 条可执行用例;按当前用例状态统计为 89 `PASS`、33 条含 `FAIL`、4 `ENV`、4 `ENV-BLOCKED`、27 `PENDING-CONFIRM`,其余为部分执行、需多用户/provider/大数据的未执行项或静态风险 -- 初始测试状态:Chrome 本地文件权限已修复,合成文件已实际提交到上传/Quality 页面;QA API Access 已完成 off→on→刷新→off→刷新并恢复关闭。初测时所有文档 staging 均失败或悬挂,QA 空间为 0 文档。永久删除、创建 KnowledgeFS 专属凭据与密钥撤销仍等待操作前确认。 -- 修复复测状态:19 个已确认缺陷中 18 个已完成代码修复、专项自动化回归及 Linear 状态同步;唯一未关闭的是 KF-BUG-014 / WTA-1928。该项复测时 TXT/Markdown staging 已成功,但测试环境的文档 claim 路由稳定返回 404,需部署当前 API 后完成 `staging → claim 202 → ready` 实链路复测。 +- 用例库:主矩阵已编制 242 条可执行用例;本轮另补 39 条 Workflow v2 已执行场景和 18 条真实运行断言。主矩阵原状态统计仍保留为 89 `PASS`、33 条含 `FAIL`、4 `ENV`、4 `ENV-BLOCKED`、27 `PENDING-CONFIRM`;Workflow 补测不混入旧统计,逐项结果见独立报告。 +- 初始测试状态:Chrome 本地文件权限已修复,合成文件已实际提交到上传/Quality 页面;QA API Access 已完成 off→on→刷新→off→刷新并恢复关闭。初测时所有文档 staging 均失败或悬挂,QA 空间为 0 文档。 +- 修复复测状态:原 19 个已确认缺陷中 18 个已完成代码修复、专项自动化回归及 Linear 状态同步;唯一未关闭的是 KF-BUG-014 / WTA-1928。该项复测时 TXT/Markdown staging 已成功,但测试环境的文档 claim 路由稳定返回 404,需部署当前 API 后完成 `staging → claim 202 → ready` 实链路复测。 +- Workflow v2 补测状态:39 个浏览器/核心合同场景已执行;另有 15 个真实运行断言被 Workflow channel、permissions-ready KFS 或已索引语料条件阻塞,3 个被产品规格/实现阻塞(取消信号、error strategy、retry),并确认 1 个 endpoint 未配置时的节点错误映射合同缺口。KF-BUG-020~024 均已创建到 Linear 项目 `Make RAG Great Again` 的 Milestone `测试联调`;KF-BUG-020/021 已完成代码修复和专项自动化回归,待部署后做真实 Chrome 正向链路复测,KF-BUG-022~024 保持 Backlog。 ## 2. 结论 初始功能测试表明 KnowledgeFS 新版的页面架构和大部分基础交互可用:新旧版切换、列表筛选、空库创建、空状态、概览指标、文档列表、任务抽屉、Fast/Deep 空库检索、Quality 参考问题创建/编辑、设置保存与 API Access 开关持久化均能正常工作。 -经过本轮修复,除 KF-BUG-014 的测试环境部署阻塞外,其余 18 个已确认缺陷均已修复并通过所属层专项回归。下列条目保留初测时的风险与现象,最新修复状态以第 4 节缺陷表和各缺陷复测记录为准。 +经过原缺陷修复,除 KF-BUG-014 的测试环境部署阻塞外,KF-BUG-001~019 中其余 18 个均已修复并通过所属层专项回归。随后对 Workflow `knowledge-retrieval-v2` 的专项补测又确认 5 个新问题:新增节点白屏、运行通道不可用、时间过滤静默丢失、最后一个 node kind 无法清除,以及未解析空间缺少草稿期警告。最新状态以第 4 节缺陷表和独立补测报告为准。 -但当前不建议直接认定为“可全量发布”。除原有 5 个 P1 级问题外,本轮真实文件/API 集成又暴露出 5 个 P1 级阻断: +当前仍不建议认定为“可全量发布”。以下 1~10 条保留初测时 KF-BUG-001~019 的原始阻断证据,其中除第 6 条对应的 KF-BUG-014 外均已有代码修复;Workflow v2 当前发布门禁另见其后的新增结论: 1. Fast/Deep 检索单次操作会生成重复记录/重复任务,存在重复计费和重复执行风险。 2. 创建名称超长和设置描述超长均缺少前端校验,后端拒绝后界面还给出错误或误导性归因。 @@ -32,6 +33,8 @@ 9. API Access 开启且刷新持久后,侧栏入口仍只弹空白“不可用”;旧 Dataset Service API Key 调用 KFS admission 得到 401,界面没有可用的 KFS 专属凭据路径。 10. QA 空库 Research 单击后 27+ 秒无任务、阶段、结果或错误,静默回到可重试状态;Fast/Deep 在同一空库均能正确显示 0 分段。 +Workflow v2 初测结论仍保留为不可发布:发布会建立并精确同步 binding,但当时的测试部署在 Workflow channel/permissions 未就绪时,草稿完整运行、单节点运行、已发布 Web App、Service API blocking/streaming 都只显示“not bound”,且从选择器新增任意节点约 500 ms 后会使主编辑区白屏。当前代码已修复 KF-BUG-020/021:初始化器不再因新的 history 引用卸载 Workflow 子树;Settings 增加独立 `workflow_enabled` 开关;admission 将 binding、channel、space、authorization 状态细分,并通过稳定 marker 映射为 24 个 locale 的本地化错误。由于修复尚未部署到测试环境,真实 Fast/Deep/Research、引用、filters 和多空间合并仍保持 `ENV-BLOCKED`,不能把自动化回归提升为真实 E2E 通过。 + ## 3. 测试数据与环境影响 ### 3.1 本轮创建的合成数据 @@ -45,7 +48,10 @@ - Quality 参考问题:1 条合成草稿,已验证创建和编辑;2 行 CSV 导入失败且刷新后无部分落库 - Firecrawl:1 个已停止的临时抓取草稿,未添加为数据源 - 文件:尝试 3 个小型 TXT/MD、0 B、精确 15 MiB、15 MiB+1、`.exe`;staging/本地校验后仍为 0 文档 -- Service API Key:已创建 1 个临时 key,已完成鉴权测试,尚未撤销;完整 secret 未写入报告 +- Dataset Service API Key:初测时创建 1 个临时 key 并完成鉴权;其历史清理状态与 Workflow App key 分开记录 +- Workflow 测试 App:`KF-WF-V2-LIVE-CESHI-20260811`、`KF-WF-V2-UNRESOLVED-20260811`、`KF-WF-V2-QA-20260811` +- Workflow App API Key:已临时创建用于 blocking/streaming;测试后已删除,同 key 立即返回 401,完整 secret 未写入报告 +- Workflow channel:初测部署的运行证据表明该通道关闭或不可用,且 Settings UI 当时无可发现开关;当前代码已增加独立 `workflow_enabled` 控件,但尚未部署复测。QA API Access 按合同仅控制 Service/Agent、保留 Workflow 现值;本轮临时开启后已恢复关闭 QA 空间的 Fast 和 Deep 各执行过一次 0 文档检索并正常返回 0 分段;这些“记录”刷新后不再显示。Research 单次执行没有生成可见记录。 @@ -61,61 +67,75 @@ QA 空间的 Fast 和 Deep 各执行过一次 0 文档检索并正常返回 0 ## 4. 已确认缺陷 -| 编号 | 优先级 | 模块 | 摘要 | 状态 | -|---|---|---|---|---| -| KF-BUG-001 | P1 / Major | Retrieval | Fast/Deep 单次开始或重试生成两条记录/任务 | 已修复;WTA-1914 Done | -| KF-BUG-002 | P1 / Major | Create | 41 字名称可提交,后端拒绝后误报“权限” | 已修复;WTA-1915 Done | -| KF-BUG-003 | P1 / Major | Settings | 2001 字描述可提交,后端拒绝后误报“网络” | 已修复;WTA-1916 Done | -| KF-BUG-004 | P1 / Major | Error handling | 不存在空间的 404 toast 暴露后端 API 路由 | 已修复;WTA-1917 Done | -| KF-BUG-005 | P1 / Major | Website source | 抓取页数显示值与实际提交值静默不一致 | 已修复;WTA-1918 Done | -| KF-BUG-006 | P2 / Major | Document detail | 详情内容已加载时同时出现 3 条相同英文 404 toast | 已修复;WTA-1919 Done | -| KF-BUG-007 | P2 / Major | Metadata | 详情页点击“编辑”后按钮永久禁用,无编辑器和反馈 | 已修复;WTA-1920 Done | -| KF-BUG-008 | P2 / Normal | Quality | 必填错误在输入合法值后不消失,查找证据只报“未知错误” | 已修复;WTA-1921 Done | -| KF-BUG-009 | P2 / Normal | External API | 非法 endpoint 同时弹出两条错误,中英混用 | 已修复;WTA-1922 Done | -| KF-BUG-010 | P3 / Minor | Retrieval | 有大量历史记录时仍显示“暂无测试记录” | 已修复;WTA-1923 Done | -| KF-BUG-011 | P3 / Minor | List | 搜索无结果时列表全空,无“无结果”解释和清除指引 | 已修复;WTA-1924 Done | -| KF-BUG-012 | P3 / Usability | Responsive | 390 px 下顶部功能导航超出视口,“设置”无明显可达性提示 | 已修复;WTA-1925 Done | -| KF-BUG-013 | P2 / Normal | Service API | Key 已成功鉴权调用 200,密钥列表“最后使用”仍持续显示“从未” | 已修复;WTA-1926 Done | -| KF-BUG-014 | P1 / Major | Document upload | 合法 TXT/Markdown staged upload 全部报 `Internal Server Error`,0 文档 | 复测阻塞:staging 已成功,claim 端点 404;WTA-1928 未关闭 | -| KF-BUG-015 | P1 / Major | Upload validation | 0 B 文件被计为有效并启用提交,422 仅显示英文通用错误 | 已修复;WTA-1929 Done | -| KF-BUG-016 | P2 / Major | Upload recovery | 精确 15 MiB 上传 43+ 秒持续“正在上传…”,无超时/失败收敛 | 已修复;WTA-1930 Done | -| KF-BUG-017 | P1 / Major | Quality CSV | 合法 2 行 CSV 预览正确,提交只报“未知错误”且 0 行落库 | 已修复;WTA-1931 Done | -| KF-BUG-018 | P1 / Major | KnowledgeFS API | API Access 已启用但侧栏仅弹空白“不可用”,无 KFS 凭据路径 | 已修复;WTA-1932 Done | -| KF-BUG-019 | P1 / Major | Research | 空库 Research 单次启动后无任务、阶段、结果或错误反馈 | 已修复;WTA-1933 Done | +| 编号 | 优先级 | 模块 | 摘要 | 状态 | +| ---------- | -------------- | ---------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------- | +| KF-BUG-001 | P1 / Major | Retrieval | Fast/Deep 单次开始或重试生成两条记录/任务 | 已修复;WTA-1914 Done | +| KF-BUG-002 | P1 / Major | Create | 41 字名称可提交,后端拒绝后误报“权限” | 已修复;WTA-1915 Done | +| KF-BUG-003 | P1 / Major | Settings | 2001 字描述可提交,后端拒绝后误报“网络” | 已修复;WTA-1916 Done | +| KF-BUG-004 | P1 / Major | Error handling | 不存在空间的 404 toast 暴露后端 API 路由 | 已修复;WTA-1917 Done | +| KF-BUG-005 | P1 / Major | Website source | 抓取页数显示值与实际提交值静默不一致 | 已修复;WTA-1918 Done | +| KF-BUG-006 | P2 / Major | Document detail | 详情内容已加载时同时出现 3 条相同英文 404 toast | 已修复;WTA-1919 Done | +| KF-BUG-007 | P2 / Major | Metadata | 详情页点击“编辑”后按钮永久禁用,无编辑器和反馈 | 已修复;WTA-1920 Done | +| KF-BUG-008 | P2 / Normal | Quality | 必填错误在输入合法值后不消失,查找证据只报“未知错误” | 已修复;WTA-1921 Done | +| KF-BUG-009 | P2 / Normal | External API | 非法 endpoint 同时弹出两条错误,中英混用 | 已修复;WTA-1922 Done | +| KF-BUG-010 | P3 / Minor | Retrieval | 有大量历史记录时仍显示“暂无测试记录” | 已修复;WTA-1923 Done | +| KF-BUG-011 | P3 / Minor | List | 搜索无结果时列表全空,无“无结果”解释和清除指引 | 已修复;WTA-1924 Done | +| KF-BUG-012 | P3 / Usability | Responsive | 390 px 下顶部功能导航超出视口,“设置”无明显可达性提示 | 已修复;WTA-1925 Done | +| KF-BUG-013 | P2 / Normal | Service API | Key 已成功鉴权调用 200,密钥列表“最后使用”仍持续显示“从未” | 已修复;WTA-1926 Done | +| KF-BUG-014 | P1 / Major | Document upload | 合法 TXT/Markdown staged upload 全部报 `Internal Server Error`,0 文档 | 复测阻塞:staging 已成功,claim 端点 404;WTA-1928 未关闭 | +| KF-BUG-015 | P1 / Major | Upload validation | 0 B 文件被计为有效并启用提交,422 仅显示英文通用错误 | 已修复;WTA-1929 Done | +| KF-BUG-016 | P2 / Major | Upload recovery | 精确 15 MiB 上传 43+ 秒持续“正在上传…”,无超时/失败收敛 | 已修复;WTA-1930 Done | +| KF-BUG-017 | P1 / Major | Quality CSV | 合法 2 行 CSV 预览正确,提交只报“未知错误”且 0 行落库 | 已修复;WTA-1931 Done | +| KF-BUG-018 | P1 / Major | KnowledgeFS API | API Access 已启用但侧栏仅弹空白“不可用”,无 KFS 凭据路径 | 已修复;WTA-1932 Done | +| KF-BUG-019 | P1 / Major | Research | 空库 Research 单次启动后无任务、阶段、结果或错误反馈 | 已修复;WTA-1933 Done | +| KF-BUG-020 | P1 / Major | Workflow v2 UI | 从节点选择器新增 KnowledgeFS 检索后主编辑区空白,未处理 `AbortError` | 已修复;WTA-1954 Done;待部署后真实 Chrome 复测 | +| KF-BUG-021 | P1 / Blocker | Workflow v2 runtime | Settings UI 无 Workflow channel 开关;channel/permissions 失败统一误报未绑定 | 已修复;WTA-1953 Done;待部署后真实运行复测 | +| KF-BUG-022 | P1 / Major | Workflow v2 filters | `created_after` / `created_before` 保存后静默丢失 | 已建单;WTA-1956 Backlog | +| KF-BUG-023 | P2 / Normal | Workflow v2 filters | 最后一个 node kind 无法取消 | 已建单;WTA-1955 Backlog | +| KF-BUG-024 | P2 / Normal | Workflow v2 validation | 未解析空间在草稿无持久警告,发布才显示原始英文与内部 ID | 已建单;WTA-1957 Backlog | ### 4.1 修复验证 - Web:14 个所属功能 spec、507 个测试全部通过;全量 `pnpm type-check` 通过。 - Dify API:5 个相关测试文件、172 个测试全部通过;目标 Ruff 检查通过。 - KnowledgeFS API:Golden Question gateway 回归 5/5 通过;API package TypeScript 检查通过。 +- Workflow v2 Web:6 个关联 spec 文件整体 22/22 通过,其中 16 项为 v2 直接断言、6 项为同一 hook spec 的通用节点元数据用例。 +- Workflow v2 Dify API:节点、admission、binding、execution、capability、broker、runtime、DTO、operation、controller 与 remote HTTP 共 13 个关联文件,文件整体 340/340 通过;部分 controller/DTO/remote 用例并非 v2 专属。这些仍是 mocked/fake/mock HTTP/进程内合同,不替代真实 KFS 正向链路。 +- KF-BUG-020 专项:更宽的 Workflow 组合回归为 9 个 spec、27 个测试通过;回归证明 history 引用变化后 Workflow 子树仍保持挂载。根因是通用 `WorkflowHistoryStoreInitializer` 在约 500 ms 的 history 保存产生新对象后返回空内容并卸载整棵子树,Console `AbortError` 是查询观察者随卸载取消的后果,而非 KnowledgeFS 请求根因。 +- KF-BUG-020/021 最终组合:Web 7 个 spec、70 个测试通过,Dify API admission/node 18 个测试通过;全量 Web TypeScript 检查及目标 locale ESLint 通过。覆盖独立 Workflow Access 保存/失败回滚、四类 admission 错误、稳定 marker、运行表面映射与 24 个 locale 本地化。上述结果均为本地分层自动化,尚未替代部署后的真实 Chrome/Web/Service 正向召回。 - 补丁完整性:`git diff --check` 通过;本轮未创建 Git commit。 -- Linear:18 个已验证缺陷均更新为 `Done` 并指派给 `jyong`;WTA-1928 保持未关闭并继续归属 Milestone `测试联调`。 +- Linear:KF-BUG-020 / WTA-1954 与 KF-BUG-021 / WTA-1953 均已更新为 `Done` 并指派给 `jyong`;KF-BUG-022~024 分别为 WTA-1956、WTA-1955、WTA-1957,状态保持 `Backlog`。五项均归属项目 `Make RAG Great Again`、Milestone `测试联调`;WTA-1928 仍保持未关闭。 ### 4.2 Linear Issue 映射 以下缺陷均已创建到 Linear 项目 [Make RAG Great Again](https://linear.app/dify/project/make-rag-great-again-b9f26b73ca33/issues),Team 为 `WTA`,初始状态为 `Backlog`,Milestone 为 `测试联调`。优先级映射为 P1 → High、P2 → Medium、P3 → Low。 -| 缺陷 | Linear Issue | Linear 优先级 | -|---|---|---| -| KF-BUG-001 | [WTA-1914](https://linear.app/dify/issue/WTA-1914) | High | -| KF-BUG-002 | [WTA-1915](https://linear.app/dify/issue/WTA-1915) | High | -| KF-BUG-003 | [WTA-1916](https://linear.app/dify/issue/WTA-1916) | High | -| KF-BUG-004 | [WTA-1917](https://linear.app/dify/issue/WTA-1917) | High | -| KF-BUG-005 | [WTA-1918](https://linear.app/dify/issue/WTA-1918) | High | -| KF-BUG-006 | [WTA-1919](https://linear.app/dify/issue/WTA-1919) | Medium | -| KF-BUG-007 | [WTA-1920](https://linear.app/dify/issue/WTA-1920) | Medium | -| KF-BUG-008 | [WTA-1921](https://linear.app/dify/issue/WTA-1921) | Medium | -| KF-BUG-009 | [WTA-1922](https://linear.app/dify/issue/WTA-1922) | Medium | -| KF-BUG-010 | [WTA-1923](https://linear.app/dify/issue/WTA-1923) | Low | -| KF-BUG-011 | [WTA-1924](https://linear.app/dify/issue/WTA-1924) | Low | -| KF-BUG-012 | [WTA-1925](https://linear.app/dify/issue/WTA-1925) | Low | -| KF-BUG-013 | [WTA-1926](https://linear.app/dify/issue/WTA-1926) | Medium | -| KF-BUG-014 | [WTA-1928](https://linear.app/dify/issue/WTA-1928) | High | -| KF-BUG-015 | [WTA-1929](https://linear.app/dify/issue/WTA-1929) | High | -| KF-BUG-016 | [WTA-1930](https://linear.app/dify/issue/WTA-1930) | Medium | -| KF-BUG-017 | [WTA-1931](https://linear.app/dify/issue/WTA-1931) | High | -| KF-BUG-018 | [WTA-1932](https://linear.app/dify/issue/WTA-1932) | High | -| KF-BUG-019 | [WTA-1933](https://linear.app/dify/issue/WTA-1933) | High | +| 缺陷 | Linear Issue | Linear 优先级 | 状态 | +| ---------- | -------------------------------------------------- | ------------- | ---------------- | +| KF-BUG-001 | [WTA-1914](https://linear.app/dify/issue/WTA-1914) | High | Done | +| KF-BUG-002 | [WTA-1915](https://linear.app/dify/issue/WTA-1915) | High | Done | +| KF-BUG-003 | [WTA-1916](https://linear.app/dify/issue/WTA-1916) | High | Done | +| KF-BUG-004 | [WTA-1917](https://linear.app/dify/issue/WTA-1917) | High | Done | +| KF-BUG-005 | [WTA-1918](https://linear.app/dify/issue/WTA-1918) | High | Done | +| KF-BUG-006 | [WTA-1919](https://linear.app/dify/issue/WTA-1919) | Medium | Done | +| KF-BUG-007 | [WTA-1920](https://linear.app/dify/issue/WTA-1920) | Medium | Done | +| KF-BUG-008 | [WTA-1921](https://linear.app/dify/issue/WTA-1921) | Medium | Done | +| KF-BUG-009 | [WTA-1922](https://linear.app/dify/issue/WTA-1922) | Medium | Done | +| KF-BUG-010 | [WTA-1923](https://linear.app/dify/issue/WTA-1923) | Low | Done | +| KF-BUG-011 | [WTA-1924](https://linear.app/dify/issue/WTA-1924) | Low | Done | +| KF-BUG-012 | [WTA-1925](https://linear.app/dify/issue/WTA-1925) | Low | Done | +| KF-BUG-013 | [WTA-1926](https://linear.app/dify/issue/WTA-1926) | Medium | Done | +| KF-BUG-014 | [WTA-1928](https://linear.app/dify/issue/WTA-1928) | High | 未关闭 | +| KF-BUG-015 | [WTA-1929](https://linear.app/dify/issue/WTA-1929) | High | Done | +| KF-BUG-016 | [WTA-1930](https://linear.app/dify/issue/WTA-1930) | Medium | Done | +| KF-BUG-017 | [WTA-1931](https://linear.app/dify/issue/WTA-1931) | High | Done | +| KF-BUG-018 | [WTA-1932](https://linear.app/dify/issue/WTA-1932) | High | Done | +| KF-BUG-019 | [WTA-1933](https://linear.app/dify/issue/WTA-1933) | High | Done | +| KF-BUG-020 | [WTA-1954](https://linear.app/dify/issue/WTA-1954) | High | Done;待部署实测 | +| KF-BUG-021 | [WTA-1953](https://linear.app/dify/issue/WTA-1953) | High | Done;待部署实测 | +| KF-BUG-022 | [WTA-1956](https://linear.app/dify/issue/WTA-1956) | High | Backlog | +| KF-BUG-023 | [WTA-1955](https://linear.app/dify/issue/WTA-1955) | Medium | Backlog | +| KF-BUG-024 | [WTA-1957](https://linear.app/dify/issue/WTA-1957) | Medium | Backlog | ### KF-BUG-001:Fast/Deep 单次操作重复提交 @@ -233,37 +253,38 @@ QA 空间的 Fast 和 Deep 各执行过一次 0 文档检索并正常返回 0 ## 5. 环境问题、受限项与待复测风险 -| 编号 | 现象 | 当前判定 | 下一步 | -|---|---|---|---| -| ENV-001 | 页面显示模型消息额度为 0;既有 `ceshi` 的 Fast/Deep 均 `Query generation failed` | 更像模型/额度环境阻塞;QA 空库 Fast/Deep 的 0 结果链路可用 | 补充可用模型额度后复测真实答案和引用 | -| ENV-002 | 既有库 Research 流式步骤可见,最终“检索失败/未召回分段” | 链路启动正常,语料/模型不可用;QA 空库另有静默失败缺陷 | 文件上传并建立索引后复测 | -| ENV-003 | Firecrawl 对 `https://example.com` 36+ 秒仍 0 页 | 未能区分 provider/网络/产品超时 | 有 provider 观测日志时复测;本轮 Stop 状态流转正常 | -| ENV-004 | Jina Reader 显示“集成未安装” | 环境能力缺失,非功能缺陷 | 安装并配置凭据后测试 | -| ENV-005 | Chrome 扩展最初拒绝文件选择 | **已解决**:用户开启 file URL 访问后,多文件、Unicode 和 15 MiB 文件均可交给页面 | 无;后续失败已确认发生在应用 staging 层 | -| RISK-001 | 列表搜索实现可能只过滤已加载页 | 代码侧候选风险,当前只有 6 个空间无法实证 | 准备超过一页的数据后搜索末页项 | -| RISK-002 | 旧版 segment 无 `attachment_ids` 可能接口 500 但数据部分落库 | 后端静态审查候选 | 在可清理的 legacy 测试库通过 UI/API 复测 | -| RISK-003 | 旧版 metadata rename/delete 可能吞异常后表面成功 | 后端静态审查候选 | 每次操作后刷新并核对真实 metadata | -| RISK-004 | 删除仍被 App 使用的 legacy dataset 可能未调用 use-check | 后端静态审查候选 | 使用专用 App+dataset 验证防误删 | +| 编号 | 现象 | 当前判定 | 下一步 | +| -------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------- | +| ENV-001 | 页面显示模型消息额度为 0;既有 `ceshi` 的 Fast/Deep 均 `Query generation failed` | 更像模型/额度环境阻塞;QA 空库 Fast/Deep 的 0 结果链路可用 | 补充可用模型额度后复测真实答案和引用 | +| ENV-002 | 既有库 Research 流式步骤可见,最终“检索失败/未召回分段” | 链路启动正常,语料/模型不可用;QA 空库另有静默失败缺陷 | 文件上传并建立索引后复测 | +| ENV-003 | Firecrawl 对 `https://example.com` 36+ 秒仍 0 页 | 未能区分 provider/网络/产品超时 | 有 provider 观测日志时复测;本轮 Stop 状态流转正常 | +| ENV-004 | Jina Reader 显示“集成未安装” | 环境能力缺失,非功能缺陷 | 安装并配置凭据后测试 | +| ENV-005 | Chrome 扩展最初拒绝文件选择 | **已解决**:用户开启 file URL 访问后,多文件、Unicode 和 15 MiB 文件均可交给页面 | 无;后续失败已确认发生在应用 staging 层 | +| RISK-001 | 列表搜索实现可能只过滤已加载页 | 代码侧候选风险,当前只有 6 个空间无法实证 | 准备超过一页的数据后搜索末页项 | +| RISK-002 | 旧版 segment 无 `attachment_ids` 可能接口 500 但数据部分落库 | 后端静态审查候选 | 在可清理的 legacy 测试库通过 UI/API 复测 | +| RISK-003 | 旧版 metadata rename/delete 可能吞异常后表面成功 | 后端静态审查候选 | 每次操作后刷新并核对真实 metadata | +| RISK-004 | 删除仍被 App 使用的 legacy dataset 可能未调用 use-check | 后端静态审查候选 | 使用专用 App+dataset 验证防误删 | ## 6. 已执行功能覆盖 下表记录初始真实环境测试结果,用于保留原始证据;修复后的最新状态以第 4 节为准。 -| 功能域 | 已实测内容 | 结果 | -|---|---|---| -| 入口/路由 | `/datasets?view=new`、Legacy/New 切换、刷新、列表回显、不存在 ID 深链 | 主流程通过;404 toast 有泄露问题 | -| 列表 | 大小写不敏感搜索、无结果、创建者筛选/搜索/重置、新库排序 | 通过;无结果缺少空状态 | -| 创建 | 空库、名称空白/41/精确40字、描述、only_me、异步加载后进入 Sources | 合法创建通过;超长校验失败 | -| 概览 | 无数据 onboarding、24h/30d 指标、需关注分页、最近活动抽屉与运营者筛选、资产图谱 | 通过 | -| 数据源目录 | Website/Online Documents/Drive,Firecrawl/Jina/WaterCrawl/Notion/Google Docs/Confluence/Drive/OneDrive/S3 入口 | 目录可用;部分集成未安装 | -| Website | URL 格式、抓取选项、最大页数边界、实际 Firecrawl preview、Stop、Retry 入口、草稿离开确认 | Stop 通过;页数校验失败;preview 环境阻塞 | -| 文档列表/上传 | Ready/Failed 筛选、搜索、无结果、任务抽屉、选择/批量操作、行菜单、重命名;真实 TXT/MD/Unicode/0 B/15 MiB/15 MiB+1/`.exe` | 列表主流程通过;合法 staging 失败、空文件校验和大文件恢复异常 | -| 文档详情 | 内容加载、metadata 区、编辑入口 | 内容加载成功,同时有重复 404;metadata 编辑异常 | -| Retrieval | 空白输入、2000 字 UI 上限属性、Fast/Deep/Research,Start、Retry、记录、空库 0 结果、Research 流式阶段 | QA Fast/Deep 空结果通过;既有库重复/额度失败;QA Research 静默 | -| Quality | 空状态、参考问题/问题案例 tab、新建必填校验、创建草稿、编辑、选择、2 行 CSV 预览与提交 | 创建/编辑与 CSV 解析通过;CSV 提交未知错误、校验清除异常 | -| Settings | 名称 40/41、描述 2000/2001、可见权限、partial 零成员、API Access off/on/off 持久化、Fast/Deep、Top K 0/1/10/11、Rerank/threshold 依赖 | API Access 已恢复 off;描述超长错误处理失败 | -| API 入口 | External Knowledge API;Dataset Service API key 创建/正负鉴权;KFS admission Web/API 域名;空间 API Access | Dataset key 200/错误 key 401;KFS admission 对旧 key 返回结构化 401;空间 API 面板不可用;最后使用不更新 | -| 响应式 | 390×844 下上传页、顶部功能导航 | 内容可用;导航超出视口待改进 | +| 功能域 | 已实测内容 | 结果 | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 入口/路由 | `/datasets?view=new`、Legacy/New 切换、刷新、列表回显、不存在 ID 深链 | 主流程通过;404 toast 有泄露问题 | +| 列表 | 大小写不敏感搜索、无结果、创建者筛选/搜索/重置、新库排序 | 通过;无结果缺少空状态 | +| 创建 | 空库、名称空白/41/精确40字、描述、only_me、异步加载后进入 Sources | 合法创建通过;超长校验失败 | +| 概览 | 无数据 onboarding、24h/30d 指标、需关注分页、最近活动抽屉与运营者筛选、资产图谱 | 通过 | +| 数据源目录 | Website/Online Documents/Drive,Firecrawl/Jina/WaterCrawl/Notion/Google Docs/Confluence/Drive/OneDrive/S3 入口 | 目录可用;部分集成未安装 | +| Website | URL 格式、抓取选项、最大页数边界、实际 Firecrawl preview、Stop、Retry 入口、草稿离开确认 | Stop 通过;页数校验失败;preview 环境阻塞 | +| 文档列表/上传 | Ready/Failed 筛选、搜索、无结果、任务抽屉、选择/批量操作、行菜单、重命名;真实 TXT/MD/Unicode/0 B/15 MiB/15 MiB+1/`.exe` | 列表主流程通过;合法 staging 失败、空文件校验和大文件恢复异常 | +| 文档详情 | 内容加载、metadata 区、编辑入口 | 内容加载成功,同时有重复 404;metadata 编辑异常 | +| Retrieval | 空白输入、2000 字 UI 上限属性、Fast/Deep/Research,Start、Retry、记录、空库 0 结果、Research 流式阶段 | QA Fast/Deep 空结果通过;既有库重复/额度失败;QA Research 静默 | +| Quality | 空状态、参考问题/问题案例 tab、新建必填校验、创建草稿、编辑、选择、2 行 CSV 预览与提交 | 创建/编辑与 CSV 解析通过;CSV 提交未知错误、校验清除异常 | +| Settings | 名称 40/41、描述 2000/2001、可见权限、partial 零成员、API Access off/on/off 持久化、Fast/Deep、Top K 0/1/10/11、Rerank/threshold 依赖 | API Access 已恢复 off;描述超长错误处理失败 | +| API 入口 | External Knowledge API;Dataset Service API key 创建/正负鉴权;KFS admission Web/API 域名;空间 API Access | Dataset key 200/错误 key 401;KFS admission 对旧 key 返回结构化 401;空间 API 面板不可用;最后使用不更新 | +| Workflow Knowledge Retrieval v2 | 节点可见、DSL 导入/导出、空间搜索与 1/6 选择、四种 mode 表面、Top N、filters、输出变量、16000/16001 查询、发布/版本/binding、完整/单步/Web/Service blocking/streaming、日志、key 撤销 | 初测配置和控制面大部通过并确认 KF-BUG-020~024;020/021 已完成代码修复和专项回归,022~024 Backlog;真实召回仍待部署及 channel/permissions-ready 环境复测 | +| 响应式 | 390×844 下上传页、顶部功能导航 | 内容可用;导航超出视口待改进 | ## 7. 暂未执行的破坏性/需授权用例 @@ -274,6 +295,7 @@ QA 空间的 Fast 和 Deep 各执行过一次 0 文档检索并正常返回 0 3. 基础 Quality CSV 初测可预览但无法导入;KF-BUG-017 的“匹配能力不可用时保存草稿”已完成代码修复和 API 回归。500/501 行、1 MiB 边界、中文表头和部分错误恢复仍需部署后实链路复测。 4. QA API Access on/off 与恢复已完成。KF-BUG-018 已补齐 KnowledgeFS 专属 credential 的创建、列表、撤销及 admission endpoint 说明;部署后仍需在真实环境执行两步 admission+SSE,现有 Dataset Service API Key 按安全边界继续应被 401 拒绝。 5. 永久清理仍需操作前确认:删除 1 条参考问题、1 个已停止 Firecrawl 草稿和整个 QA 空间;撤销临时 Dataset Service API Key。 +6. Workflow v2 的 KF-BUG-020/021 修复需先部署,再在 Settings 启用 `workflow_enabled=true`,并提供 permissions ready、Capability v2 可达且含已索引唯一 marker 的空间,才能执行 WF2-LIVE-001~015;WF2-LIVE-016~018 需先定义/实现取消、error strategy 和 retry 支持。当前不能把专项单元/组件测试记作这些真实运行断言的端到端通过。 ## 8. 自动化覆盖现状 @@ -281,12 +303,16 @@ QA 空间的 Fast 和 Deep 各执行过一次 0 文档检索并正常返回 0 - Dify 后端 KnowledgeFS 相关约 511 个 Python test function,但 `api/tests/integration_tests` 没有真实 KnowledgeFS 集成链路覆盖。 - 独立 `knowledge-fs/` 约 4131 个 TypeScript test declaration,大部分 E2E 仍使用 in-memory/fake/stub。 - 现有 Cucumber 只覆盖旧 Dataset API 和少量 Knowledge Retrieval 节点,没有 `/datasets?view=new` 的真实 Chrome E2E。 +- 本轮已执行 6 个 Workflow v2 Web 关联 spec(文件整体 22/22,其中 16 项为 v2 直接断言)和 13 个 Dify API 关联测试文件(文件整体 340/340,部分非 v2 专属);仍未发现真实 Workflow → App admission/capability → KnowledgeFS `/retrieval-tests` 的跨服务 E2E。 - 结论:当前最大缺口是登录态真实 Chrome + Dify BFF + KnowledgeFS + 对象存储 + 解析/索引 + 模型 + provider 的跨服务链路。 ## 9. 发布建议 -1. 发布门禁继续阻断唯一未完成的 KF-BUG-014:部署当前 API 后必须通过 TXT/Markdown `staging → claim 202 → ready`。KF-BUG-001–013、015–019 已完成代码修复与所属层回归,仍应随同部署进行关键真实链路复测。 +1. KF-BUG-014 仍是全量发布门禁,需通过 TXT/Markdown `staging → claim 202 → ready`。Workflow v2 的 KF-BUG-020/021 已完成代码修复,但发布前仍必须部署后用真实 Chrome 验证新增节点持续可见,并在启用的 Workflow channel 上由 Web/Service 返回唯一 marker 与 citation;KF-BUG-022 的时间过滤静默丢失也应在发布前修复。 2. 为所有 KnowledgeFS API 建立统一的错误码→本地化字段错误映射,不直接显示后端原始 message。 3. 为 query admission/stream 和 UI Start/Retry 增加端到端幂等性用例,以记录 ID、trace ID 和计费事件三重断言“一次操作只有一次执行”。 4. 为新版列表、创建、文件上传、真实索引、Fast/Deep/Research 引用、Quality replay 增加 Playwright/Cucumber 浏览器回归。 5. 在测试环境配置一个有额度的固定模型和一个稳定的合成 provider,避免功能回归长期被“额度为 0”阻塞。 +6. 为 Workflow v2 建立登录态 E2E:创建节点并等待超过 history 保存窗口 → 确认编辑器未卸载 → 选择空间 → 启用 Workflow Access → 发布 → Web/Service 执行 → 断言每空间恰好一次 JSON `/retrieval-tests` → 核对 marker/citation → 撤权后旧 capability 立即失败;并覆盖四类 admission marker 的本地化展示。 +7. 明确 Workflow v2 是否支持 stop/cancel、fail-branch/default-value 和 retry;若支持,先补 cancellation signal 与节点 allowlist,再执行 WF2-LIVE-016~018;若不支持,应在产品文档和 UI 中明确说明。 +8. 修复并回归 `KNOWLEDGE_FS_BASE_URL` 未配置时的节点错误边界:composition root 会 fail closed,但当前 `_service()`/draft runtime 解析可能绕过 v2 的受控错误映射。 diff --git a/test-results/knowledge-fs/2026-08-11/knowledge-retrieval-v2-functional-test-report.md b/test-results/knowledge-fs/2026-08-11/knowledge-retrieval-v2-functional-test-report.md new file mode 100644 index 00000000000..8f11dc3324a --- /dev/null +++ b/test-results/knowledge-fs/2026-08-11/knowledge-retrieval-v2-functional-test-report.md @@ -0,0 +1,223 @@ +# Workflow Knowledge Retrieval v2 / KnowledgeFS 功能补测报告 + +## 1. 结论 + +本轮已把原报告中 `TC-RE-022`、`TC-AU-015`、`TC-AU-016` 对应的 Workflow `knowledge-retrieval-v2` 未测试范围扩展为独立矩阵,并完成真实 Chrome、已发布 Web App、Workflow Service API blocking/streaming、DSL、发布绑定和自动化合同测试。 + +已验证可用的部分:节点可见性、有效 DSL 导入/导出、刷新恢复、查询变量绑定、空间搜索与多选、Fast/Deep/Research/跟随空间的配置保存、Top N、绝大多数 metadata filter 的配置持久化、输出变量、空白与 16000/16001 查询边界、未解析空间发布拦截、Workflow 发布版本、绑定精确同步、运行日志,以及 Service API 失败响应合同。真实 mode 与 filter 召回效果未通过,仍属于后文 `ENV-BLOCKED`。 + +初测环境仍不能判定 Workflow KnowledgeFS retrieval 可用。有效 Workflow 发布成功后,KnowledgeFS Overview 的“关联应用”为 `1`,证明绑定记录已经创建;但当时草稿完整运行、单节点运行、已发布 Web App、Service API blocking 和 Service API streaming 全部稳定失败为: + +```text +KnowledgeFS Space is not bound to this workflow +``` + +QA 空间的 API Access 临时开启/恢复也已测试;按合同该开关只控制 Service API 与 Agent、会保留原 `workflow_enabled`,因此它不应解除 Workflow 阻塞,也不作为 runtime 缺陷证据。初测部署的 Settings UI 没有可发现的 Workflow channel 开关,Overview 同时显示 `Knowledge-space permissions are not ready`。因此真实 Fast/Deep/Research 召回、引用、真实 filters、多空间合并和 capability 撤权继续标记为 `ENV-BLOCKED`,不能用 mock 单测冒充通过。 + +本轮新增 5 个已确认缺陷:`KF-BUG-020`~`KF-BUG-024`,均已创建到 Linear 项目 `Make RAG Great Again`、Milestone `测试联调`。KF-BUG-020/021 已完成代码修复、专项自动化回归和 Linear 关闭;KF-BUG-022~024 保持 Backlog。020 修复了通用 Workflow history 初始化器卸载子树的问题;021 增加独立 Workflow Access 控件、细分 admission 原因,并将稳定错误 marker 映射为 24 个 locale 的本地化消息。两项修复尚未部署到测试环境,所以下文保留原始浏览器 FAIL,且仍需真实 Chrome/Web/Service 正向复测。 + +## 2. 环境与测试对象 + +- Console:`https://new-rag.dify.dev` +- Web App:`https://new-rag-app.dify.dev` +- Service API:`https://new-rag-api.dify.dev/v1` +- 浏览器:用户已登录的 Google Chrome +- 角色:Workspace Owner +- 有效测试 Workflow:`KF-WF-V2-LIVE-CESHI-20260811` +- App ID:`98bcd2c4-e371-405f-a972-d21bb41b5fa2` +- 未解析空间 Workflow:`KF-WF-V2-UNRESOLVED-20260811` +- App ID:`5c6687c6-4b30-4abf-81e2-efc4d9fa1514` +- UI 新增节点复现 Workflow:`KF-WF-V2-QA-20260811` +- App ID:`fbed98e7-5370-4eca-a2a9-f128ce69a50e` +- 既有空间 `ceshi`:`019fac9f-bfb0-75ee-9af5-252ebafbac1c` +- QA 空间:`019fef0d-732b-73d4-95e6-e943be794403` +- 当前 workspace 仅有 6 个可选空间;线上 10/11 空间边界由组件和后端合同测试补齐。 +- 有效 DSL fixture:[kf-wf-v2-live-ceshi.yml](./test-data/kf-wf-v2-live-ceshi.yml) +- 未解析空间 fixture:[kf-wf-v2-unresolved-space.yml](./test-data/kf-wf-v2-unresolved-space.yml) + +## 3. 已执行矩阵 + +| ID | P | 场景 | 期望 | 结果 | +| ------- | --- | ----------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| WF2-001 | P0 | feature 开启时打开添加节点面板 | 显示“KnowledgeFS 检索” | PASS | +| WF2-002 | P0 | Start 后从节点选择器点击“KnowledgeFS 检索” | 创建节点并打开配置面板 | **初测 FAIL**;主编辑区变为空白,未处理 `AbortError`,见 KF-BUG-020;代码已修复并通过专项回归,待部署后真实 Chrome 复测 | +| WF2-003 | P0 | 打开通过 DSL 已存在的 v2 节点 | 配置面板正常加载 | PASS;6 个空间、当前选择和 settings 摘要正常 | +| WF2-004 | P0 | 导入 Start→v2→End 合法 DSL | 创建 Workflow,保留 v2 节点 | PASS | +| WF2-005 | P0 | 导入后刷新 | 图、空间、模式、Top N 和 End 映射恢复 | PASS | +| WF2-006 | P0 | 导出已保存 DSL | 保留 `control_space_ids`、filters、mode、top_n、result 输出 | PASS | +| WF2-007 | P0 | 导入引用不存在空间的 DSL | 草稿可导入,但明确保留 unresolved warning | **FAIL-PARTIAL**;导入成功,面板和检查清单无持久警告,见 KF-BUG-024 | +| WF2-008 | P0 | 发布未解析空间 Workflow | 发布失败且不创建 published snapshot | PASS;保持“未发布”,明确列出缺失 ID | +| WF2-009 | P0 | 运行未解析空间草稿 | fail closed,不触碰 KFS | PASS;`draft binding could not be enabled` | +| WF2-010 | P0 | 绑定 `Start.query` | 面板显示 string selector,刷新不丢失 | PASS | +| WF2-011 | P1 | 搜索空间并清除搜索 | 过滤正确,键盘可清除并恢复列表 | PASS | +| WF2-012 | P0 | 取消全部空间 | `0/10` 且检查清单阻止发布 | PASS;“KnowledgeFS 空间不能为空” | +| WF2-013 | P0 | 选择 1 个和全部 6 个可见空间 | 计数、checked 状态和节点摘要一致 | PASS;`1/10`、`6/10` | +| WF2-014 | P0 | 空间上限 10/11、去重、顺序 | 10 允许,11 拒绝,重复 ID 去重 | PASS-AUTO;当前线上只有 6 个,未伪造 live 10/11 | +| WF2-015 | P0 | Fast、Deep、Research、跟随空间配置 | 均可保存;跟随配置不写字面 `auto` | PASS;刷新验证 Deep,其他模式即时保存验证 | +| WF2-016 | P0 | DSL 使用字面 `mode: auto` | 合同拒绝 | PASS-AUTO;Auto 语义是省略 mode/`space-default` | +| WF2-017 | P0 | Top N = 0/1/100/101 | 仅 1~100 生效 | PASS;0/101 保留原值 5,1/100 精确显示 | +| WF2-018 | P1 | document type/entity/freshness/language/source/tags filters | 逗号值解析、保存、刷新和 DSL 导出一致 | PASS | +| WF2-019 | P0 | created after/before 输入合法 datetime | 保存、刷新和 DSL 导出保留 | **FAIL**;刷新后为空,DSL 无字段,见 KF-BUG-022 | +| WF2-020 | P1 | 同时选择 section/table node kinds | 多选和 DSL 导出一致 | PASS | +| WF2-021 | P1 | 逐个取消 node kinds,最后取消剩余项 | 最后一项也可清除 | **FAIL**;最后一项永久 checked,见 KF-BUG-023 | +| WF2-022 | P0 | 展开输出变量 | 显示 result 与 metrics 完整合同 | PASS;result/content/title/metadata、metrics/mode/total_ms/degradation_flags | +| WF2-023 | P0 | query 仅空格 | trim 后拒绝且 0 token | PASS;`must not be empty` | +| WF2-024 | P0 | query 精确 16000 字符 | 通过长度校验 | PASS;进入下一步绑定校验 | +| WF2-025 | P0 | query 16001 字符 | 在上游调用前拒绝 | PASS;`at most 16000 characters` | +| WF2-026 | P0 | 未发布草稿完整运行 | debugger/account 自动 upsert 所选 binding 后执行 retrieval | **初测 FAIL**;admission 统一返回未绑定,无法从 UI 区分 join、channel 或 permissions 状态,归入 KF-BUG-021;代码已细分错误并本地化,待部署实测 | +| WF2-027 | P0 | 发布合法 Workflow | 创建 published snapshot 并同步 binding | PASS;UI 操作成功,Overview 关联应用 0→1 | +| WF2-028 | P0 | 从 `ceshi` 切到 QA 后发布 | 新 binding active,旧 binding revoke | PASS;`ceshi` 关联应用 1→0 | +| WF2-029 | P0 | 切回 `ceshi` 再发布 | QA 解绑、`ceshi` 恢复且不重复 | PASS;`ceshi` 关联应用恢复为 1 | +| WF2-030 | P1 | 查看版本历史 | 每次发布产生完整快照 | PASS;10:10、10:25、10:27 三个版本可见 | +| WF2-031 | P0 | QA API Access off→on→运行→off | 保存即时,测试后恢复 | PASS;最终 `未启用` | +| WF2-032 | P0 | 发布后完整草稿运行 | 已绑定 Workflow 可检索或准确说明 channel/permission 问题 | **初测 FAIL**;误报未绑定,见 KF-BUG-021;错误分类代码已修复,真实正向召回待部署复测 | +| WF2-033 | P0 | “运行此步骤” | 与完整运行同一绑定/错误合同 | **初测 FAIL-BLOCKED**;稳定误报未绑定,无法到达 KFS;代码已修复,环境阻塞仍未解除 | +| WF2-034 | P0 | 已发布 Web App 运行 | 返回 evidence 或真实 no-result | **初测 FAIL-BLOCKED**;稳定误报未绑定;代码已修复,待部署后真实 Web App 复测 | +| WF2-035 | P0 | Service API blocking | HTTP 200,`data.status/error/outputs` 合同完整 | PASS-NEGATIVE;`failed`、同一绑定错误、`outputs={}`、2 steps、0 tokens | +| WF2-036 | P0 | Service API streaming | workflow/node terminal SSE 顺序和错误一致 | PASS-NEGATIVE;start succeeded,v2 node failed,workflow failed | +| WF2-037 | P0 | 撤销临时 App API key 后重试 | 立即 401 | PASS;完整 secret 未写入报告 | +| WF2-038 | P1 | 日志列表和详情 | Web/API 运行可查,错误与运行一致 | PASS;5 条失败记录,详情显示绑定错误 | +| WF2-039 | P0 | 自动化合同回归 | UI、节点、绑定、capability、remote HTTP 和 operation 测试全绿 | PASS;Web 6 个关联 spec 整体 22/22,API 13 个关联文件整体 340/340 | + +## 4. 当前无法完成但未遗漏的真实运行矩阵 + +下列项目均已准备步骤和断言。WF2-LIVE-001~015 需要先部署 KF-BUG-021 修复,通过新控件设置 `workflow_enabled=true`,并提供 permissions ready、Capability v2 可达、含唯一 marker 且已索引的空间;在此之前仍标记为 15 个 `ENV-BLOCKED`。WF2-LIVE-016 缺少节点到同步 remote 的 cancellation signal;WF2-LIVE-017~018 则因为产品未给 v2 节点开放 error strategy/retry 配置而无法执行,3 个规格/实现阻塞状态不变,不能误归因为环境问题。 + +| ID | 场景与验收标准 | 状态 | +| ------------ | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| WF2-LIVE-001 | Fast 返回唯一 marker、最终 score 和正确 citation | ENV-BLOCKED | +| WF2-LIVE-002 | Deep 返回同一 marker 的深度召回证据 | ENV-BLOCKED | +| WF2-LIVE-003 | Research 仍走同步 JSON evidence retrieval,不创建 Console Research task/SSE | ENV-BLOCKED | +| WF2-LIVE-004 | 省略 mode 使用每个 space Settings;多空间可汇总为 mixed | ENV-BLOCKED | +| WF2-LIVE-005 | 合法无结果查询成功返回 `result=[]`,不是 failed | ENV-BLOCKED | +| WF2-LIVE-006 | 多空间按最终 score 全局排序、全局 top_n、同分稳定 | ENV-BLOCKED | +| WF2-LIVE-007 | tags/document/source/language/freshness/node kind/date filters 真正缩小结果 | ENV-BLOCKED | +| WF2-LIVE-008 | citation 保留 document/version/hash/section/page/offset | ENV-BLOCKED | +| WF2-LIVE-009 | metrics 汇总每空间 mode、候选数、耗时和 degradation | ENV-BLOCKED | +| WF2-LIVE-010 | 每个空间恰好一次 JSON `POST /knowledge-spaces/{id}/retrieval-tests` | ENV-BLOCKED | +| WF2-LIVE-011 | 不调用 KFS `/queries`、SSE 或 Research task | ENV-BLOCKED;静态合同/单测已通过 | +| WF2-LIVE-012 | draft、published Web、Service API、Trigger 对同 snapshot 返回等价 evidence | ENV-BLOCKED | +| WF2-LIVE-013 | binding/channel/revision 撤权在下一次 admission 立即 fail closed | ENV-BLOCKED | +| WF2-LIVE-014 | 已签发旧 capability 在 epoch 变化后被真实 KFS 拒绝 | ENV-BLOCKED | +| WF2-LIVE-015 | 4/10 空间真实并发、超时、无重复 capability/HTTP | ENV-BLOCKED;线上仅 6 个空间 | +| WF2-LIVE-016 | Workflow stop/cancel 对在途 retrieval HTTP 的终止语义 | SPEC/IMPLEMENTATION-BLOCKED;当前节点用同步 ThreadPool/remote,未传 cancellation signal,需先定义并实现语义 | +| WF2-LIVE-017 | v2 节点配置 fail-branch/default-value 后,上游失败按策略继续且暴露受控 `error_type/error_message` | NOT-SUPPORTED/SPEC-BLOCKED;当前 UI 的 error-handle node allowlist 不包含 Knowledge Retrieval v2 | +| WF2-LIVE-018 | v2 节点开启 retry 后,暂态失败严格按次数重试且不会重复 capability/计费 | NOT-SUPPORTED/SPEC-BLOCKED;当前 UI 的 retry node allowlist 不包含 Knowledge Retrieval v2 | + +### 4.1 已补齐的本地边界与故障合同 + +以下项目通过实际运行的 13 个 Dify API 关联测试文件验证,文件整体 340/340 通过;其中 controller/DTO/remote 文件同时包含非 v2 的 KnowledgeFS 用例。它们属于分层自动化结果,不能提升为真实 KFS E2E,但可排除未执行的输入、绑定和 HTTP 错误合同遗漏。 + +| ID | 场景 | 结果 | +| ---------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| WF2-AUTO-001 | space ID trim/去重、1~10 上限、0/11 拒绝;query selector 与 Top N 合同 | PASS-AUTO | +| WF2-AUTO-002 | mode 仅 Fast/Deep/Research/省略;字面 `auto` 拒绝;filters 每类上限和去重 | PASS-AUTO | +| WF2-AUTO-003 | 未绑定、已撤销、错误 app、跨租户、Agent/Workflow channel 关闭时,在 capability/remote I/O 前 fail closed | PASS-AUTO | +| WF2-AUTO-004 | publish binding 创建/重放/重新激活、精确同步、移除空间撤权、目标授权失败整批不变更 | PASS-AUTO | +| WF2-AUTO-005 | debugger/account 自动 upsert 所选 binding;published Web/Service 永不自动补 binding | PASS-AUTO | +| WF2-AUTO-006 | `retrieveEvidence` 精确签发 read capability,并只调用 JSON `POST /knowledge-spaces/{id}/retrieval-tests` | PASS-AUTO | +| WF2-AUTO-007 | HTTP 400/409/413/422 映射 request rejected;404、500、连接失败映射受控错误 | PASS-AUTO | +| WF2-AUTO-008 | 错误 media type、无效 JSON、请求/响应超限、manifest/path/header 不匹配均在边界拒绝并关闭响应 | PASS-AUTO | +| WF2-AUTO-009 | 2xx 响应缺失/畸形 evidence、citation 或 metrics 时 Pydantic 合同拒绝 | PASS-AUTO | +| WF2-AUTO-010 | 多空间全局按 score 合并、同分稳定、全局 Top N、mixed metrics、空结果成功 | PASS-AUTO | +| WF2-AUTO-011 | 多空间并发有界;任一空间 unavailable 时整个节点失败且 `outputs={}`,不泄漏部分结果 | PASS-AUTO | +| WF2-AUTO-012 | Capability v2/cutover 未就绪时在签发前 fail closed | PASS-AUTO | +| WF2-CONTRACT-001 | `KNOWLEDGE_FS_BASE_URL` 未配置时,Workflow v2 对外稳定映射为 RetrievalUnavailable | CONTRACT-GAP;runtime factory 会在 I/O 前失败,但 `_service()`/draft runtime 解析发生在节点内部错误映射之外,不能由现有单测证明公开错误稳定 | + +## 5. 新确认缺陷 + +以下五项均归属 Linear 项目 `Make RAG Great Again`、Milestone `测试联调`。020/021 已完成并指派给 `jyong`;022~024 保持 Backlog。 + +### KF-BUG-020:从节点选择器新增 KnowledgeFS 检索导致 Workflow 主编辑区空白 + +- 严重度:P1 / Major +- Linear:[WTA-1954](https://linear.app/dify/issue/WTA-1954),High,Done +- 复现率:2/2 +- 步骤:空白 Workflow → 选择“用户输入”Start → 添加节点 → 点击“KnowledgeFS 检索”。 +- 实际:`
` 变为空白,侧栏仍在;没有局部错误、Retry 或恢复入口。Console 记录未处理 `AbortError: signal is aborted without reason`。刷新后新增节点未保存。 +- 对照:通过 DSL 已存在的 v2 节点可以打开配置面板,说明故障集中在新增节点生命周期。 +- 根因:并非 KnowledgeFS 节点、collaboration 或查询本身。通用 `WorkflowHistoryStoreInitializer` 订阅 history,并以对象引用变化作为“初始化异常”条件;新增节点触发的 history 保存约 500 ms 后写入新对象,initializer 随即返回空内容并卸载整棵 Workflow 子树。TanStack Query 的 `AbortError` 来自观察者随组件卸载取消,是故障后果。 +- 修复验证:initializer 只在首次 history 注入完成前阻止渲染,后续 history 引用变化不再卸载子树;更宽的 Workflow 组合回归 9 个 spec、27 个测试通过。当前尚未部署,因此未把本地自动化记为真实 Chrome 复测通过。 + +### KF-BUG-021:Settings UI 缺少 Workflow channel 开关,channel/permissions 失败被统一误报为未绑定 + +- 严重度:P1 / Blocker +- Linear:[WTA-1953](https://linear.app/dify/issue/WTA-1953),High,Done;assignee `jyong` +- 证据:发布后 `ceshi` Overview 的关联应用为 1;换空间发布后精确变 0,再切回恢复 1,证明 binding sync 生效。 +- 实际:未发布 debugger/account 草稿会经过自动 upsert 路径,发布图也已有真实 binding;但完整草稿、单步、Web App、Service blocking、Service streaming 都只返回相同“not bound”,无法区分 channel disabled、permissions not ready 与 join 缺失。 +- 影响:初测部署的产品 UI 没有可发现的方式把 Workflow channel 从默认关闭改为开启,Workflow v2 因而无法完成真实召回;统一“not bound”还会把 channel/permission 未就绪误导为 binding sync 失败。QA API Access 仅控制 Service/Agent,按合同不应承担开启 Workflow 的作用。 +- 修复:Settings 增加独立 Workflow Access 开关并保存 `workflow_enabled`,同时保持 API/Agent/MCP 值;失败时回滚完整 access draft,Retry 仍提交原意图。后端 admission 将 binding 未启用、Workflow channel 关闭、space 不可用、authorization 未就绪分为四类,并在节点错误中携带稳定 marker;前端在 Workflow 运行、聊天、Web App/text-generation 等表面映射为 24 个 locale 的本地化消息,未知错误保持原样。 +- 修复验证:020/021 最终 Web 组合 7 个 spec、70 个测试通过;Dify API admission/node 18 个测试通过;全量 Web TypeScript 检查及目标 locale ESLint 通过。真实 Workflow 正向召回仍待部署后验证。 + +### KF-BUG-022:created after/before 过滤器保存后静默丢失 + +- 严重度:P1 / Major +- Linear:[WTA-1956](https://linear.app/dify/issue/WTA-1956),High,Backlog +- 步骤:输入 `2026-01-01T00:00` 和 `2026-12-31T23:59`,等待自动保存并刷新。 +- 实际:输入立即可见;刷新后两个字段为空,导出 DSL 也没有 `created_after/created_before`。其他 filter 同批正常保存。 +- 影响:用户以为时间范围生效,实际检索未应用,可能返回超出预期的数据。 + +### KF-BUG-023:最后一个 node kind filter 无法取消选择 + +- 严重度:P2 / Normal +- Linear:[WTA-1955](https://linear.app/dify/issue/WTA-1955),Medium,Backlog +- 步骤:选择 `section` 与 `table`,再逐个取消。 +- 实际:可以从两项减少为一项,但最后一项重复鼠标点击、键盘 Space、刷新后再点击都保持 checked。 +- 影响:用户无法恢复为“不限制节点类型”,只能重建/修改 DSL。 + +### KF-BUG-024:未解析 KnowledgeFS 空间在草稿中无持久警告,发布才暴露原始英文错误 + +- 严重度:P2 / Normal +- Linear:[WTA-1957](https://linear.app/dify/issue/WTA-1957),Medium,Backlog +- 实际:DSL 导入成功,空间显示为原始 UUID 和 `— · Top K — · 重排 —`,检查清单仍为 0;直到发布才显示英文 `KnowledgeFS Spaces are missing or inactive...`。 +- 影响:导入/迁移后的不可用引用难以及早发现,发布反馈未本地化且直接暴露内部 control-space ID。 + +## 6. 自动化回归 + +### Web + +```text +Test Files 6 passed (6) +Tests 22 passed (22) +``` + +其中 16 项为 v2 直接断言:v2 目录 5 个 spec 共 15 项,加节点元数据 hook 中 1 项 feature-gate 断言;同一 hook spec 的其余 6 项是通用节点元数据用例。覆盖节点注册/feature gate、默认值、card、panel、config helpers、use-config;均使用 mocked query/provider 和 happy-dom,不证明真实新增节点生命周期、发布 binding 或 KFS upstream。 + +### Dify API + +```text +265 passed, 3 warnings in 25.87s +75 passed in 18.88s +``` + +前一组覆盖 v2 node、publish binding event、admission、app binding management、app execution/capability、broker、DTO、product operations、runtime 与 controller;后一组覆盖 product remote HTTP 的网络、状态码、media type、JSON、大小和资源关闭合同。它们验证 10/11 空间、`auto` 拒绝、多空间排序/并发、空结果、绑定原子同步、JSON `/retrieval-tests` transport;capability/remote 仍为 fake、mock HTTP 或进程内边界。 + +### KF-BUG-020/021 修复专项 + +```text +KF-BUG-020 broader Web 9 spec / 27 tests passed +020/021 final Web 7 spec / 70 tests passed +020/021 final API 18 tests passed +Web type-check passed +Target locale lint passed +``` + +020 的回归覆盖首次 history 初始化与后续 history 新引用,证明子树不再因正常保存而卸载。021 的回归覆盖独立开关保存、失败回滚/重试、四类 admission 错误、稳定 marker 和所有用户运行表面的本地化映射。它们是代码层修复证据,不改变 WF2-002、026、032~034 的原始浏览器结果,也不解除 15 个 `ENV-BLOCKED` 和 3 个规格/实现阻塞。 + +## 7. 清理与环境恢复 + +- QA 空间 API Access 已恢复为 `未启用`。 +- 临时 Workflow App API key 已删除;删除后同 key 请求返回 HTTP 401。 +- `ceshi` 最终关联应用恢复为 1,测试 Workflow 最终重新发布为只引用 `ceshi`。 +- 未删除任何既有知识库、文档、数据源或检索记录。 +- 保留 3 个名称明确的合成 Workflow,便于研发直接复现;未解析空间 Workflow 保持未发布。 +- 工作区模型消息额度仍显示 0;但本轮 Workflow 的 `not bound` 发生在 Dify 侧 app admission 阶段、早于 KFS remote/retrieval/model 执行,因此模型额度不是这些失败的成因。 + +## 8. 发布门禁建议 + +1. KF-BUG-020/021 已完成代码修复;发布前先部署,再用真实 Chrome 验证新增任意节点后等待超过 history 保存窗口仍不白屏,并用新的 Workflow Access 开关完成草稿、单步、Web App、Service blocking/streaming 正向召回。 +2. KF-BUG-022 仍是发布风险;修复后必须用刷新、导出 DSL 和真实 filtered retrieval 三重验证,而不是只断言输入框。 +3. 在部署后分别制造 missing binding、channel disabled、permissions not ready、space inactive,确认所有运行表面都展示对应的本地化错误且不泄露内部信息。 +4. 建立登录态 Playwright/Cucumber E2E:创建 Workflow → 添加 v2 → 选择空间 → 发布 → Web/Service 运行 → 断言 marker/citation → 撤权后立即失败。 +5. KFS upstream 断言必须明确为 JSON `retrieveEvidence`;Dify Service API 可以使用 SSE 包装 Workflow 事件,但这不是 KFS `/queries` SSE。 +6. 补齐 `KNOWLEDGE_FS_BASE_URL` 缺失时的节点级错误映射回归,确保所有运行表面得到受控 unavailable,而不是未捕获异常或 generic 500。 diff --git a/test-results/knowledge-fs/2026-08-11/test-data/kf-wf-v2-live-ceshi.yml b/test-results/knowledge-fs/2026-08-11/test-data/kf-wf-v2-live-ceshi.yml new file mode 100644 index 00000000000..f0bb3bcbd5a --- /dev/null +++ b/test-results/knowledge-fs/2026-08-11/test-data/kf-wf-v2-live-ceshi.yml @@ -0,0 +1,75 @@ +app: + description: Knowledge Retrieval v2 live QA workflow using the existing ceshi KnowledgeFS space. + icon: 📗 + icon_background: '#E4E7FF' + mode: workflow + name: KF-WF-V2-LIVE-CESHI-20260811 + use_icon_as_answer_icon: false +dependencies: [] +kind: app +version: 0.3.1 +workflow: + conversation_variables: [] + environment_variables: [] + features: {} + graph: + edges: + - data: + sourceType: start + targetType: knowledge-retrieval-v2 + id: start-source-retrieval-target + source: start + sourceHandle: source + target: retrieval-v2 + targetHandle: target + type: custom + - data: + sourceType: knowledge-retrieval-v2 + targetType: end + id: retrieval-source-end-target + source: retrieval-v2 + sourceHandle: source + target: end + targetHandle: target + type: custom + nodes: + - data: + desc: Synthetic query used only for Knowledge Retrieval v2 functional testing. + title: Start + type: start + variables: + - label: query + required: true + type: text-input + variable: query + id: start + type: custom + - data: + control_space_ids: + - 019fac9f-bfb0-75ee-9af5-252ebafbac1c + desc: Existing ceshi KnowledgeFS space; no destructive changes. + mode: fast + query_variable_selector: + - start + - query + title: KnowledgeFS Retrieval v2 + top_n: 5 + type: knowledge-retrieval-v2 + id: retrieval-v2 + type: custom + - data: + desc: '' + outputs: + - value_selector: + - retrieval-v2 + - result + value_type: array[object] + variable: evidence + title: End + type: end + id: end + type: custom + viewport: + x: 0 + y: 0 + zoom: 1 diff --git a/test-results/knowledge-fs/2026-08-11/test-data/kf-wf-v2-unresolved-space.yml b/test-results/knowledge-fs/2026-08-11/test-data/kf-wf-v2-unresolved-space.yml new file mode 100644 index 00000000000..0e6dc8a6490 --- /dev/null +++ b/test-results/knowledge-fs/2026-08-11/test-data/kf-wf-v2-unresolved-space.yml @@ -0,0 +1,74 @@ +app: + description: Knowledge Retrieval v2 publish validation with an unresolved synthetic space. + icon: 📗 + icon_background: '#E4E7FF' + mode: workflow + name: KF-WF-V2-UNRESOLVED-20260811 + use_icon_as_answer_icon: false +dependencies: [] +kind: app +version: 0.3.1 +workflow: + conversation_variables: [] + environment_variables: [] + features: {} + graph: + edges: + - data: + sourceType: start + targetType: knowledge-retrieval-v2 + id: start-source-retrieval-target + source: start + sourceHandle: source + target: retrieval-v2 + targetHandle: target + type: custom + - data: + sourceType: knowledge-retrieval-v2 + targetType: end + id: retrieval-source-end-target + source: retrieval-v2 + sourceHandle: source + target: end + targetHandle: target + type: custom + nodes: + - data: + desc: '' + title: Start + type: start + variables: + - label: query + required: true + type: text-input + variable: query + id: start + type: custom + - data: + control_space_ids: + - 00000000-0000-0000-0000-000000000000 + desc: Synthetic unresolved KnowledgeFS control space; no real data is touched. + query_variable_selector: + - start + - query + title: KnowledgeFS Retrieval v2 + top_n: 5 + type: knowledge-retrieval-v2 + id: retrieval-v2 + type: custom + - data: + desc: '' + outputs: + - value_selector: + - retrieval-v2 + - result + value_type: array[object] + variable: evidence + title: End + type: end + id: end + type: custom + viewport: + x: 0 + y: 0 + zoom: 1