Repository navigation
fix(audit): collection - #8070
shortlight5980 wants to merge 1 commit into
Conversation
shortlight5980
commented
Oct 21, 2026
| 审计操作 | 触发场景 | 日志文案 |
|---|---|---|
| 创建集合 | 手动新建集合或文件夹、文本 / 链接 / 文件 / 图片集导入、备份与模板导入、新建知识库时附带文件 | 【张三】在产品手册/技术文档中创建了【文件】【API 设计.pdf】 |
| 更新集合属性 | 集合改名、移动到其他目录、启用或禁用 | 【张三】将【产品手册】中【API 设计.pdf】的【名称】从【旧名称】调整为【新名称】 |
| 导出集合内容 | 导出集合内的问答数据 | 【张三】导出了【产品手册】中【API 设计.pdf】的集合内容 |
| 同步集合 | 对链接集合、API 文件集合执行同步 | 【张三】同步了【产品手册】中【API 设计.pdf】 |
| 添加集合标签 | 单个或批量给集合打标签 | 【张三】为【产品手册】中【API 设计.pdf】添加了标签【已审核】 |
| 移除集合标签 | 单个或批量移除集合的标签 | 【张三】移除了【产品手册】中【API 设计.pdf】的标签【已审核】 |
Coverage Report
File CoverageNo changed files found. |
|
✅ Admin Preview Image Ready! 🕒 Time: 2026-10-29 14:33:52 (UTC+8) |
|
✅ Build and publish successful - Preview fastgpt Image: 🕒 Time: 2026-10-29 18:15:53 (UTC+8) |
|
基于提交 1. [P1] 新审计事件会导致团队审计列表读取失败Mongo 审计 schema 已接入 同一文件的筛选入参、 2. [P2] 属性审计新增的翻译 key 会被清理脚本误删collection/update.ts:155 等位置直接保存 3. [P2] 批量标签审计未核对每个集合的实际变化pro/admin/src/pages/api/core/dataset/tag/batchSetCollectionTags.ts:59 对全部请求集合记录同一组标签名称。使用真实 controller、模拟数据库读写复现:集合原本没有该标签,移除前后 4. [P2] 同步返回失败时仍记录“已同步”collection/sync.ts:33 在 风格、验证与合并事项
需要明确的语义:审计记录“操作尝试”还是“成功变更”?若覆盖失败或无实际变化的请求,应补充结果字段和对应文案。 |
8ba19ca to
ff652af
Compare
Resloved |
7a911d6 to
b08d341
Compare
|
先 rebase 这个吧 |
c3d2204 to
a4d7525
Compare
c121914yu
left a comment
There was a problem hiding this comment.
Codex 自动审查:fix(audit): collection
重要发现
-
[P2,必须修复] 更新审计使用事务外的旧快照,可能漏掉真实状态变更。 主仓库
collection/update.ts:242–258。collection来自事务前的鉴权查询,事务内按_id写入后仍以这份快照判断是否变化。例如两个请求都读到forbid=false,A 先提交禁用,B 随后提交forbid=false恢复启用;B 将请求值与过期的false比较,得到空差异并跳过日志。最终集合已启用,审计却只留下禁用事件。旧实现每次更新都会留一条日志,本次新增的无变化过滤引入了这个漏记窗口。已用原 handler 与原差异函数做可控交错复现。建议在写入事务内读取旧值、计算差异并返回最终成功事务的审计快照,提交后再落日志,同时覆盖并发与事务重试。 -
[P2,必须修复] 标签选择入口按客户端列表推导审计,会记录并未发生的标签移除。 固定 pro
2816b01e6639edd9d8edf602c1b379511960fee4的admin/src/pages/api/core/dataset/tag/addToCollections.ts:71–85。collectionsToAddTag/collectionsToRemoveTag只由请求中的新旧 ID 列表计算,addTagToCollections没有返回数据库实际差异,路由却直接为这些 ID 写日志。成功移除后重试同一请求,或客户端旧列表已过期时,数据库中本来就没有标签,也会新增一条“移除了标签”的事件;原 handler 和原 service 的隔离执行已确认此行为。它也与本 PR 另两个标签入口“只记录实际变化”的处理不一致。建议让该 service 也从事务内旧值与实际写入值返回逐集合差异,再据此生成审计,补充重复提交与过期列表覆盖。此问题位于 pro 内部,因此只写入总报告,不伪造主仓库行级定位。
需求变更
为集合创建、改名/移动/启停、内容导出、同步、标签增删补充团队审计。创建、更新由旧枚举切换到 dataset.collection.* 事件,旧映射保留用于历史日志;一次属性更新按改名、位置、状态分别记录。恢复集合权限继承改用独立事件,并保存知识库、集合、继承来源名称。
关键实现路径
- 集合创建及各种文件、文本、链接、图片、备份/模板导入入口,在创建完成后写审计;
createWithFiles在事务成功后按文件写集合日志。audit/collection.ts统一对象类型、位置与属性差异,collection/paths.ts从原 API 提取祖先查询并补充环检测。 collection/update.ts协调鉴权、移动/状态级联事务和变更日志;export.ts在游标结束或错误路径用一次性开关记录;sync.ts在同步返回后记录操作,包含sameRaw/failed返回结果。- 公开集合更新接口与 pro 的单集合、批量标签设置共用
audit/utils.ts的差异函数,在事务内比较规范化前后标签值,提交后按集合记录;标签选择入口存在上面的差异缺口。日志最终由addAuditLog(s)写入operationLogs,团队列表通过共享事件全集校验,前端专用 processor 保留名称、URL、标签和路径原值,只翻译展示标签。
影响范围与越界判断
合理扩散。 主仓库 36 个文件以及 pro 8 个文件的实际 diff 均围绕集合审计、共享事件展示和局部验证展开。祖先路径提取供 API 与审计复用,共享标签差异函数服务于公开更新接口和 pro 的逐集合审计,审计常量合并至 metadata.ts 后所有 TypeScript 引用已同步;未发现应拆出的独立功能或部署配置变更。没有改变工作流、计费或外部 API 请求结构;标签单集合设置新增事务边界,批量路径跳过相同内容的写入。
代码质量
属性差异作为独立函数、路径查询带环检测、日志写入在业务提交后执行、失败记录由公共审计工具兜底,职责总体清楚。主要风险是上面两处旧快照与实际写入不一致;应统一使用事务内实际差异,避免不同入口采用不同审计口径。创建、更新旧事件的枚举和展示映射仍保留。
代码风格一致性
沿用 parseApiInput、现有鉴权、mongoSessionRun 和审计工具,新增核心函数有职责与边界注释。非阻塞建议: processDatasetCollectionSpecific 新增 t(metadata.objectType/changeItem/oldValue/newValue),与本次审查技能要求的静态 literal key 形式不一致,建议对有限展示字段使用显式映射。目前相关已知 key 在服务端已有静态 i18nT('...') 引用,四种语言的新增 19 个 key 与插值变量均一致,未发现当前文案缺失。
测试与验证缺口
实际执行:最新快照 12 个局部测试文件、157 项测试全部通过,使用仓库的 pnpm test <指定文件...> 入口,关闭覆盖率、单 worker、按 workspace 顺序运行:
- service:
audit/collection.test.ts、audit/config.test.ts,26 项通过。 - app:集合 update、paths、resumeInheritPermission、create/fileSourceLifecycle,以及前端 dataset/audit、processors/index,58 项通过。覆盖属性与公开标签审计、无变化跳过、权限拒绝、继承来源缺失、路径环检测、文件清理和名称/URL 展示。
- 固定 pro:标签 controller、batchSetCollectionTags、setCollectionTags、团队 audit list,73 项通过。覆盖实际标签差异、规范化、写入失败回滚、旧格式兼容与列表事件校验。
另外执行: 对最新快照的原 handler、原属性差异函数和原标签 service 做 Node 隔离验证(替换鉴权、数据库、事务依赖)。并发交错探针得到 finalForbid=false 且仅有 disable 日志;标签缺席的重复移除探针得到 tags=[] 却新增 dataset.collection.tag.remove 日志。这是代码分支的隔离复现,不等价于真实 Mongo 并发回归测试;现有局部测试没有覆盖这两条异常路径。
发布前 CI 状态:两项镜像构建及 global、web、workflow-core/cli 测试通过;app、service、pro 测试仍在运行。CI 状态与本次审查结论分别记录。
完整阅读主仓库 merge-base 到 head 的 diff,以及 pro 两端 gitlink 的真实 diff、提交和调用方;检查了创建持久化/队列边界、集合鉴权与状态级联、审计存储/列表/前端消费。git diff --check 在两仓库均通过。未运行全量测试、完整类型检查或浏览器端验证;流式导出和同步的完整异常路径未做端到端验证。
需要作者确认的问题
无阻碍定位上述缺陷的需求歧义。
审查结论
needs_changes。两项 P2 审计准确性问题需要修复;本次提交的是 COMMENT Review,不执行批准、请求修改或代码修复。
- 主仓库 head:
a4d7525a4eaed4347f8dfb574124f2f3658dfc35 - 实际 base 分支:
main;获取时 base:5b5cabb9786189ae29850cb8250300ad59e3da3f - merge-base:
749809070b75278e11a1576a8ef05ca90acb2d08 - pro:
b2a36080f37af4582c09f4ca1ea36bc85cf3c01d→2816b01e6639edd9d8edf602c1b379511960fee4,指针发生变化;两端代码均可获取,head 已核对检出且递归子模块无缺失。 - 审查与验证 worktree:
/Users/yjl/.codex/experiments/pr-review-client-probe/worktrees/pr-8070-53391933eb8d/tmp/pr-8070-latest。任务开始时复用宿主准备的父目录;PR 随后更新,因此在同一指定目录内建立新 detached worktree,原检出及用户主工作区保持原样。依赖锁文件未变化,复用父目录已安装依赖;两个独立快照均保留供复核。
a4d7525 to
4702d8d
Compare
c121914yu
left a comment
There was a problem hiding this comment.
Codex 自动审查:fix(audit): collection
重要发现
-
[P2] 新增快照查询阻止系统 root 更新其他团队的集合。 update.ts:152 将鉴权返回的操作者
teamId用于集合查询,但authDatasetCollection/authDatasetCollectionMove明确允许系统 root 跨团队访问,且仍返回 root 当前团队的teamId。root 修改其他团队已有集合的名称、状态或位置时,鉴权通过后会在这里查不到集合并返回fileNotFound。旧实现使用已鉴权的集合执行更新,没有这道错误的团队过滤。应按已鉴权资源的collection.teamId读取事务快照,保留 root 旁路与租户边界,并补充跨团队 root 回归覆盖。 -
[P2] 外链导出被错误归到发布者本人名下。 export.ts:132–140 对普通导出与外链引用导出统一使用
tmbId写成员审计。但外链分支的 authChatTargetCrud 返回tmbId = outLinkConfig.tmbId(发布者),实际访客在uid中;需登录外链的uid还是已验证的访客成员 ID。当前导出代码丢弃uid/authType,新日志既没有访客身份,也只写exportScope: chat_quote。pro 审计列表再按该tmbId填充metadata.name,最终会显示成发布者下载了文件。此前该入口没有这条审计,新增加的错误归因会影响下载追溯。应区分资源归属身份与操作人,需登录外链记录验证过的访客,匿名外链明确记录访客来源/标识,避免显示为发布者操作。
需求变更
为集合创建、改名/移动/启停、导出、同步、标签增删及恢复权限继承补齐团队审计。创建覆盖手动集合/文件夹、文件、文本、链接、图片集、备份、模板和新建知识库附带文件;一次属性更新按实际变更逐条记录,标签按每个集合的实际差异记录。旧的创建/更新事件继续保留供历史日志展示。
关键实现路径
- 主应用创建入口 → 集合创建服务成功提交 →
getCollectionAuditLocation展开父目录 →addAuditLog(s)写入operationLogs。 collection/update→ 事务内重新读取集合、解析标签、计算属性及标签差异 → 提交成功后写审计;回滚不留日志,重试只采用最终成功的差异。路径查询从 API 提取到 service,并加入 session 透传和环检测。- pro 三个标签入口 → 单集合/批量标签 controller → 共享
diffCollectionTags→ 事务成功后按集合写日志;规范化、重复提交、选项顺序和裁剪均有对应处理。 - 共享事件枚举/展示映射 → pro 团队审计列表 schema 和筛选 → 主应用专用 metadata processor / 四语言文案。名称、路径及标签原值保留,状态与类型按当前语言显示。
影响范围与越界判断
事件注册、service 差异计算、各创建入口、pro 标签写入及前端展示属于合理扩散。agentLoopCore/boundary.test.ts 放宽指定 helper 的直接导入与集合审计没有直接关系,属于可疑越界的独立测试维护,建议在 PR 中解释关联或拆分;未发现该测试调整改变运行时行为。其余未发现大范围整理或依赖升级。
代码质量
事务内生成差异、事务外记录审计的职责清楚;标签值先规范化再比较,查询展示名称失败回退 ID,路径成环时终止,均有明确边界。必须修复的问题是上面的 root 回归与外链操作人错误;不能仅凭新增测试通过认定这两条未覆盖路径正确。
代码风格一致性
API 请求边界沿用 parseApiInput,共享逻辑从实际定义模块导入,新增复杂分支有职责说明。非阻塞建议:processDatasetCollectionSpecific 新增 t(metadata.objectType/changeItem/oldValue/newValue) 动态 key 调用,与现行静态字面量 key 规则不一致;建议有限枚举采用静态映射。当前 key 另有后端 i18nT('literal') 标记,四种语言新增项和插值一致,本次未发现实际翻译缺失。
测试与验证缺口
实际执行结果:
- 为独立 worktree 安装依赖,并完成 SDK 与 workflow 包构建。按受影响范围串行运行 service 3 个文件 / 31 项、主应用 9 个文件 / 77 项、pro 5 个文件 / 83 项,合计 17 个文件、191 项全部通过。
- 另用真实 Mongo 事务及 API 调用补做临时回归:系统 root 尝试改名其他团队的集合,实际返回
code: 500, error: fileNotFound,应成功的断言失败,证实发现 1。验证文件已移除,业务代码未改动。 - 对固定版本
authChatTargetCrud与导出 handler 做独立 Node 探针(仅将数据库、外链验证及审计写入等外部依赖替换为可控实现):访客 UID 与发布者不同,完成导出后审计仍只保存发布者tmbId,访客 UID 完全未进入记录,证实发现 2。这是调用链复现,并非真实外链浏览器端到端测试。
完整审阅主仓库 merge-base 到 head 的 37 个文件,以及 pro 两个 gitlink 之间的 9 个文件和调用链。主仓库与 pro 的 git diff --check 均通过;四语言各新增 19 个 key,插值集合一致。未运行全量测试、浏览器端到端验证或外部对象存储/爬虫的真实集成。
需要作者确认的问题
请明确匿名外链下载的审计身份展示约定;无论采用何种展示方式,都应区分访客与发布者本人。工作流边界测试调整与本需求的关联也建议补充说明。
审查结论
needs_changes:存在上述两个需要修复的问题。CI 在读取时全部成功,该状态独立于本次代码审查结论。
- 主仓库 head:
d3516d2cff294fa6b8072ed8dd07c3775d290ef5 - merge-base:
5fdc8d17e0d40b161a6aa54897d85d9b87cbcba5(目标分支main) - pro:
b2a36080f37af4582c09f4ca1ea36bc85cf3c01d→08e2f72052df109a88898592d99eca39519736a4,已审阅实际差异。 - worktree:
/Users/yjl/.codex/experiments/pr-review-client-probe/worktrees/pr-8070-36837731b836;复用宿主快照,保留目录,未修改业务代码。
b9997f6 to
9857f86
Compare
c121914yu
left a comment
There was a problem hiding this comment.
Codex 自动审查:fix(audit): collection
重要发现
- [P2,必须修复] 抓取失败的同步操作会遗漏审计。 collection/sync.ts:34–38 在
await syncCollection(collection)返回后才写日志,但当前枚举和路由注释约定记录“发起同步”,不区分同步结果。对已通过鉴权的合法链接集合,网页超时、404 或抓取不到正文时,urlsFetch返回空内容,随后 readDatasetSourceRawText 会 reject,直接跳过新增日志;远端 API 抛错也走同一路径。这样sameRaw和返回值形式的failed有记录,异常形式的失败却完全没有记录,管理员无法追踪这些同步尝试。已用真实鉴权、同步服务、API 中间件和 Mongo 审计落库复现,仅模拟外部网页抓取:正常及无变化场景有日志,空内容场景的日志数量为 0。建议在已鉴权且合法的同步尝试开始执行时记录,或显式覆盖执行异常并继续抛出原错误;补充失败路径回归。
需求变更
补齐集合创建、改名/移动/启停、内容导出、同步、标签增删的团队审计,并为恢复集合权限继承定义独立事件。创建和更新切换到 dataset.collection.*,保留旧事件展示;属性变更按字段记录,标签按每个集合实际变化记录。
关键实现路径
- 手动创建、文本/链接/文件/图片、备份/模板导入及新建知识库附带文件 → 集合创建成功 → 对象类型及父目录位置快照 →
addAuditLog(s)写入operationLogs。 collection/update→ 原有权限与移动校验 → 事务内重新读取集合、解析标签并计算差异 → 成功提交后写日志。重试采用最终成功事务的快照,回滚不留变更日志;root 更新按资源所属团队定位并写审计。- pro 的单集合、批量标签及标签选择入口 → controller 写入前后快照 → 主仓库
diffCollectionTags→ 提交后按集合记录。相同值、规范化、选项顺序和重复提交均有处理。 - 详情页问答导出及原文读取 →
authDatasetCollection保留认证来源 → 仅站内 token/root 的直接操作记录导出,跳过 API key 与聊天引用;同步入口存在上面的异常遗漏。 - 共享事件全集和展示映射 → pro 团队审计列表校验/筛选 → 前端专用 metadata processor。集合名、URL、路径、标签保留原值,类型与启停状态按语言翻译。
影响范围与越界判断
合理扩散。 已阅读主仓库 merge-base 到 HEAD 的全部 40 个文件,以及 pro 两端 gitlink 之间的全部 9 个文件。路径查询从 API 提取至 service,增加 session 透传与环检测,供原 API 和审计复用;常量移动到 metadata.ts 后引用已同步。pro 的标签事务、实际差异返回和无变化写入过滤服务于审计准确性。未发现无关依赖升级、部署修改或工作流改动;外部 API 请求结构和数据库 Schema/索引没有变化。
代码质量
属性与标签差异计算可独立验证,事务内生成快照、事务外写审计的边界明确;展示名称查询失败回退 ID,日志写入沿用内部错误兜底。已覆盖事务重试、回滚、权限拒绝、root 跨团队更新和标签重复提交。需要修复的是同步异常路径未进入日志写入的问题。
代码风格一致性
API 边界沿用 parseApiInput,移动定义后直接从实际模块导入,新增核心 helper 和复杂分支有职责说明。非阻塞建议:processDatasetCollectionSpecific:44–50 的动态 t(metadata.*) 仍不符合现行静态字面量 key 约定,有限枚举可改为显式静态映射。相关 key 另有静态 i18nT 登记,当前四语言新增项齐全,未发现实际翻译缺失。
测试与验证缺口
- 在指定独立 worktree 安装固定锁文件依赖,完成 SDK/workflow 包构建;使用
CI=true HUSKY=0,未改写共享 hooks。 - 按最小受影响范围串行运行 18 个文件、189 项测试,全部通过:service 2 个文件/26 项,主应用 11 个文件/80 项,pro 5 个文件/83 项。覆盖属性/标签更新、创建文件生命周期与继承、导出身份范围、原文读取、路径、权限恢复、展示 processor 和审计列表。
- 额外临时同步回归共 3 项:2 项通过、1 项失败,失败断言为抓取空内容后应有 1 条同步审计、实际为 0。用例已从 worktree 移除,代码与日志保存在本任务运行目录,业务代码未修改。
- 主仓库与 pro 的
git diff --check均通过;四语言各新增 19 个 key,插值参数集合一致。 - 未运行全量测试、浏览器端到端或真实 S3/爬虫/远端 API 集成;创建审计的各导入入口及导出流错误/中断路径主要依赖代码核查和现有相关测试。读取时 GitHub CI 全部成功,与本次发现独立。
需要作者确认的问题
无额外阻塞问题;同步审计按本 PR 声明的“记录发起操作,不区分结果”约定评估。
审查结论
needs_changes:存在上述已复现的 P2 审计遗漏。
- 主仓库 HEAD:
9857f86535c61af9e9d4958a1b19ffb96bfce224 - merge-base:
487cc599614c2c88987b0611928bca37c910e2c2,目标分支main - pro:
b2a36080f37af4582c09f4ca1ea36bc85cf3c01d→08e2f72052df109a88898592d99eca39519736a4,指针变化及真实差异已审阅。 - worktree:
/Users/yjl/.codex/experiments/pr-review-client-probe/worktrees/pr-8070-e2563f6b6d6d;复用宿主快照,保留目录,主仓库与 pro 工作区均干净。
9857f86 to
6f191fa
Compare
c121914yu
left a comment
There was a problem hiding this comment.
Codex 自动审查:fix(audit): collection
重要发现
- [P2,必须修复] 原文读取可通过未使用的聊天字段跳过新增审计。 collection/read.ts:75 要求
sourceType、chatId、chatItemDataId全部缺省才记录导出,但前面的鉴权分支在任一字段缺省时就走普通集合权限检查。当前请求 schema 允许{ collectionId, chatId: 'unused-context' }或{ collectionId, chatItemDataId: 'unused-record' }:两者都没有进入聊天鉴权,仍以同一 token 成员身份成功签发原文下载 URL,却因这里的判断而不调用审计。普通{ collectionId }请求则会写一条日志。因此成员只需添加一个未使用字段,就能让同一次原文下载脱离本次新增的追溯记录。已用真实 Mongo 集合及集合权限路径、沿用现有 S3/审计写入替身复现:普通请求通过,两个部分聊天参数请求的“应写一条审计”断言均失败,实际调用为 0。建议用实际选择的鉴权分支决定是否审计,或在 schema 中拒绝不完整的聊天上下文;补充这两个边界回归,同时保留完整聊天引用和 API key 的既定排除范围。
需求变更
为集合创建、改名/移动/启停、导出、同步和标签增删补齐团队审计,并为恢复集合权限继承定义独立事件。创建/更新切换为 dataset.collection.*,旧事件保留展示兼容;属性按变更项、标签按每个集合的实际差异记录。详情页问答导出和原文读取分别记录 collection / source 范围,同步记录发起尝试而不区分结果。
关键实现路径
- 手动创建、文本/链接/文件/图片、备份/模板及新建知识库附带文件 → 创建服务提交成功 → 集合名、类型、父目录位置快照 →
addAuditLog(s)写入operationLogs。 collection/update→ 原有管理/移动权限检查 → 事务内读取最新旧值、解析标签并计算属性/标签差异 → 提交后记录;事务重试采用最终提交快照,回滚不写日志,root 更新按资源所属团队定位。- pro 的单集合、批量和标签选择入口 → 标签 controller → 共享
diffCollectionTags→ 提交后按集合记录;规范化、数组选项集合、重复请求和无实际变化均有处理。 - 导出/原文读取通过
authType限定成员操作;同步在抓取前记录尝试。事件全集、展示映射 → pro 审计列表校验/筛选 → 前端专用 processor 和四语言文案,用户名称、URL、路径和标签原值保留。
影响范围与越界判断
合理扩散。 完整审阅主仓库 merge-base 到 HEAD 的 41 个文件,以及 pro 两端 gitlink 之间的全部 9 个文件。路径查询从 API 下沉到 service 并透传 session,保留原有环/断链/深度截断;常量移至 metadata.ts 后引用已同步。pro 的事务、差异返回和无变化写入过滤直接服务于审计准确性。未发现无关依赖升级、部署修改或工作流改动;没有新增外部 API 字段或数据库 Schema/索引变更。
代码质量
属性和标签差异计算职责明确,事务内取快照、事务外写审计可避免回滚及重试产生错误日志;展示名称查询失败回退 ID,审计写入复用内部错误兜底。需要修复的是原文读取的鉴权分流与审计分流使用了不同条件,导致上述可复现遗漏。
代码风格一致性
API 边界沿用 parseApiInput,移动定义后直接导入实际模块,核心 helper 与复杂分支有职责说明。非阻塞建议:processDatasetCollectionSpecific:44–50 的动态 t(metadata.*) 可按现行规范改为有限枚举的静态 key 映射。相关 key 另有清理脚本支持的静态 i18nT 登记,当前未发现实际翻译缺失。
测试与验证缺口
- 在指定独立 worktree 安装固定锁文件依赖并完成 SDK/workflow 包构建,使用
CI=true HUSKY=0,未改写共享 hooks。 - 按受影响范围串行运行 21 个文件、231 项测试,全部通过:service 3 个文件/47 项,主应用 13 个文件/101 项,pro 5 个文件/83 项。覆盖集合权限、创建与文件生命周期、属性/标签差异、事务重试与回滚、root 跨团队更新、同步抓取异常、导出身份范围、原文读取、路径、恢复继承及审计展示/列表。
- 额外临时原文读取回归 3 项:1 项通过、2 项失败,失败均为成功返回签名 URL 后审计调用数应为 1、实际为 0。测试文件已逐字恢复;回归源码与日志保存在本任务运行目录,未修改业务代码。
- 主仓库与 pro 的
git diff --check通过;四语言各新增 19 个 key,key 集合与插值参数一致。另用独立 Node 响应流探针检查客户端提前断开,观察到游标结束后仍仅记录一条导出日志,未据此提出缺陷。 - 未运行全量测试、浏览器端到端或真实 S3/爬虫/远端 API 集成;各创建入口新增日志的完整覆盖仍主要来自调用链核查与相关创建测试。读取时 GitHub CI 全部成功,该状态独立于本次发现。
需要作者确认的问题
无额外需求阻塞;请修复普通集合读取因部分聊天字段而跳过审计的条件不一致。
审查结论
needs_changes:存在上述已复现的 P2 审计遗漏。
- 主仓库 HEAD:
6f191fab6f335e3abde3009a87c8fda3156b53dc - merge-base:
a8b74f75cd72594b9bd1754f657956e3d32fa092,目标分支main - pro:
c482c81f5c150d676b22f1d0e0a56c8f660eadcc→fa8d5df9eb773570570329a9172c81c45a41cab7,指针变化及真实差异已审阅。 - worktree:
/Users/yjl/.codex/experiments/pr-review-client-probe/worktrees/pr-8070-05dbd2244d3c;复用并保留宿主快照,主仓库与 pro 工作区均干净。
c121914yu
left a comment
There was a problem hiding this comment.
Codex 自动审查:fix(audit): collection
重要发现
未发现需要阻塞合并的本次引入缺陷。
- P3,非阻塞风格建议:processDatasetCollectionSpecific,第 46–50 行 使用
t(metadata.changeItem)、t(metadata.oldValue)等动态 key。当前新增 key 已在生成端通过静态i18nT('...')标记,因此没有发现本次会被清理脚本误删的问题;建议对有限的变更项和启停状态使用显式分支,并在最终调用处保留t('ns:literal_key'),与现行 i18n 规范保持一致。
需求变更
补齐集合创建、改名/移动/启停、导出、同步、标签增删和恢复继承权限的团队审计。创建改为记录对象类型与位置;属性更新按实际变化逐项记录;标签按实际持久化值判断增删。旧 CREATE_COLLECTION、UPDATE_COLLECTION 展示映射保留,新写入使用点分事件名。
导出审计覆盖站内集合页面的 CSV 导出和原文链接读取;完整聊天上下文与 API Key 访问不记录此类导出日志。同步记录已授权的发起尝试,包括抓取失败,日志不表示同步成功。
关键实现路径
collection/create.ts、collection/create/*与dataset/createWithFiles.ts:沿用创建鉴权和集合持久化服务,成功后写创建事件;新知识库附带文件逐文件记账。getCollectionAuditLocation生成知识库名和父目录链。collection/update.ts:保留移动及 manage 权限门槛,在mongoSessionRun内重新读取集合、保存旧/新路径,调用buildCollectionUpdateAuditChanges和diffCollectionTags;只使用最终提交的事务返回值,在事务外批量写日志。collection/read.ts、export.ts:复用实际鉴权分支及透传的authType限定导出来源;CSV 游标结束/异常通过一次性开关记录。sync.ts在抓取前记录尝试;resumeInheritPermission.ts在权限恢复后写独立事件。- pro 的三个标签 API → 标签 controller → 主仓库
diffCollectionTags:比较事务内旧值与规范化后的写入值,再按集合记录实际变更;重复请求及未变化标签不产生假日志。 addAuditLog(s)→operationLogs→ pro 审计列表接口 →auditLogMap和 dataset processor:新事件可查询、筛选与多语言展示,集合名、标签名、路径等用户内容保留原值。
影响范围与越界判断
合理扩散:透传集合鉴权来源、将路径查询下沉到 service、将配置常量文件改名为 metadata、统一 pro 标签差异返回值,均服务于审计生成及展示。完整差异中未发现独立需求混入,也没有依赖、部署或工作流配置变动。权限、计费和训练主流程未因新增审计而扩大授权范围。
代码质量
审计差量逻辑已集中复用;更新和标签操作将快照读取与写入放在同一事务,提交后才写日志,覆盖并发更新、回滚及重试。路径和标签展示信息查询失败有回退,日志写入工具内部处理失败,避免审计补充信息使已提交业务更新返回失败。未发现新的循环依赖或需要阻塞处理的复杂度问题。
代码风格一致性
JSON API 沿用 parseApiInput,新增核心 helper 有职责和边界注释,移动后的定义直接导入且无旧路径残留。四种现有语言包的 19 个新增 key 一致、无空值;静态 key 风格建议见重要发现。
测试与验证缺口
在固定 worktree 中使用本地临时 MongoDB,顺序执行相关局部测试,关闭覆盖率并限制为单 worker:
| 范围 | 测试文件 | 通过用例 |
|---|---|---|
| service 审计与集合/知识库鉴权 | 4 | 48 |
| app 创建、更新、同步、读取、导出、路径、恢复继承与展示 | 13 | 108 |
| pro 标签 controller、三个标签 API 和审计列表 | 5 | 83 |
| 合计 | 22 | 239 |
git diff --check 通过。测试用 pro 别名临时链接均指向本次 worktree,验证结束后已清理;主仓库与 pro 均干净。已完整审阅主仓库 5 个提交的 41 个文件,以及 pro 两个提交的 9 个文件。
未执行全量测试、浏览器端操作或真实 S3/外部 API 的端到端验证;导出游标单测使用替身,其异常回调与一次性记录逻辑另经代码核查。GitHub 当前构建与测试检查通过,和本次代码审查结论分别记录。
需要作者确认的问题
无阻塞性的需求歧义或待补证据。
审查结论
pass,附一条非阻塞风格建议。
- 主仓库 HEAD:
1910baf5d7936c600c63c86ff9a2cac62ea17113 - 目标分支:
main;merge-base:a8b74f75cd72594b9bd1754f657956e3d32fa092 - pro:
c482c81f5c150d676b22f1d0e0a56c8f660eadcc→fa8d5df9eb773570570329a9172c81c45a41cab7,已核对真实差异与固定检出。 - worktree:
/Users/yjl/.codex/experiments/pr-review-client-probe/worktrees/pr-8070-45675ff6133a,保留依赖及验证结果供宿主复用。
c121914yu
left a comment
There was a problem hiding this comment.
Codex 自动审查:fix(audit): collection
重要发现
未发现必须修复的功能缺陷。
非阻塞建议 [P3]:audit.ts:71 的 t(metadata.objectType) 仍是动态翻译 key。当前对象类型已由 DatasetCollectionTypeMap 中的字面量 i18nT 标记覆盖,未发现现有翻译丢失;建议和本函数的属性、状态翻译一样改成显式字面量分支,符合本仓库审查规则,减少对其他模块扫描标记的依赖。
需求变更
补齐集合创建、属性修改、导出、同步、标签增删及恢复权限继承的团队审计。创建日志包含对象类型和位置;改名、移动、启停按实际差异分别记录;标签按集合记录实际新增或移除的标签。旧 CREATE_COLLECTION、UPDATE_COLLECTION 展示映射保留,兼容历史日志。
同步记录通过鉴权后的发起尝试,因此抓取失败或内容未变化也会留痕。集合导出及源文件读取仅记录站内集合鉴权的 token/root 操作,聊天引用和 API Key 请求不进入这类日志。
关键实现路径
- 各 create 路由及 createWithFiles 在集合或整批事务成功后写创建事件;collection/paths 下沉到 service,供 API 面包屑和审计位置查询复用。
- collection/update 在事务内重新读取旧集合,计算属性、移动路径及规范化标签差异,只将最终提交事务的返回值用于写审计;保留移动、字段修改各自的权限门槛。
- pro 的三个标签接口调用 controller 规范化、持久化并返回逐集合差异,提交后补充标签名称快照并批量写审计;重复或无实际变化的操作不产生标签日志。
- authDatasetCollection 透传 authType,read/export 复用实际鉴权分支决定审计范围;sync 在抓取前写尝试日志。
- TeamAuditEventList、auditLogMap、pro 审计列表与前端 processor 完成事件消费闭环,展示层保留用户名称、路径、URL 和标签原值。
影响范围与越界判断
属于合理扩散:共享事件和 metadata、审计工具、创建/更新/导出/同步入口、pro 标签处理及四种语言展示共同实现集合审计。配置常量改名和路径 helper 下沉有对应使用方调整,未发现残留旧 import;未发现无关依赖升级、部署配置修改或大范围整理。
代码质量
属性及标签差异与实际写入共用事务快照,重试不会复用回滚结果,日志在提交后写入。标签比较区分存储变化与值集合变化,避免选项顺序、重复项及数值规范化造成虚假日志。展示补充查询有回退;审计写入工具内部处理最终失败。未发现新增的权限隔离或业务行为回归。
代码风格一致性
沿用 parseApiInput、mongoSessionRun 和既有审计写入工具;新增核心 helper 说明了快照、兼容和失败边界。属性、状态翻译采用字面量调用,objectType 的非阻塞建议见上。四种语言各新增 19 个 key,插值参数一致。
测试与验证缺口
在指定 worktree 使用 CI=true、HUSKY=0 完成冻结锁文件安装,并通过 pnpm test 的局部模式顺序执行 21 个相关文件,共 238 项通过(service 47、app 108、pro/admin 83)。
覆盖实际事务回滚、重试旧值刷新、跨团队 root 更新、移动权限、同步抓取失败、聊天/API Key 审计排除、标签规范化和幂等、审计列表消费及面包屑隔离。主仓库及 pro 的 diff --check 均通过,四种语言新增 key 和插值已独立核对;快照 CI 的 build、test、report-coverage、CLA 均成功。
未运行全量测试、全仓类型检查或浏览器端到端验证;S3、外部网页等边界使用测试替身,真实下载链路和浏览器展示仍未实测。本次完整阅读主仓库 merge-base 至 head 差异及 pro 两端的真实差异。
需要作者确认的问题
无阻塞性需求疑问。
审查结论
pass,附一项非阻塞风格建议。本次仅提交 COMMENT Review。
- 主仓库 head:
806ec209c5ddb55673b8c7a6fb3b96c1334ec110 - 目标分支:
main;merge-base:a8b74f75cd72594b9bd1754f657956e3d32fa092 - pro:
c482c81f5c150d676b22f1d0e0a56c8f660eadcc→fa8d5df9eb773570570329a9172c81c45a41cab7(已审查 2 个提交、9 个文件) - worktree:
/Users/yjl/.codex/experiments/pr-review-client-probe/worktrees/pr-8070-207c27141a8d(复用并保留,未修改业务代码)
0300bbb to
01e52e0
Compare
c121914yu
left a comment
There was a problem hiding this comment.
Codex 自动审查:fix(audit): collection
重要发现
当前未发现必须修复的问题,也未发现新增的功能缺陷。历次报告中的 8 项问题已按本轮代码逐项复核;已修复项不再列为当前缺陷。
历史问题修复状态
依据本轮 previous-review.json,并补读该 PR 历次已发布的 Codex 报告。以下状态来自当前代码及本轮验证,不采信作者说明作为修复证据。
| 历史问题 | 状态 | 本轮核验依据 |
|---|---|---|
| P2:事务外旧快照造成状态变更漏记 | 已修复 | update 在 mongoSessionRun 回调内读取 previousCollection、计算差异并返回最终提交结果;交错禁用/启用、事务重试和回滚回归通过。 |
| P2:客户端过期标签列表造成虚假移除日志 | 已修复 | pro 的 addTagToCollections 从事务内 tags 快照计算实际差异,路由仅消费返回的 changes;重复提交、过期列表及失败回滚回归通过。 |
| P2:系统 root 跨团队更新被错误团队条件拦截 | 已修复 | 快照和标签处理使用已鉴权资源的 collection.teamId;本轮跨团队 root 更新及审计归属回归通过。 |
| P2:外链访客导出被记到发布者名下 | 已修复 | 通过收窄审计范围消除错误归因:完整聊天引用和外链导出不写该成员事件,普通 token/root 集合导出才记录;对应范围回归通过。这不代表已新增访客审计。 |
| P2:抓取异常的同步尝试漏审计 | 已修复 | 合法类型在抓取前记录尝试,异常仍向上抛出;空正文、抓取拒绝、内容未变化及无权限场景回归通过。 |
| P2:不完整聊天字段可绕过原文下载审计 | 已修复 | 鉴权和审计复用 isCollectionPageRequest;部分聊天参数请求均有日志,完整聊天引用和 API Key 仍按既定范围排除。 |
| P3:属性、状态使用动态翻译 key | 已修复 | changeItem 和启停状态均经显式字面量分支翻译;用户值、URL 保持原文,本轮处理器测试通过。 |
| P3:objectType 仍使用动态翻译 key | 已修复 | 当前 audit.ts:46–64 覆盖服务端全部 7 种类型并使用字面量 t 调用;直接执行本轮处理器,验证 7 种类型、5 种未知/非字符串输入及启停行为,未知值原样回退。 |
仍存在的问题:无已确认的历史遗留项。新增问题:无已确认项。
需求变更
完整 PR 为集合创建、改名/移动/启停、导出、同步、标签增删和恢复权限继承补齐团队审计。创建记录类型与位置;属性按实际变化分别记录;标签按集合的持久化差异记录。旧 CREATE_COLLECTION、UPDATE_COLLECTION 展示映射保留以兼容历史日志。
同步事件表示发起尝试,包含抓取失败及内容未变化。集合内容与原文导出事件仅覆盖站内集合鉴权的 token/root 请求,排除聊天引用与 API Key。
关键实现路径
- 各 create 路由和 createWithFiles 在集合或整批事务成功后写创建事件;service 层 collection/paths 供面包屑和审计位置查询复用,查询限定团队及知识库,并截断环和断链。
- collection/update 在事务内读取旧集合,生成属性、路径及规范化标签差异;日志使用最终提交结果并在事务外写入,保留移动和字段更新各自的权限门槛。
- pro 三个标签接口由 controller 校验、规范化、持久化并返回逐集合差异;路由补充名称快照后写入事件,无实际变化时不记录增删。
- authDatasetCollection 透传 authType,read/export 复用真实鉴权路径限定日志范围;sync 在抓取前记录合法尝试。
- TeamAuditEventList、auditLogMap、pro 审计列表和前端 processor 完成存储、筛选、读取与翻译展示闭环。
影响范围与越界判断
合理扩散:主仓库 41 个文件和 pro 的 9 个文件围绕集合审计及验证调整,未发现无关依赖升级、部署配置改动或高风险越界。
本轮重新以 main 的 merge-base 至当前 head 为准。逐文件比较确认,主仓库 38 个文件及 pro 全部 9 个文件的 PR 差异与上轮一致;实际新增变化是 objectType 字面量翻译分支及对应测试。上游合入的聊天/工作流变更不属于本 PR 差异,未误计入审查范围。
代码质量
属性与标签差异使用事务快照,事务重试重新计算,提交前不写变更日志。标签比较区分存储变化和值集合变化,避免顺序、重复项及数值规范化制造虚假审计。展示查询失败回退名称或 ID,审计工具内部处理写入失败。未发现本次引入的权限、幂等或兼容性回归。
代码风格一致性
沿用 parseApiInput、mongoSessionRun、既有审计写入工具及业务目录分层;核心 helper 注释说明快照和失败边界。集合类型、属性、状态的翻译调用现在均为字面量;四种语言中的 7 个类型 key、19 个新增审计 key 及插值参数已核对。
测试与验证缺口
本轮在指定独立 worktree 重新执行 21 个相关测试文件,238 项通过(service 47、app 108、pro/admin 83)。使用与本轮 lockfile 完全一致的依赖缓存建立独立可写副本,workspace 链接指向本轮源码;没有在主工作区依赖上安装或构建,没有修改业务代码、清单或 lockfile。
另直接执行当前翻译函数验证类型覆盖、未知值回退及用户值保留;主仓库/pro 的 diff --check、旧 import 检查、四种语言 key/插值检查通过。该 head 的远端 CI:主站与 Admin 构建、各 workspace 测试、pro 测试、coverage 和 CLA 均成功。
未运行全量测试、全仓类型检查或浏览器端到端验证。网页、S3 等外部边界使用测试替身;真实网络下载与浏览器视觉展示未实测。上轮测试结果仅作为历史数据,本节通过数均来自本轮执行。
需要作者确认的问题
无阻塞性需求疑问。
审查结论
pass。历史 8 项问题均已核实修复;当前无必须修复项或新增缺陷。本报告基于当前完整 PR,仅提交 COMMENT Review。
- 主仓库 head:
01e52e090c2df64ea881b88174c6fde25c28cd49 - 目标分支:
main;merge-base:4455f7fe8ded79858060123aa56c11062bfd443a - pro:
7b9b3d89d18ddd8108221952b10c3a9f701091c4→2d2b4779cddb312a3338381a54127a89fddd0bb2(指针变化,已审查真实差异) - worktree:
/Users/yjl/.codex/experiments/pr-review-client-probe/worktrees/pr-8070-d0fcc00eca65(复用并保留)
Record collection creation, updates, exports, source reads, sync attempts, and permission changes with accurate change snapshots. Add audit display labels, translations, and focused regression coverage; update pro to include collection tag auditing.
01e52e0 to
d7de88a
Compare