diff --git a/.doc/audit/ISSUES.md b/.doc/audit/ISSUES.md index caa0fbc2..53ded071 100644 --- a/.doc/audit/ISSUES.md +++ b/.doc/audit/ISSUES.md @@ -2,11 +2,11 @@ 维护规则:[问题记录与开发经验闭环](../ops/2026-09-23-issue-learning-workflow.md)。每个问题一个稳定 ID;主记录是事实与状态来源,本表为可检索投影。新发现及时登记,修复后保留记录;发布 blocker 仍见 [gap-matrix](../remediation/gap-matrix.md)。 -更新:2026-09-28。只上传文档、无文字时对话 400 且前端只显示 HTTP_400(fixing,单测已过,dev 浏览器未复验)。历史任务 run 事件流 HTTP/2 与 502 另记,未在本轮修。激活预览前端预检与管理台密钥 form 已在 dev 浏览器复验(resolved,dev `3e534bbb`,项目 6023)。非编制人触发小队账本提交被 `uow: permission denied` 拒绝(fixing,待 dev 重跑)。test 注册 INTERNAL:标准角色 role-guest 缺失导致 FK 23503,已补种并重启 test(goose 77,resolved)。重复用户名 400 在新代码单测通过;当前 rc 二进制仍返回 INTERNAL,随下次含本提交的 test 制品生效。管理台重置密码入口被 F4-A 误删(端点仍在),已恢复 UI(resolved)。2026-09-27。上传链路:登记并修复上传文档跨端不可访问(占位模板退化 + 元数据/正文不落服务端,fixing 待 dev 集成)。2026-09-26。docgov 批准链:登记并修复 review_snapshot_id 装载缺失与 uow 行锁自死锁(resolved);memDocs 持久化失败缓存投毒(investigating)。历史 resolved 不表示本日产品回归通过。系统 code review P0/P1 批次修复落账(5 resolved + 1 deferred + 1 open,主记录见 [整改文档](2026-09-26-system-code-review-fixes.md),来源 [审计](2026-09-26-system-code-review.md))。 +更新:2026-09-28。只上传文档、无文字时对话 400 已在重载后的 dev 浏览器复验(resolved,`bin/agent-server` 10:22 +0800)。历史任务 run 事件流 HTTP/2 与 502 另记,未在本轮修。激活预览前端预检与管理台密钥 form 已在 dev 浏览器复验(resolved,dev `3e534bbb`,项目 6023)。非编制人触发小队账本提交被 `uow: permission denied` 拒绝(fixing,待 dev 重跑)。test 注册 INTERNAL:标准角色 role-guest 缺失导致 FK 23503,已补种并重启 test(goose 77,resolved)。重复用户名 400 在新代码单测通过;当前 rc 二进制仍返回 INTERNAL,随下次含本提交的 test 制品生效。管理台重置密码入口被 F4-A 误删(端点仍在),已恢复 UI(resolved)。2026-09-27。上传链路:登记并修复上传文档跨端不可访问(占位模板退化 + 元数据/正文不落服务端,fixing 待 dev 集成)。2026-09-26。docgov 批准链:登记并修复 review_snapshot_id 装载缺失与 uow 行锁自死锁(resolved);memDocs 持久化失败缓存投毒(investigating)。历史 resolved 不表示本日产品回归通过。系统 code review P0/P1 批次修复落账(5 resolved + 1 deferred + 1 open,主记录见 [整改文档](2026-09-26-system-code-review-fixes.md),来源 [审计](2026-09-26-system-code-review.md))。 | issue_id | 模块 / 检索词 | 问题 | 严重度 | issue_state | owner | 证据日期 / 范围 | 唯一主记录 | 经验 | |---|---|---|---|---|---|---|---|---| -| ISSUE-20260928-attachment-only-turn | chat / chat/stream / message cannot be empty / HTTP_400 / attachments | 只上传文档、不输入文字时 turn 被空消息 400 拒绝,前端不读信封,用户看不到任何回复 | high | fixing | Cursor | 2026-09-28;内存 HTTP 与协调单测 PASS;:8080 仍为旧进程,浏览器未复验 | [主记录](../ops/short-term/2026-09-28-attachment-only-turn.md) | 待浏览器与真实 PI 梳理复验后补 | +| ISSUE-20260928-attachment-only-turn | chat / chat/stream / message cannot be empty / HTTP_400 / attachments | 只上传文档、不输入文字时 turn 被空消息 400 拒绝,前端不读信封,用户看不到任何回复 | high | resolved | Cursor | 2026-09-28;dev :8080 重载后浏览器仅附件得到梳理审阅,无关文字先回答再追问;pending 分支 API 200 | [主记录](../ops/short-term/2026-09-28-attachment-only-turn.md) | 空消息门禁要放在附件判定之后;4xx 必须读信封。见[测试报告](../test-reports/2026-09-28-attachment-only-turn-test-report.md) | | ISSUE-20260928-task-run-replay-502 | web / useRecoveredTaskPhases / tasks/runs / ERR_HTTP2_PROTOCOL_ERROR / 502 | 历史失败气泡恢复订阅 task run 事件时出现 HTTP/2 协议错误和 502,与附件空消息 400 无因果关系 | medium | investigating | Cursor | 2026-09-28;用户控制台 `run_1790558010622744831`;本轮未改订阅逻辑 | [主记录](../ops/short-term/2026-09-28-attachment-only-turn.md#范围外) | 未修,保持观察 | | ISSUE-20260928-activation-preview-precheck | web / projectSettings / activation-preview / NO_GOVERNED_DOCUMENT / clientDutyIssues | 全部文档未纳入人工审批时前端仍 POST activation-preview,控制台 400 | medium | resolved | Cursor | 2026-09-28;dev 项目 6023 默认计划无 activation-preview 请求,兼任后 preview 200 | [主记录](../ops/short-term/2026-09-28-activation-preview-precheck.md#issue-20260928-activation-preview-precheck) | [LESSON-20260928-activation-preview-client-gate](../ops/lessons/2026-09-28-activation-preview-client-gate.md) | | ISSUE-20260928-admin-secret-password-form | web / EnvSettingsSection / password / form / secrets | 管理台 5 个密钥输入不在 form 内,Chromium 报 password DOM 警告 | low | resolved | Cursor | 2026-09-28;dev 模型与密钥页 passwordInputs=5 outsideForm=0 | [主记录](../ops/short-term/2026-09-28-activation-preview-precheck.md#issue-20260928-admin-secret-password-form) | 密码框放进 form;autocomplete 不能单独消除该 DOM 警告 | diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 4d3954d3..8423cbce 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -18,7 +18,7 @@ | owner | task | branch | worktree | mutex | status | |---|---|---|---|---|---| -| Cursor | attachment-only-turn-2026-09-28 | fix/attachment-only-turn-2026-09-28 | .worktrees/attachment-only-turn-2026-09-28 | attachment-only-turn | in_progress | +| Cursor | attachment-only-turn-2026-09-28 | fix/attachment-only-turn-2026-09-28 | .worktrees/attachment-only-turn-2026-09-28 | attachment-only-turn | done | | Cursor | activation-preview-precheck-2026-09-28 | fix/activation-preview-400-precheck-2026-09-28 | .worktrees/activation-preview-400-precheck-2026-09-28 | web-activation-preview | done | | Cursor | squad-commit-authority-2026-09-28 | fix/squad-commit-authority-2026-09-28 | .worktrees/squad-commit-authority-2026-09-28 | bizdev+docflow | in_progress | | Cursor | auth-register-internal-2026-09-28 | fix/auth-register-internal-2026-09-28 | .worktrees/auth-register-internal-2026-09-28 | auth-register | done | diff --git a/.doc/ops/short-term/2026-09-28-attachment-only-turn.md b/.doc/ops/short-term/2026-09-28-attachment-only-turn.md index 46cf688c..3cc6572e 100644 --- a/.doc/ops/short-term/2026-09-28-attachment-only-turn.md +++ b/.doc/ops/short-term/2026-09-28-attachment-only-turn.md @@ -1,7 +1,7 @@ --- title: "只上传文档时不再返回裸 HTTP 400" task_id: attachment-only-turn-2026-09-28 -status: in_progress +status: done created: 2026-09-28 updated: 2026-09-28 owner: Cursor @@ -15,9 +15,9 @@ write_scope: - web - .doc mutex: attachment-only-turn -review_state: pending +review_state: accepted integration_state: merged_local_dev -deployment: not_loaded +deployment: loaded_dev cleanup: pending remote_sync: not_requested --- @@ -47,7 +47,7 @@ remote_sync: not_requested ## 验证 -见 [测试报告](../../test-reports/2026-09-28-attachment-only-turn-test-report.md)。候选 `cb4d2af8` 已由 daemon `--ff-only` 合入 local dev。:8080 上的 `agent-server` 仍是改动前进程,浏览器和产品 PI 复验要等制品重新加载。 +见 [测试报告](../../test-reports/2026-09-28-attachment-only-turn-test-report.md)。代码候选 `cb4d2af8` 已在 local dev。`./scripts/launch.sh --no-docker` 于 2026-09-28 10:22(+0800)重建 `bin/agent-server` 并重启 :8080(pid 1002830,schema 78)。同一 Vite(:3100)上仅附件发送得到梳理与审阅,无关文字先回答再追问。 ## 范围外 @@ -55,8 +55,8 @@ remote_sync: not_requested ## 五态 -- review_state: pending(浏览器与产品 PI 未跑) -- integration_state: merged_local_dev(`cb4d2af8`,第一父 `63144067`) -- deployment: not_loaded(:8080 未换新二进制) +- review_state: accepted(dev 浏览器三条路径已复验) +- integration_state: merged_local_dev(代码 `cb4d2af8`,第一父 `63144067`) +- deployment: loaded_dev(`bin/agent-server` 10:22 +0800,pid 1002830,`/health` schema 78) - cleanup: pending - remote_sync: not_requested diff --git a/.doc/test-reports/2026-09-28-attachment-only-turn-test-report.md b/.doc/test-reports/2026-09-28-attachment-only-turn-test-report.md index cbae7ff1..92ce34a2 100644 --- a/.doc/test-reports/2026-09-28-attachment-only-turn-test-report.md +++ b/.doc/test-reports/2026-09-28-attachment-only-turn-test-report.md @@ -16,8 +16,8 @@ - OS:Linux;工作区 `.worktrees/attachment-only-turn-2026-09-28`;基线 `3e534bbb39d0d957e0b720a4ca06f22dd15959e6`。 - 合入:候选 `cb4d2af8d30cecf8a1ca0f36eafbf46d56888387`(第一父 `63144067`)经 `validate` 后由 daemon `--ff-only` 进入 local dev。 -- 层级:工程单测与内存 HTTP。未重启 :8080 上已有的 `agent-server`,因此没有对正在运行的 dev 制品做浏览器复验。 -- 无对话后端时,梳理走模板回退,不把模板输出记成产品 PI PASS。 +- 层级:工程单测、重载后的 dev API,以及同一 Vite(:3100)上的真实浏览器。`./scripts/launch.sh --no-docker` 于 10:22(+0800)重建并重启 :8080。 +- 解析未完成时不调用对话模型;正文可读时回复来自运行中的 dev 助手(`agent_backend=pi-agent`),不是测试桩。 ## 四、 预期结果 (Expected Results) @@ -49,13 +49,17 @@ - **输出**:2 pass / 0 fail,duration_ms 152 - **判定**:PASS -- **浏览器 / 真实 PI Runner**:未运行。:8080 仍是改动前进程。 -- **判定**:未运行,不能记成产品链路 PASS。 +- **浏览器 / 重载后的 dev**(2026-09-28 10:22 之后,pid 1002830,schema 78) + - **仅附件、解析未完成**(API,`parse_state=pending`):`POST /api/v1/chat/stream` 200,约 11.6s。回复:「《F-030-verify.pdf》仍在解析中,请稍后再试总结。」并说明回复「总结」后会梳理。`GET` 对应 turn 200 `completed`。 + - **仅附件、浏览器**:发送按钮在选中 PDF 后可用;用户气泡为「已上传文档:《F-030-verify.pdf》」;助手给出结构化梳理、初步审阅和编号下一步。`chat/stream` 200。未见「请输入文字,或上传文档后再发送」。截图见 [assets](assets/2026-09-28-attachment-only-turn/02-structured-review.png)。 + - **无关文字 + 附件**:浏览器输入「今天天气怎么样」并附上同一 PDF。先回复天气,再追加「另外已收到《F-030-verify.pdf》…」。`chat/stream` 200,约 22s。同一句话的 API 路径约 17s,追问文案一致。 + - **双空**:浏览器发送按钮保持禁用。API `message=""` 且无附件返回 400,`error` 为 `message cannot be empty`,turn 不创建。 +- **判定**:PASS ## 六、 自动化测试套件汇总 (Test Suite Execution) -本次实际运行的是上述包测试与一条前端用例,不是全量 `go test ./...` 或完整 `npm test`。 +本次实际运行的是上述包测试、一条前端用例,以及重载后的 dev API 与 :3100 浏览器三条路径。不是全量 `go test ./...` 或完整 `npm test`。 ## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) -工程路径已能在无文字上传时给出解析引导或模板梳理,并在无关文字后追问。该候选已在 local dev。重新加载 dev 制品后,再用真实文档和产品 PI Runner 看结构化审阅是否达到预期文风。在此之前不能把浏览器或产品链路记为 PASS。 +只上传文档不再被空消息拒绝。解析未完成时给出引导;浏览器里这份验证 PDF 在解析有结果后得到梳理、审阅和下一步。无关文字先回答再追问。用户此前看到的「请输入文字,或上传文档后再发送」来自新前端配旧二进制;10:22 重载后的 :8080 已包含本修复。历史任务事件流的 HTTP/2 与 502 仍未处理。 diff --git a/.doc/test-reports/assets/2026-09-28-attachment-only-turn/01-file-attached.png b/.doc/test-reports/assets/2026-09-28-attachment-only-turn/01-file-attached.png new file mode 100644 index 00000000..6c7f4333 Binary files /dev/null and b/.doc/test-reports/assets/2026-09-28-attachment-only-turn/01-file-attached.png differ diff --git a/.doc/test-reports/assets/2026-09-28-attachment-only-turn/02-structured-review.png b/.doc/test-reports/assets/2026-09-28-attachment-only-turn/02-structured-review.png new file mode 100644 index 00000000..19af6894 Binary files /dev/null and b/.doc/test-reports/assets/2026-09-28-attachment-only-turn/02-structured-review.png differ diff --git a/.doc/test-reports/assets/2026-09-28-attachment-only-turn/03-unrelated-ask.png b/.doc/test-reports/assets/2026-09-28-attachment-only-turn/03-unrelated-ask.png new file mode 100644 index 00000000..b3185fff Binary files /dev/null and b/.doc/test-reports/assets/2026-09-28-attachment-only-turn/03-unrelated-ask.png differ diff --git a/.doc/test-reports/assets/2026-09-28-attachment-only-turn/replies.txt b/.doc/test-reports/assets/2026-09-28-attachment-only-turn/replies.txt new file mode 100644 index 00000000..b4bd9698 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-28-attachment-only-turn/replies.txt @@ -0,0 +1,16 @@ +dev 复验摘录(2026-09-28,二进制 bin/agent-server 重建于 10:22 +0800,pid 1002830,/health schema_version=78) + +API 仅附件、parse_state=pending:HTTP 200,约 11.6s +《F-030-verify.pdf》仍在解析中,请稍后再试总结。 +解析完成后直接回复「总结」,我会给出结构化梳理和初步审阅,并问你下一步要不要据此修订文档。 +GET turn:200 completed + +API 双空:HTTP 400,error=message cannot be empty;turn 未创建(404) + +API 无关文字+附件:HTTP 200,约 17s +先回答天气,再追加:另外已收到《F-030-verify.pdf》。这条消息没有要求总结或依据文档编写。需要我总结,或据此更新对应文档吗? + +浏览器 http://127.0.0.1:3100(与 frp :58880 同一 Vite): +- 仅附件发送按钮可用;用户气泡为「已上传文档:《F-030-verify.pdf》」;助手给出结构化梳理、初步审阅与 1/2/3 下一步。chat/stream 200。 +- 无文字且无附件:发送按钮保持禁用。 +- 文字「今天天气怎么样」+同一 PDF:先回复天气,再出现「另外已收到《F-030-verify.pdf》…」。chat/stream 200。