diff --git a/.doc/audit/ISSUES.md b/.doc/audit/ISSUES.md index 14b047a6..ab18ecbf 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。docgov 共享 map 并发读写曾在 06:38 UTC 打崩 dev 进程,登录等 API 在进程缺席期间 500(verifying,单测 `-race` 已过,dev 重建未做)。只上传文档、无文字时对话 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))。 +更新:2026-09-28。docgov 共享 map 并发读写曾在 06:38 UTC 打崩 dev 进程(resolved:dev `b9339cd2` 重建后 `/health` 200,空登录 401)。只上传文档、无文字时对话 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-docgov-map-race | docgov / memDocs / concurrent map / GetDocument / 登录 500 | per-doc 锁拆分后共享 map 无互斥,不同文档并发读写 fatal,进程退出期间全部 API 500 | critical | verifying | Cursor | 2026-09-28;`.tmp/launch/server.log` fatal + `web.log` ECONNREFUSED;`TestMemMapsNoRaceAcrossDocs` `-race` PASS(`a90cce73`);dev 重建未做 | [主记录](../ops/short-term/2026-09-28-docgov-shared-map-race.md#issue-20260928-docgov-map-race) | [LESSON-20260928-docgov-shared-map-race](../ops/lessons/2026-09-28-docgov-shared-map-race.md) | +| ISSUE-20260928-docgov-map-race | docgov / memDocs / concurrent map / GetDocument / 登录 500 | per-doc 锁拆分后共享 map 无互斥,不同文档并发读写 fatal,进程退出期间全部 API 500 | critical | resolved | Cursor | 2026-09-28;fatal + ECONNREFUSED;`-race` PASS;dev `b9339cd2` 重启后 `/health` 200、空登录 401(`req_e28309cc8d615ed4`)、Vite public-config 200 | [主记录](../ops/short-term/2026-09-28-docgov-shared-map-race.md#issue-20260928-docgov-map-race) | [LESSON-20260928-docgov-shared-map-race](../ops/lessons/2026-09-28-docgov-shared-map-race.md) | | ISSUE-20260928-quality-heading-drift | squad / quality_gate / 缺少必填章节 / State-of-the-Art / H3 | 调研报告章节在,只因 H3 和少空格被判缺章,受控文档不投影 | high | verifying | Cursor | 2026-09-28;dev `research_1790566833205199368` manifest score 85;单测已覆盖,dev 重跑未做 | [主记录](../ops/short-term/2026-09-28-quality-gate-heading-mismatch.md#issue-20260928-quality-heading-drift) | [LESSON-20260928-quality-heading-normalize](../ops/lessons/2026-09-28-quality-heading-normalize.md) | | ISSUE-20260928-data-dir-doubled | workspace / data/dev/data/dev / DataDir | 出现双层 `data/dev/data/dev/workspaces` 且只有孤立 output.md,写入点未证实 | medium | open | — | 2026-09-28;`intake_1790565513115586191` 双路径对照 | [主记录](../ops/short-term/2026-09-28-quality-gate-heading-mismatch.md#issue-20260928-data-dir-doubled) | 本轮不修 | | ISSUE-20260928-progress-query-trigger | intent / matchTriggerTask / QUERY_PROGRESS / 编写进度 | 询问调研报告编写进度时,写动词加任务名词被识别成启动新任务,进度回复不读真实 run | medium | verifying | Cursor | 2026-09-28;「调研报告编写进度怎么样了」单测为 QUERY_PROGRESS;「开始做调研报告」仍为 research。浏览器复验见测试报告 | [主记录](../ops/short-term/2026-09-28-refresh-task-state-recovery.md) | 疑问进度句必须让行查询;显式「开始/重新」仍启动任务 | diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index dbd77238..a7882664 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -18,7 +18,7 @@ | owner | task | branch | worktree | mutex | status | |---|---|---|---|---|---| -| Cursor | docgov-shared-map-race-2026-09-28-r2 | fix/docgov-shared-map-race-2026-09-28 | .worktrees/docgov-shared-map-race-2026-09-28 | docgov-shared-map-race | in_progress | +| Cursor | docgov-shared-map-race-2026-09-28-r2 | fix/docgov-shared-map-race-2026-09-28 | .worktrees/docgov-shared-map-race-2026-09-28 | docgov-shared-map-race | done | | Cursor | promote-rc-beta6-closeout-2026-09-28 | feature/promote-rc-beta6-closeout-2026-09-28 | .worktrees/promote-rc-beta6-closeout-2026-09-28 | git:test+env:test | done | | Cursor | quality-gate-heading-mismatch-2026-09-28-r3 | fix/quality-gate-heading-mismatch-2026-09-28 | .worktrees/quality-gate-heading-mismatch-2026-09-28 | quality-gate-heading | in_progress | | Cursor | agent-reply-llm-narrative-2026-09-28 | feature/agent-reply-llm-narrative-2026-09-28 | .worktrees/agent-reply-llm-narrative-2026-09-28 | chat+coordinator | in_progress | diff --git a/.doc/ops/lessons/2026-09-28-docgov-shared-map-race.md b/.doc/ops/lessons/2026-09-28-docgov-shared-map-race.md index 6c2baac0..258aa429 100644 --- a/.doc/ops/lessons/2026-09-28-docgov-shared-map-race.md +++ b/.doc/ops/lessons/2026-09-28-docgov-shared-map-race.md @@ -1,10 +1,10 @@ --- lesson_id: LESSON-20260928-docgov-shared-map-race -lesson_state: candidate +lesson_state: validated owner: Cursor reviewer: Cursor(自审) last_reviewed: 2026-09-28 -reviewed_revision: a90cce73 +reviewed_revision: b9339cd2 source_issues: [ISSUE-20260928-docgov-map-race] keywords: [docgov, memDocs, memMu, per-doc lock, concurrent map, 登录 500] --- diff --git a/.doc/ops/lessons/INDEX.md b/.doc/ops/lessons/INDEX.md index a7360e5f..018d5405 100644 --- a/.doc/ops/lessons/INDEX.md +++ b/.doc/ops/lessons/INDEX.md @@ -4,7 +4,7 @@ | lesson_id | 触发条件 / 关键词 | 注意事项 | lesson_state | 主记录 / 最近复核 | |---|---|---|---|---| -| LESSON-20260928-docgov-shared-map-race | docgov、memDocs、per-doc 锁、concurrent map、登录 500 | 拆锁后共享 map 仍要单独互斥;锁不可重入;全站 500 先看进程是否退出 | candidate | [共享 map 互斥](2026-09-28-docgov-shared-map-race.md);2026-09-28 | +| LESSON-20260928-docgov-shared-map-race | docgov、memDocs、per-doc 锁、concurrent map、登录 500 | 拆锁后共享 map 仍要单独互斥;锁不可重入;全站 500 先看进程是否退出 | validated | [共享 map 互斥](2026-09-28-docgov-shared-map-race.md);2026-09-28 | | LESSON-20260928-quality-heading-normalize | 缺少必填章节、State-of-the-Art、H3、质量门禁、AutoRepair | 标题比对去空白并跨 H2–H4;层级漂移不扣分;真实缺章仍失败 | candidate | [章节标题归一化](2026-09-28-quality-heading-normalize.md);2026-09-28 | | LESSON-20260928-task-write-verb-visible-refusal | 帮我定、制定、ClarificationQuestion、前置条件、quality_failed | 写动词覆盖制定与帮我定;拒绝和澄清进对话;质量失败不写宿主机路径 | candidate | [写动词与可见拒绝](2026-09-28-task-write-verb-visible-refusal.md);2026-09-28 | | LESSON-20260928-activation-preview-client-gate | activation-preview、NO_GOVERNED_DOCUMENT、clientDutyIssues、400 | 服务端激活门禁要有同等前端预检;live_edit 不套激活门禁 | validated | [激活预检对齐](2026-09-28-activation-preview-client-gate.md);2026-09-28 | diff --git a/.doc/ops/short-term/2026-09-28-docgov-shared-map-race.md b/.doc/ops/short-term/2026-09-28-docgov-shared-map-race.md index 9f3a1b5c..f9307823 100644 --- a/.doc/ops/short-term/2026-09-28-docgov-shared-map-race.md +++ b/.doc/ops/short-term/2026-09-28-docgov-shared-map-race.md @@ -1,13 +1,13 @@ --- title: "docgov 共享 map 并发读写导致进程崩溃" -status: in_progress +status: done created: 2026-09-28 owner: Cursor task_id: docgov-shared-map-race-2026-09-28-r2 policy_revision: issue-learning-2026-09-23-r1 @ a3db288a -review_state: pending -integration_state: pending -deployment: pending +review_state: accepted +integration_state: merged_local_dev +deployment: loaded_local cleanup: pending remote_sync: not_requested updated: 2026-09-28 @@ -45,9 +45,9 @@ base_dev_sha: a3db288a7aa055ff5884e3aa4d91511959cff721 | 字段 | 值 | |---|---| -| review_state | pending | -| integration_state | pending | -| deployment | pending(合入后需重建 dev `agent-server`) | +| review_state | accepted | +| integration_state | merged_local_dev(收口记录待第二次快进) | +| deployment | loaded_local(2026-09-28 09:10 UTC 重建并重启 `:8080`,health 200) | | cleanup | pending | | remote_sync | not_requested | @@ -55,5 +55,5 @@ base_dev_sha: a3db288a7aa055ff5884e3aa4d91511959cff721 - 预期:文档治理并发不杀死 HTTP 进程;登录等无关 API 保持可用。 - 实际:2026-09-28 06:38 UTC 进程 fatal,约 11 分钟内全部 API 500。 -- 状态:verifying(单测已过;dev 重建复验尚未做)。 +- 状态:resolved。`go test -race` PASS(`a90cce73`)。dev `b9339cd2` 重建 `bin/agent-server` 后,`/health` 200,空登录 POST 401(`req_e28309cc8d615ed4`),Vite `:3100` 的 `public-config` 200。 - 同类:所有裸读写上述四张 map 的路径,已收口到 `memMu` 辅助函数。`ISSUE-20260926-docgov-memdocs-poison` 仍是另一机制。 diff --git a/.doc/test-reports/2026-09-28-docgov-shared-map-race-test-report.md b/.doc/test-reports/2026-09-28-docgov-shared-map-race-test-report.md index cd4319c0..18f806ad 100644 --- a/.doc/test-reports/2026-09-28-docgov-shared-map-race-test-report.md +++ b/.doc/test-reports/2026-09-28-docgov-shared-map-race-test-report.md @@ -35,7 +35,15 @@ ok chat-agent-system/internal/docgov 1.012s - 评价判定 (Evaluation / Verdict):PASS - 性能与耗时 (Duration & Latency):包测试约 1.012s;用例本身 0.00s(race 插桩耗时在包级) -同一次会话里不带 `-run` 的 `go test -race -count=1 -timeout 180s ./internal/docgov/` 亦为 `ok`(1.012s)。dev 进程重建后的 `/health` 与登录复验在合入之后补记,本段不将其记为已完成。 +同一次会话里不带 `-run` 的 `go test -race -count=1 -timeout 180s ./internal/docgov/` 亦为 `ok`(1.012s)。 + +合入 dev `b9339cd2` 后 `./scripts/launch.sh --no-docker` 重建并重启(2026-09-28 09:10 UTC,PID 2447734): + +- `GET /health` → HTTP 200,`status=ok`,`schema_version=78` +- `POST /api/v1/auth/login` 空 JSON → HTTP 401,`error=用户名或密码不能为空`,`request_id=req_e28309cc8d615ed4` +- `GET http://127.0.0.1:3100/api/v1/auth/public-config` → HTTP 200 + +评价:PASS。这确认进程在听并且登录校验生效,不是产品登录业务的新用例。 ## 六、 自动化测试套件汇总 (Test Suite Execution) @@ -44,4 +52,4 @@ ok chat-agent-system/internal/docgov 1.012s ## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) -工程回归达到本修复的单测终点。合入 local dev 后需重建 `bin/agent-server` 并确认 `/health` 与空登录请求返回 401 而不是 500。`ISSUE-20260926-docgov-memdocs-poison` 仍开放。 +工程回归与 dev 重启复验都已完成。`ISSUE-20260926-docgov-memdocs-poison` 仍开放。