merge: truthful integration rebuild command

This commit is contained in:
weichen
2026-09-13 04:35:58 +00:00
9 changed files with 52 additions and 19 deletions
@@ -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` 语义)
## 开放问题
+2 -2
View File
@@ -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`
@@ -35,6 +35,8 @@ mutex: intent
4. [x] 实现任务/租约状态刷新恢复与统一提示
5. [x] 实现命名文档的服务端鉴权只读总结(“总结”不止是不写入)
6. [ ] 执行前端、Go、PG 与真实 PI 双标签页验收
- [x] Go、前端、构建、dev 重建与真实 PI 只读总结
- [ ] 浏览器刷新恢复与双标签页 busy 可见性
## 验收标准
@@ -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 会话。
## 相关链接
+2 -1
View File
@@ -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` |
---
+1 -1
View File
@@ -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` |
@@ -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”仍需补录。真实会话中的诊断消息与误启动产物只记录证据,不在未获确认时删除或回滚。
+1 -1
View File
@@ -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
```
+17 -4
View File
@@ -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 <<EOF
用法:
$0 <shared|dev|test|main|all> <start|stop|restart|status|logs|down>
$0 <shared|dev|test|main|all> <start|stop|restart|rebuild|status|logs|down>
示例:
$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