diff --git a/.doc/audit/2026-09-13-conversation-intent-runtime-state.md b/.doc/audit/2026-09-13-conversation-intent-runtime-state.md index cda1a70d..4da66ffb 100644 --- a/.doc/audit/2026-09-13-conversation-intent-runtime-state.md +++ b/.doc/audit/2026-09-13-conversation-intent-runtime-state.md @@ -39,6 +39,10 @@ dev PostgreSQL 的 `sess-p143-u9` 在 03:17–03:32 记录了 `debug ping`、`te 并发请求因有效租约拒绝时,事件被分类为 `INTERNAL_ERROR/fatal/actions=[restart]`,用户看到“系统内部错误,请重新开始会话”。实际是可预期的 `DOC_BUSY` 状态,应禁止重复启动并展示持有人、进度与预计状态,而不是建议重启会话。 +### 6. dev restart 不会加载新代码,健康检查可对旧镜像误报通过 + +`env-service.sh dev restart` 调用的是 `docker compose restart`;应用代码未挂载进容器,因此该命令只重启旧镜像。第一次修复后真实验证仍返回旧的 `CASUAL_CHAT`,但 `/health` 与 `/ready` 都为绿色。重建 app 镜像后,同一句话才返回 `QUERY_DOC_STATUS/doc_summary`。已新增显式 `rebuild` 动作,并将集成冒烟命令改为 `dev rebuild`。 + ## 严重度 `critical`:真实会话污染破坏可审计性;只读请求触发写入违反用户意图;刷新丢失恢复能力;后台编辑不可见导致重复劳动和冲突。 @@ -59,6 +63,7 @@ dev PostgreSQL 的 `sess-p143-u9` 在 03:17–03:32 记录了 `debug ping`、`te - `web/src/App.tsx` - `web/src/api/chatWindow.ts` - `internal/taskrun/manager.go` +- `scripts/env-service.sh`(`restart` 与 `rebuild` 语义) ## 开放问题 diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 9440f878..eadb9f17 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -1,7 +1,7 @@ # 当前焦点 **更新**: 2026-09-13 -**production_ready**: no(真实 PI 刷新 E2E 与只读文档总结验收待补录) +**production_ready**: no(只读文档总结已通过真实 PI;刷新/双标签页 busy 浏览器 E2E 待补录) ## 焦点 @@ -22,7 +22,7 @@ | holder | phase | since | scope | queue | |--------|-------|-------|-------|-------| -| Codex | merging | 2026-09-13 04:24 UTC | authorized readonly document summary | - | +| Codex | smoke | 2026-09-13 04:24 UTC | chat state + readonly summary | - | **phase**: `idle` | `merging` | `smoke` | `e2e` diff --git a/.doc/ops/short-term/2026-09-13-conversation-intent-runtime-state.md b/.doc/ops/short-term/2026-09-13-conversation-intent-runtime-state.md index 551e4b12..dd2c6f62 100644 --- a/.doc/ops/short-term/2026-09-13-conversation-intent-runtime-state.md +++ b/.doc/ops/short-term/2026-09-13-conversation-intent-runtime-state.md @@ -35,6 +35,8 @@ mutex: intent 4. [x] 实现任务/租约状态刷新恢复与统一提示 5. [x] 实现命名文档的服务端鉴权只读总结(“总结”不止是不写入) 6. [ ] 执行前端、Go、PG 与真实 PI 双标签页验收 + - [x] Go、前端、构建、dev 重建与真实 PI 只读总结 + - [ ] 浏览器刷新恢复与双标签页 busy 可见性 ## 验收标准 diff --git a/.doc/remediation/2026-09-13-conversation-intent-runtime-state-remediation.md b/.doc/remediation/2026-09-13-conversation-intent-runtime-state-remediation.md index 3261ee9e..951752cb 100644 --- a/.doc/remediation/2026-09-13-conversation-intent-runtime-state-remediation.md +++ b/.doc/remediation/2026-09-13-conversation-intent-runtime-state-remediation.md @@ -30,12 +30,12 @@ updated: 2026-09-13 ## 验收标准 -- [ ] “总结一下用户初始需求表”返回已有文档摘要,不创建 `task_runs`。 +- [x] “总结一下用户初始需求表”返回已有文档摘要,不创建 `task_runs`。 - [ ] “开始编写用户初始需求表”只创建一个 run;运行中再次写请求不创建失败 run。 - [ ] 任务失败后刷新,错误码、诊断摘要及允许动作与刷新前一致。 - [ ] 运行中刷新,聊天占位、阶段进度、文档 busy 标识和输入保护均恢复。 - [ ] 租约释放/任务终态后 UI 自动解除 busy,无需用户手动刷新。 -- [ ] 测试使用专用项目/会话并在 teardown 清理;禁止 `debug/test` 探针进入非 fixture 会话。 +- [x] 测试使用专用项目/会话并在 teardown 清理;禁止 `debug/test` 探针进入非 fixture 会话。 ## 相关链接 diff --git a/.doc/remediation/gap-matrix.md b/.doc/remediation/gap-matrix.md index f1187bf0..84bb9eb7 100644 --- a/.doc/remediation/gap-matrix.md +++ b/.doc/remediation/gap-matrix.md @@ -48,7 +48,7 @@ | HEALTH-SCHEMA-CACHE | health schema 启动缓存 | PASS | `LiveSchemaVersion` + health 实时读 | | GO-VET-ASSET | asset handler resp before err | PASS | `asset_handlers_test.go` err-first | | ENV-TEST-STALE | test 旧镜像/schema 漂移 | PASS | rebuild app;health schema_version=25 | -| ENV-DEV-STALE | dev 二进制/schema 漂移 | PASS | docker app 重启;schema_version=25 | +| ENV-DEV-STALE | dev 二进制/schema 漂移 | PASS | docker app 重建;schema_version=25 | | ENV-MAIN-MISSING | main 未部署验收 | PASS | docker 创建 `data/main`;compose 注入 ADMIN/KB 密码;health/ready schema 25 | | DOC-SSOT | 文档叙事漂移 | PASS | 本矩阵 + superseded 标记 + ops | | OPS-AGENTS | 多 Agent 协作规范 | PASS | `AGENTS.md` / `PROJECT.md` / `.doc/ops` | @@ -59,6 +59,7 @@ |---|---|---|---|---| | CHAT-HISTORY-REFRESH | 工作流激活后刷新,对话正文被阶段过滤器清空,但分类数量与锚点仍按全量返回 | **PASS** | [test-report](../test-reports/2026-09-13-chat-history-refresh-test-report.md);代码:`message_scope.go`、`chat_history_auth.go`、goose 00026/00027 | 真实 PI 刷新 E2E 待 dev 容器补录(自动化/PG 已 PASS) | | CHAT-INTENT-STATE | 真实会话被诊断探针污染;只读查询误启动文档写任务;错误动作与编辑状态刷新后丢失 | **FAIL** | [audit](../audit/2026-09-13-conversation-intent-runtime-state.md);dev `sess-p143-u9` / task run / lease 现场 | [remediation](./2026-09-13-conversation-intent-runtime-state-remediation.md) | +| ENV-RESTART-SOURCE | `docker compose restart` 只重启旧镜像,健康检查无法证明合入代码已部署 | **PASS** | `env-service.sh rebuild` + 真实摘要重测 | 集成冒烟统一使用 `dev rebuild` | --- diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index e0ddd168..bedcffcd 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -15,7 +15,7 @@ | 模块 | 能力 | 状态 | 证据 | 缺口/后续 | mutex | |------|------|------|------|-----------|-------| -| 意图识别 L1 | 18 类 Intent + 三分支消解 | partial | [system-design/intent-recognition](../system-design/intent-recognition/);[现场专项审计](../audit/2026-09-13-conversation-intent-runtime-state.md) | 客户端关键词捷径绕过意图合同,只读文档查询会触发写任务 | `intent` | +| 意图识别 L1 | 18 类 Intent + 三分支消解 | partial | [system-design/intent-recognition](../system-design/intent-recognition/);[现场专项审计](../audit/2026-09-13-conversation-intent-runtime-state.md) | 明确写动作与只读总结已分流;完整 hard-negative/eval 集仍待补齐 | `intent` | | 对话 / ctxmgr | 多轮上下文、记忆、摘要 | partial | [system-design/multi-turn-dialogue](../system-design/multi-turn-dialogue/);[刷新恢复专项审计](../audit/2026-09-13-chat-history-refresh-disappears.md) | `CHAT-HISTORY-REFRESH`:作用域写入、同集授权统计、历史回填;语义摘要(D5 backlog) | `chat` | | 智能体小队 | 角色-任务-工作区-黑板 | done | [system-design/agent-squad](../system-design/agent-squad/);[test 2026-09-07](../test-reports/2026-09-07-dynamic-squad-planning-test-report.md) | 非关键步骤降级(A5/A6 backlog) | `squad` | | 工作流治理 | 三正式工作流 + 阶段门禁 | done | [remediation/three-workflows](../remediation/2026-09-12-three-workflows-strict-governance-remediation.md);[test 2026-09-12](../test-reports/2026-09-12-three-workflows-governance-remediation-test-report.md) | Phase2 设计器 partial | `workflow` | diff --git a/.doc/test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md b/.doc/test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md index ddfdf84b..56d7afb8 100644 --- a/.doc/test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md +++ b/.doc/test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md @@ -59,21 +59,33 @@ ### 用例 E:真实 PI + 浏览器刷新/双标签页 -- **Input**: 待合入 dev 后执行 -- **Actual Output**: 未执行 -- **Evaluation**: DEFERRED +- **Input**: 真实 PI 只读总结已执行;浏览器刷新/双标签页待执行 +- **Actual Output**: 只读总结见用例 H;刷新和 busy 可见性尚无浏览器证据 +- **Evaluation**: PARTIAL ### 用例 F:dev 集成冒烟 -- **Input**: `go vet ./...`、`go test -short ./...`、`./scripts/env-service.sh dev restart`、`/health`、`/ready` -- **Actual Output**: 全部 PASS;dev 数据库、schema 27 与 task store 均 ready -- **Evaluation**: PASS;共享集成槽位已释放 +- **Input**: `go vet ./...`、`go test -short ./...`、前端测试/构建、`/health`、`/ready` +- **Actual Output**: 全部 PASS;前端 Node 185 + Vitest 24;dev 数据库、schema 27 与 task store 均 ready +- **Evaluation**: PASS;但 `env-service.sh dev restart` 只重启旧镜像,不能作为新代码已部署的证据 ### 用例 G:服务端鉴权只读文档总结 - **Input**: 原句意图测试、协调层只读 reader 测试、文档别名选择测试、提示注入隔离测试 - **Actual Output**: 原句识别为 `QUERY_DOC_STATUS/query_topic=doc_summary`;正文只从服务端项目/阶段权限过滤后的 reader 获取;无 `PendingAction`;生成目录仅允许 `reply.md` -- **Evaluation**: PASS(代码级);待 dev 真实会话验证“不新增 task_runs” +- **Evaluation**: PASS + +### 用例 H:dev 真实 PI 隔离会话总结 + +- **Input**: `fixture-summary-20260913-codex-01` / project 143 / `总结一下用户初始需求表` +- **Actual Output**: `QUERY_DOC_STATUS`、`query_topic=doc_summary`、`target_doc=用户初始需求表`、`reply_source=pi-agent`、`pending_action=null`;返回现有文档实质摘要;`task_runs` 前后均为 0;租约前后为空;用户原会话 `sess-p143-u9` 最大消息 ID 仍为 567 +- **Evaluation**: PASS;fixture 的 2 条消息与 1 条会话已精确清理,清理后消息/run 均为 0 + +### 用例 I:容器代码新鲜度 + +- **Input**: 先 `dev restart`,再重建 app 镜像后重复用例 H +- **Actual Output**: restart 后仍返回旧版 `CASUAL_CHAT`;重建后返回新版 `QUERY_DOC_STATUS/doc_summary` +- **Evaluation**: 首次 FAIL、整改后 PASS;新增 `env-service.sh rebuild`,集成冒烟改用 `dev rebuild` ## 六、 自动化测试套件汇总 (Test Suite Execution) @@ -88,4 +100,4 @@ git diff --check PASS ## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) -代码级与构建门禁通过,达到进入集成槽位的条件;尚不能标记发布完成。合入 dev 后必须使用隔离 fixture 执行真实 PI、刷新恢复、双标签页租约可见性与“不新增第二 run”验收。真实会话中的诊断消息与误启动产物只记录证据,不在未获确认时删除或回滚。 +代码级、构建门禁及真实 PI 只读总结已通过;原句不会创建任务或租约。尚不能标记发布完成:浏览器刷新恢复、双标签页租约可见性与并发写“不新增第二 run”仍需补录。真实会话中的诊断消息与误启动产物只记录证据,不在未获确认时删除或回滚。 diff --git a/AGENTS.md b/AGENTS.md index e27aa717..8c91bccc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -150,7 +150,7 @@ CURRENT「集成槽位」:`holder` | `phase`(idle/merging/smoke/e2e)| `sin ```bash go vet ./... go test -short ./... -./scripts/env-service.sh dev restart +./scripts/env-service.sh dev rebuild curl -sf http://127.0.0.1:8080/health ``` diff --git a/scripts/env-service.sh b/scripts/env-service.sh index 68571b07..88e86f7a 100755 --- a/scripts/env-service.sh +++ b/scripts/env-service.sh @@ -9,7 +9,7 @@ # main : 生产环境服务 (端口 8000, DB 5435, 数据隔离 ./data/main) # all : 所有环境 # -# 支持命令: start | stop | restart | status | logs | down +# 支持命令: start | stop | restart | rebuild | status | logs | down # ============================================================================= set -eo pipefail @@ -25,11 +25,12 @@ ACTION="$2" show_usage() { cat < + $0 示例: $0 shared start # 启动共享知识库基础服务 $0 dev start # 启动开发分支环境 + $0 dev rebuild # 重建镜像并重建容器(合入代码后使用) $0 test start # 启动测试分支环境 $0 main start # 启动主分支生产环境 $0 all status # 查看所有环境服务状态 @@ -113,9 +114,15 @@ run_compose() { ;; restart) ensure_shared_network - echo "==> [${target}] 重启服务..." + echo "==> [${target}] 重启现有容器(不会重建镜像)..." docker compose -f "${compose_file}" "${env_args[@]}" restart ;; + rebuild) + ensure_shared_network + echo "==> [${target}] 重建镜像并重建容器..." + docker compose -f "${compose_file}" "${env_args[@]}" up -d --build + echo "==> [${target}] 镜像与容器已更新" + ;; status|ps) echo "------------------------------------------------------------" echo "环境: [${target}] (编排: ${compose_file})" @@ -161,8 +168,14 @@ case "${ENV_TARGET}" in run_compose "test" "status" run_compose "main" "status" ;; + rebuild) + run_compose "shared" "rebuild" + run_compose "dev" "rebuild" + run_compose "test" "rebuild" + run_compose "main" "rebuild" + ;; *) - echo "[错误] 'all' 仅支持 start | stop | down | status 操作" + echo "[错误] 'all' 仅支持 start | stop | down | rebuild | status 操作" exit 1 ;; esac