From 51a68ec6237bf26a1772f66297a14a94a9fd8c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 1 Sep 2026 16:36:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=87=E6=A1=A3=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E9=94=99=E8=AF=AF=E6=8A=A5=E5=91=8A=20OSS=20key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除决策记录中已废弃的日期路径 --- .../shared-memory/decision-log.md | 2 +- review.txt | 42 ------------------- 2 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 review.txt diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index 8e44f1bf4..7ae7628cd 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -7862,7 +7862,7 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在 - 用户点击独立“报告问题”面板并确认后,批量提交当前进程事件和可取消的脱敏应用日志;失败只允许当前进程手动再次提交。 - 上传接口为登录态 `/api/error-reports`,后台新增 error-reports Tab、专用文件化诊断包、状态与受控下载;管理员查看/下载进入审计链路。 - `/bug-report` 仅作为打开该面板的快捷入口,追加简短提示,不再生成包含项目、run 或截图口径的缺陷模板。 -- 2026-08-31 追加:事件 DTO 精简为 `eventId/fingerprint/source/message/stack/occurredAt/count`,提交请求携带 `submissionId` 做幂等。归档固定为 `events.jsonl`,服务端使用 `agc/error-reports/v1/{yyyy}/{mm}/{dd}/{batchId}.zip` 私有 OSS key;元数据只保留 batch、用户、状态、大小、SHA-256 和 OSS key,事件正文/说明/日志从归档读取。OSS 不可用时状态为 `failed`,不自动重试。 +- 2026-08-31 追加:事件 DTO 精简为 `eventId/fingerprint/source/message/stack/occurredAt/count`,提交请求携带 `submissionId` 做幂等。归档固定为 `events.jsonl`,服务端使用 `agc/error-reports/v1/{batchId}.zip` 私有 OSS key;元数据只保留 batch、用户、状态、大小、SHA-256 和 OSS key,事件正文/说明/日志从归档读取。OSS 不可用时状态为 `failed`,不自动重试。 - 2026-09-01 追加:`application.log` 不再写结构化错误事件;Rust `app_log!` 和 WebView console 都写入普通文本 raw log,结构化事件仅保留在当前进程内,提交时才生成 ZIP 内的 `events.jsonl`。 - 2026-09-01 review 收口:错误报告修复详情请求竞态、下载 anchor 生命周期、客户端采集脱敏/指纹降级与 4xx 噪声、用户级幂等隔离、`agc` 私有 OSS 前缀越权、日志读取链接检查、ZIP 同名日志和元数据/归档清理一致性;同步在 `review.txt` 标注仍需产品/运维决定的架构项。 - 2026-09-01 追加:api-server 按单实例部署,错误报告 store 保留进程内 Mutex 和同步本地文件 I/O,不引入跨进程锁;ZIP 仅在构建/上传阶段短暂驻留受 20 MiB 上限约束的内存 Vec,随后写入私有本地归档。管理员详情路由不属于 External OpenAPI;不存在返回 404,元数据/ZIP 损坏返回 500。 diff --git a/review.txt b/review.txt deleted file mode 100644 index e8e5ba575..000000000 --- a/review.txt +++ /dev/null @@ -1,42 +0,0 @@ -# 待决 Breaking Change 评审项 - -以下问题没有在本轮实现,因为它们会改变公开接口、持久化/归档语义、资源保护策略或运行时并发模型。请你逐项决定是否进入后续变更;本轮已完成的 minor 修复已从此文件移除。 - -## 1. 错误报告提交缺少限流与配额(高风险) - -位置:`server-rs/crates/api-server/src/error_reports.rs` 的 `POST /api/error-reports`。 - -当前仅限制单次请求体(24 MiB),没有按用户限流、存储配额或全局容量上限。单个账号可以持续触发 ZIP/SHA-256/OSS 写入并使本地磁盘和对象存储增长。需要确定:按用户还是按 IP 限流、窗口与返回状态(通常 429)、配额维度、超额时是否拒绝或清理旧报告,以及生产配置和监控指标。 - -## 3. 并发文件 I/O 与归档解析迁移到 `spawn_blocking`(中风险) - -位置:`server-rs/crates/api-server/src/error_reports.rs`。 - -create/list/get/read_archive/mark_* 在 async handler 中持有 Tokio mutex 并执行同步文件 I/O、ZIP 解析和权限操作,会阻塞 worker 且串行化请求。迁移需要重新划分锁的临界区、处理取消语义和错误映射,并验证并发下幂等与清理行为。 - -## 7. 日志脱敏从整段替换改为局部掩码(中风险) - -位置:`sanitize_report_text_with_limit`。 - -当前日志中出现 `bearer `、`token=` 等 marker 时可能把整段(最多 2 MiB)替换成 `[REDACTED]`,诊断信息损失较大。改为按值或按行掩码需要定义凭据语法、边界、误报策略和兼容测试,且必须与客户端脱敏规则保持一致。 - -## 8. Tauri 日志写入改为异步/批量(中风险) - -位置:`append_application_log`、`read_diagnostic_logs` 和 WebView console bridge。 - -当前每次 console 调用都同步打开/追加/flush 文件,读取命令也在主线程执行。迁移到 `spawn_blocking` 或队列批量写入会改变调用时序、失败可见性、退出时刷盘和测试方式,需要确定丢日志容忍度、队列上限、关闭 flush 和 Tauri command 返回语义。 - -## 10. 诊断日志读取的安全打开实现(中风险) - -位置:`apps/ai-game-creator-shell/src-tauri/src/main.rs::read_diagnostic_logs`。 - -当前先 `symlink_metadata` 再按路径读取,存在 TOCTOU;安全修复应复用 `open_secure_diagnostic_log` 的 O_NOFOLLOW/普通文件校验并从同一 handle 读取。需要补充跨平台实现和 symlink/hardlink 测试,确认缺失文件是否创建以及权限失败的处理。 - -## 决策后实施要求 - -确认要做的项目后,请按项目拆分提交,并同步: - -- 相关 `shared-contracts`/HTTP 或 Tauri 契约、实现和契约测试; -- `docs/technical/【技术方案】AGC错误报告与诊断上传-2026-08-31.md` 及必要的共享记忆; -- 定向前端/Rust 测试、`npm run check:encoding`、`git diff --check`; -- 若修改公开 API,更新对应 OpenAPI(本轮项目均不属于 `/api/external/v1`)。