Compare commits
65
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bd038b126b | ||
|
|
950f881968 | ||
|
|
7da2c1fdef | ||
|
|
079225495e | ||
|
|
badfc19812 | ||
|
|
e83de73fd0 | ||
|
|
a3d382c6d9 | ||
|
|
133ceb454c | ||
|
|
a94745370d | ||
|
|
22cac8dcbe | ||
|
|
fe46705b67 | ||
|
|
e71db3dce6 | ||
|
|
0504884e04 | ||
|
|
6b43007d7a | ||
|
|
4ac8ca2308 | ||
|
|
eaad5c74d4 | ||
|
|
8a9fbd8280 | ||
|
|
c47b437b22 | ||
|
|
8ef95891a4 | ||
|
|
48c985318c | ||
|
|
b4388934a0 | ||
|
|
3a3a79769e | ||
|
|
58f0ed65c1 | ||
|
|
fad7fac044 | ||
|
|
e347c0d138 | ||
|
|
d4b38a273b | ||
|
|
37fb1ba44e | ||
|
|
43688fd4c3 | ||
|
|
1313cf19b1 | ||
|
|
518d5d6132 | ||
|
|
5c9f9aa57c | ||
|
|
95329aad58 | ||
|
|
9d98f1ae33 | ||
|
|
2b96987ddd | ||
|
|
c3dad4c643 | ||
|
|
8e4beff5f8 | ||
|
|
1497473186 | ||
|
|
a82bfdb6d1 | ||
|
|
6d04d98c5f | ||
|
|
69cae9e4e7 | ||
|
|
89abc757f9 | ||
|
|
95880bf168 | ||
|
|
213ad0159a | ||
|
|
f603f63ca7 | ||
|
|
18a323c4dc | ||
|
|
21782751ab | ||
|
|
aef3d6d5cb | ||
|
|
28478bdca5 | ||
|
|
638083cc74 | ||
|
|
bee907ef7e | ||
|
|
782b2dd2ce | ||
|
|
7a6cfeefeb | ||
|
|
9f29b0badb | ||
|
|
c7ee6b825e | ||
|
|
032fdb050f | ||
|
|
6800a2af29 | ||
|
|
c8dbefe8a1 | ||
|
|
5cd22c7327 | ||
|
|
5a5a91dd7f | ||
|
|
db1706cd24 | ||
|
|
686f739b19 | ||
|
|
848a0457a0 | ||
|
|
033462a4e6 | ||
|
|
d3364f9125 | ||
|
|
8fdcd983a6 |
@@ -0,0 +1,40 @@
|
||||
---
|
||||
title: "功能启用与文档修改影响分析调研"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Codex
|
||||
branch: feature/capability-enablement-impact-plan
|
||||
worktree: "-"
|
||||
mutex: capability-impact-research
|
||||
---
|
||||
|
||||
# 功能启用与文档修改影响分析调研
|
||||
|
||||
## 目标
|
||||
核实已实现功能的有效启用状态,形成分阶段启用方案及需求追踪、增量影响分析设计。
|
||||
|
||||
## 范围
|
||||
源码、配置、只读运行态、已有证据;研究报告与整改方案落盘。
|
||||
|
||||
## 非目标
|
||||
本轮不修改业务代码、不启用开关、不改变共享容器或真实项目数据。
|
||||
|
||||
## 步骤
|
||||
1. [x] 核实功能状态和接线。
|
||||
2. [x] 调研已有修改报告、依赖与需求追踪模型。
|
||||
3. [x] 编写详细报告和可实施方案,完成文档核查。
|
||||
|
||||
## 验收标准
|
||||
- [x] 当前事实与历史验收分开;每项启用方案有前置条件、验收、回退。
|
||||
- [x] 影响分析有版本、权限、增量更新、一致性和用户交互契约。
|
||||
|
||||
## 证据 / 备注
|
||||
开始时 dev=8fdcd98,工作区干净;git pull --ff-only 返回 Already up to date。无集成槽占用、无 push 授权。
|
||||
|
||||
产物:
|
||||
|
||||
- [调研报告](../../ops/research/2026-09-20-capability-enablement-impact-research.md)
|
||||
- [整改方案](../../remediation/2026-09-20-capability-enablement-impact-plan.md)
|
||||
- [FEATURE-MATRIX 校准](../../status/FEATURE-MATRIX.md)
|
||||
- [方案审阅记录](../../ops/research/2026-09-20-capability-enablement-impact-plan-review.md)
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: "2026-09-20 P0 热修(迁移 / 越权 / 稳定性 / 凭证)"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: docs/p0-closeout-2026-09-20
|
||||
worktree: "-"
|
||||
mutex: docs
|
||||
---
|
||||
|
||||
# 2026-09-20 P0 热修
|
||||
|
||||
## 目标
|
||||
|
||||
关闭系统体检发现的 P0 critical:迁移断链、三项 IDOR、进程 panic/race、凭证泄漏与生产口令轮换。
|
||||
|
||||
## 范围
|
||||
|
||||
- Wave 0–4(见 [整改方案](../../remediation/2026-09-20-p0-remediation-plan.md))
|
||||
- 后续实现分支:`fix/capability-merge-00058-2026-09-20`、`fix/authz-idor-hotfixes-2026-09-20`、`fix/runtime-panic-races-2026-09-20`、`fix/credential-hardening-2026-09-20`、`docs/p0-closeout-2026-09-20`
|
||||
|
||||
## 非目标
|
||||
|
||||
- main 分支对齐晋升
|
||||
- FAV / SWBOOT-10 / D7 / MULTI_INTENT full
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] Wave 0:审计与整改文档、CURRENT 认领、long-term 增补
|
||||
2. [x] Wave 1:capability 合入 + 00058 + rebuild
|
||||
3. [x] Wave 2:三项越权
|
||||
4. [x] Wave 2b:panic/race/recover/XSS
|
||||
5. [x] Wave 3:凭证 + 口令轮换
|
||||
6. [x] Wave 4:测试报告与收口
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 见 [测试报告](../../test-reports/2026-09-20-p0-hotfixes-test-report.md)
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: [../../audit/2026-09-20-system-triage-audit.md](../../audit/2026-09-20-system-triage-audit.md)
|
||||
- Remediation: [../../remediation/2026-09-20-p0-remediation-plan.md](../../remediation/2026-09-20-p0-remediation-plan.md)
|
||||
- Test report: [../../test-reports/2026-09-20-p0-hotfixes-test-report.md](../../test-reports/2026-09-20-p0-hotfixes-test-report.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
(各波次合入 commit 与健康输出)
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: "系统权限设置与项目协作多项缺陷排查"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
severity: high
|
||||
---
|
||||
|
||||
# 系统权限设置与项目协作多项缺陷排查
|
||||
|
||||
## 现象
|
||||
|
||||
用户报告:成员管理勾选无效、系统设置「允许编制人兼任审核批准」400、PDF 预览被拦截、任务 runs 403 刷屏、发起编制被标 NETWORK_ERROR、注册/建号 rollback、改密后刷新再强制改密、退出重登出现同名重复项目、无项目仍可对话、右侧工具栏默认展开且不记忆。
|
||||
|
||||
## 根因分析
|
||||
|
||||
| # | 根因 | 关键路径 |
|
||||
|---|------|----------|
|
||||
| 1 | CSP 缺 `frame-src`,blob iframe fallback 到 `default-src 'self'` | `internal/server/cors.go` |
|
||||
| 2 | PdfViewer 同源 iframe 直连,触发 `X-Frame-Options: DENY` 原生拦截页 | `web/src/components/doc/preview/renderers/PdfViewer.tsx` |
|
||||
| 3 | 前端未传 `expected_revision`(该 key 后端强制 CAS) | `web/src/api/systemAdmin.ts` / SettingsSection |
|
||||
| 4 | `ProjectSettingsApiError` 字段名与消费方 `httpStatus`/`errorCode` 不一致 | `web/src/api/projectSettingsError.ts` |
|
||||
| 5 | task-run view 仅放行创建者/owner;前端 403 无停止轮询 | `task_run_auth.go` / `App.tsx` |
|
||||
| 6 | `CanManageProjectMembers` 未读细粒度权限位 | `internal/authz/service.go` |
|
||||
| 7 | memStore `ListProjectsForUser` 忽略成员表 | `internal/projectworkflow/store.go` |
|
||||
| 8 | `user_role_bindings` 插入吞错 → commit rollback;handler 一律 400 | `internal/auth/pg_store.go` |
|
||||
| 9 | 嵌套 `user.mustChangePassword` OR 合并复活 + fetchMe 未回写 session | `authUserMap.ts` / WorkbenchView / useAuthenticatedWorkspaceSync |
|
||||
| 10 | `projects.name` 无唯一约束 + Create 无幂等键;logout 不清 projects 缓存 | `service.go` / migration 00056 / App logout |
|
||||
| 11 | `Project()<=0` 时跳过项目访问校验 | `handlers.go` / `sse.go` / `stage_access_helpers.go` |
|
||||
| 12 | `rightCollapsed` 默认 false 且无持久化 | `AppShell.tsx` / `storage.ts` |
|
||||
|
||||
## 严重度
|
||||
|
||||
`high`
|
||||
|
||||
## 关联整改
|
||||
|
||||
- Short-term: `.doc/ops/short-term/2026-09-20-bug-hunt-permissions-uploads.md`
|
||||
- 分支: `fix/bug-hunt-2026-09-20-permissions-and-uploads`
|
||||
|
||||
## 证据
|
||||
|
||||
- 产品决策:新增 `project:manage_members`;无项目禁止对话并置灰发送按钮;同创建人内项目名唯一 + `client_key` 幂等。
|
||||
- 迁移:`00055_...project-manage-members-permission.sql`、`00056_...project-create-idempotency.sql`
|
||||
|
||||
## 开放问题
|
||||
|
||||
- 无(本批范围内)
|
||||
@@ -0,0 +1,142 @@
|
||||
---
|
||||
title: "模块耦合现状审计(规范与分批整改基线)"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
severity: high
|
||||
---
|
||||
|
||||
# 模块耦合现状审计(规范与分批整改基线)
|
||||
|
||||
## 现象
|
||||
|
||||
系统已经是模块化单体,不是未治理的大泥球:`module-boundaries.yaml` + `internal/archtest` 已把 import 与事件登记清到零违规(`baseline_counts.import=0`、`event=0`,二者在 `block_kinds`),可靠事件由独立 `cmd/events` worker 经 PostgreSQL lease 消费。
|
||||
|
||||
故障仍会跨模块扩散的原因不在“缺总线”,而在四类残留:
|
||||
|
||||
1. HTTP 适配层直接持有领域具体类型,而不是只调用用例端口。
|
||||
2. `chat`、`app` 子包与 `coordinator` 用子包拆分避开了 Go 编译环,逻辑上仍互相依赖。
|
||||
3. `docgov` 的状态、角色和错误被多个模块当成本模块词汇使用。
|
||||
4. 带到期日的 SQL/路径例外仍允许非属主写入或拼接工作区路径。
|
||||
|
||||
本审计只记录证据与分级,不改代码。整改批次见 [分批计划](../remediation/2026-09-20-module-decoupling-batch-plan.md)。
|
||||
|
||||
## 根因分析
|
||||
|
||||
### 已有隔离基线(不要推倒)
|
||||
|
||||
| 机制 | 位置 | 现状 |
|
||||
|------|------|------|
|
||||
| 模块化单体 ADR | [2026-09-14-modular-monolith-decoupling](../adr/2026-09-14-modular-monolith-decoupling.md) | 不拆微服务;窄端口 + 组合根 + 领域事件 |
|
||||
| 静态边界 | [module-boundaries.yaml](../system-design/module-boundaries.yaml) | import allowlist、表唯一写者、路径属主、事件生产者/消费者 |
|
||||
| 架构门禁 | `internal/archtest`、`scripts/arch-check.sh --mode block` | import/event 零容忍 |
|
||||
| 进程内端口 | `internal/app/*flow`(例:`internal/app/chatflow/ports.go`) | 消费者拥有窄接口;组合根注入实现 |
|
||||
| 跨进程事件 | `internal/events` + `cmd/events` | PG outbox/inbox;dev `:8088` / test `:8089` / main `:8090` |
|
||||
| 事件契约 | `internal/events/registry.go` `StaticContracts()` | 11 个事件名、schema version、payload 字段 allowlist;与 YAML parity |
|
||||
|
||||
`StaticContracts` 现有事件:`document.agent_candidate_ready`、`document.agent_version_committed`、`document.downstream_impact_detected`、`document.change_report_degraded`、`document.approved`、`taskrun.completed`、`taskrun.cancelled`、`fav.artifact_staged`(`Enabled: false`)、`intent.plan.awaiting_input`、`intent.plan.step_changed`、`intent.plan.completed`。
|
||||
|
||||
### 热点 1(P1):`server` 上帝适配层
|
||||
|
||||
`internal/server/server.go` 的 `Server`(约 40–80 行)同时持有 `*bizdev.Service`、`*coordinator.CoordinatorEngine`、`*docgov.GovernanceEngine`、`*docrevision.Service`、`*taskrun.Manager`、`*projectinstance.Service`、`*pgxpool.Pool` 等具体类型。同结构体里只有少数字段是端口(`chatflow.ChatLog`、`chatflow.ContextAssembler`、`intentflow.Service`、`intent.Recognizer`)。
|
||||
|
||||
生产 import 覆盖约 30 个内部包(`server.go` 11–34 行)。handler 直接解释领域错误,例如 `internal/server/handlers.go` 对 `docgov.ErrDocumentBusy` 的分支(426、449 行)以及 `docgov.RoleAuthor`(702、1291 行)。
|
||||
|
||||
后果:领域包改一个错误或角色常量,HTTP 层必须跟着改;`pool` 还让适配层有机会绕过表属主写 SQL。
|
||||
|
||||
### 热点 2(P2):`chat` ↔ `app` ↔ `coordinator` 逻辑环
|
||||
|
||||
编译环被子包拆开了,依赖方向没有:
|
||||
|
||||
- `internal/chat/session.go` 11–13 行 import `app/chatflow`、`app/intentflow`、`coordinator`。
|
||||
- `internal/chat/action_executor.go` 10–14 行 import `app/intentflow`、`app/stageflow`、`coordinator`、`docgov`、`taskrun`,并持有具体引擎指针。
|
||||
- `internal/app/chatflow/ports.go` 又 import `coordinator`、`ctxmgr`、`projectinstance`(`AssembleRequest` 直接嵌 `coordinator.UserInfo`)。
|
||||
|
||||
`chat` 既是领域会话,又反向依赖用例包。用例一变,会话执行器就会编译失败,问题不会停在单一模块。
|
||||
|
||||
### 热点 3(P3):`docgov` 词汇泄漏
|
||||
|
||||
生产代码(不含本包测试)直接使用 `docgov` 状态/角色/错误的位置包括:
|
||||
|
||||
- `internal/coordinator/engine.go`:`ErrDocumentBusy`(955)、`StateDrafting`(1596、1598)。
|
||||
- `internal/bizdev/service.go`:`ErrDocumentLocked` / `ErrDocumentBusy`(718)。
|
||||
- `internal/server/handlers.go`、`document_revision_handlers.go`、`auth_helpers.go`:`RoleAuthor`、`ErrDocumentBusy`。
|
||||
- `internal/chat/action_executor.go`:动作名字符串 `"docgov.review_approve"`(58、150 行),以及 `docgov.StateDrafting`(90)。
|
||||
|
||||
这些不是稳定共享词汇(`internal/contracts/vocabulary` 尚未承接它们),而是领域实现类型被当公共 API。
|
||||
|
||||
### 热点 4(P3):工作流定义与实例网
|
||||
|
||||
- `internal/workflowdef/catalog.go` import `projectworkflow`。
|
||||
- `internal/workflowdef/validator_v2.go` import `workflow`。
|
||||
- `internal/projectinstance` 生产文件(`store.go`、`service.go`、`gate.go`、`types.go` 等)import `workflowdef`。
|
||||
- `internal/workflow/runtime/orchestrator.go` import `projectinstance`。
|
||||
|
||||
定义、目录、实例和运行时互相看得见对方的包。改一份工作流校验会同时碰到定义包和实例包。
|
||||
|
||||
### 热点 5(P4):巨型文件
|
||||
|
||||
非测试生产文件行数(2026-09-20 `wc -l` 口径,探索盘点):
|
||||
|
||||
| 行数 | 文件 |
|
||||
|------|------|
|
||||
| 1844 | `internal/coordinator/engine.go` |
|
||||
| 1590 | `internal/bizdev/service.go` |
|
||||
| 1395 | `internal/server/handlers.go` |
|
||||
| 1291 | `internal/projectinstance/store.go` |
|
||||
| 1245 | `internal/intent/recognizer.go` |
|
||||
| 1235 | `internal/projectworkflow/store.go` |
|
||||
| 1207 | `internal/docgov/engine.go` |
|
||||
| 1172 | `internal/docrevision/service.go` |
|
||||
| 1151 | `internal/squad/workspace.go` |
|
||||
| 1028 | `internal/freedoc/service.go` |
|
||||
|
||||
单文件过大本身不是耦合,但它把多个用例绑在同一变更面上,评审和回滚半径变大。拆分应跟在解环之后,避免边搬边改依赖。
|
||||
|
||||
### 热点 6(P4):前端 API 层无统一客户端
|
||||
|
||||
`web/src/api/` 约 37 个文件按域各写 `fetch()`,`API_BASE` 与鉴权头分散。错误信封、重试和 401 处理无法在一处收口,后端错误契约一变就会在多个 api 文件重复漏改。这是适配层问题,不是把前端改成 RPC。
|
||||
|
||||
### 热点 7(P2,有到期日):边界例外未清零
|
||||
|
||||
[module-boundaries.yaml](../system-design/module-boundaries.yaml) `exceptions` 共 21 条,`baseline_counts` 为 sql_write 5、path 16。
|
||||
|
||||
| 种类 | 条数 | 里程碑 | 到期 | 风险 |
|
||||
|------|------|--------|------|------|
|
||||
| `sql_write` | 4 | U3 | 2026-09-28 | **8 天后到期**。`docduty`、`docrevision` 仍写 `document_records` / `freeform_documents` |
|
||||
| `sql_write` | 1 | U8 | 2026-10-26 | `projectinstance` 终止流程直接取消 `task_runs` |
|
||||
| `path` | 2 | U4 | 2026-09-28 | **同样 8 天后到期**。`server` 与 `docrevision` 仍点名 `output.md` |
|
||||
| `path` | 14 | U5 | 2026-10-12 | `agent`、`bizdev`、`coordinator`、`docgov`、`storage` 仍拼接工作区路径或把 `data/dev` 写进提示 |
|
||||
|
||||
到期后若门禁把这些 kind 升为 block 而代码未迁走,构建会失败;若继续延期而不迁,非属主写入会继续让文档/任务故障跨包扩散。本轮不改 YAML,清零归整改批次 G。
|
||||
|
||||
## 严重度
|
||||
|
||||
整体 `high`:不会单独打穿已签发布门禁(`production_ready` 不因本审计回退),但 P1/P2 使“问题停在单一模块”尚未成立。
|
||||
|
||||
| 级别 | 热点 | 扩散方式 |
|
||||
|------|------|----------|
|
||||
| P1 | server 具体类型装配 | 领域改动直接编译失败到 HTTP |
|
||||
| P2 | chat/app/coordinator 逻辑环 | 会话、意图用例、协调引擎必须同改 |
|
||||
| P2 | 2026-09-28 到期的 sql_write/path 例外 | 非属主写表或读工作区文件 |
|
||||
| P3 | docgov 词汇泄漏 | 状态机常量变成跨包协议 |
|
||||
| P3 | workflow 定义/实例网 | 校验与运行时同改 |
|
||||
| P4 | 巨型文件、前端 fetch 分散 | 变更面大,不立刻产生跨表写入 |
|
||||
|
||||
## 关联整改
|
||||
|
||||
- Remediation: [2026-09-20-module-decoupling-batch-plan.md](../remediation/2026-09-20-module-decoupling-batch-plan.md)
|
||||
- 开发规范: [2026-09-20-module-development-standards.md](../system-design/2026-09-20-module-development-standards.md)
|
||||
- 上位约束(不重复制定): [架构](../system-design/2026-09-14-module-decoupling-architecture.md)、[Phase 2](../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md)、[影响面守则 §2](../remediation/2026-09-16-partial-deferred-completion-plan.md)
|
||||
|
||||
## 证据
|
||||
|
||||
- 结构体与 import:`internal/server/server.go`、`internal/chat/session.go`、`internal/chat/action_executor.go`、`internal/app/chatflow/ports.go`。
|
||||
- 事件契约:`internal/events/registry.go` `StaticContracts`。
|
||||
- 例外账本:`module-boundaries.yaml` `exceptions` 与 `baseline_counts`(import 0 / sql_write 5 / path 16 / event 0)。
|
||||
- 盘点方式:2026-09-20 只读检索生产 import 与 `docgov` 符号引用;行数来自当时文件长度,后续拆分后以 `wc -l` 重测为准。
|
||||
|
||||
## 开放问题
|
||||
|
||||
- U3/U4 例外在 2026-09-28 到期后,是先延长豁免并写原因,还是立刻占用 `docgov` mutex 做批次 G 的第一刀。本审计不代决,批次 G 开工前必须二选一,禁止静默改到期日。
|
||||
- `internal/contracts/vocabulary` 在架构文档中已定义,代码侧尚未作为 docgov 状态/角色的唯一出口。批次 C 再决定是新建该包还是把稳定枚举留在消费者端口。
|
||||
@@ -0,0 +1,68 @@
|
||||
---
|
||||
title: "2026-09-20 系统全量体检审计"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
severity: high
|
||||
---
|
||||
|
||||
# 2026-09-20 系统全量体检审计
|
||||
|
||||
## 现象
|
||||
|
||||
在 `production_ready=yes`、dev/test/main 健康、近期 triage 已合入的前提下,对全系统做只读深度体检,发现若干**未写入 gap-matrix 的 critical/high**,以及一批 medium/low 加固项。
|
||||
|
||||
方法:四路并行深潜(后端 Go、安全鉴权、前端 web、基础设施)+ 本机实证(goose 版本表、容器 health、口令登录、代码交叉复核)。
|
||||
|
||||
## 根因分析(P0 / critical,均已实证)
|
||||
|
||||
| ID | 发现 | 位置 | 证据 |
|
||||
|----|------|------|------|
|
||||
| P0-MIG | 迁移序号空洞 00054;`chat_summaries` 建表与 summarizer 写失败修复滞留未合入分支 | `feature/capability-enablement-impact-plan@848a0457`;dev 代码仍读写不存在表 | `goose_db_version` 53→55→57 跳号;`to_regclass('chat_summaries')` 空;`summarizer.go:119` `_ = err` |
|
||||
| P0-IDOR-PREF | 偏好写入信任请求体 `user_id`,无归属校验 | `internal/server/handlers.go:508-537` | 无 `requireAuthenticatedUser` 比对 |
|
||||
| P0-IDOR-SESS | `handleGetProject` 以 `callerUserID=0` 调会话,归属校验被跳过 | `server.go:458-463`;`handlers.go` / `project_handlers.go` | `if callerUserID > 0` 守卫 |
|
||||
| P0-IDOR-RECAT | 重分类无会话归属;空 `session_id` 触及全库消息 | `chat_recategorize_api.go`;`ctxmgr/recategorize.go` | `WHERE ($1 = '' OR session_id = $1)` |
|
||||
| P0-PANIC | taskrun 订阅发送在锁外,Unsubscribe `close` 后向 closed channel 发送 panic | `taskrun/manager.go:481-497` vs `:590` | select default 不挡 closed;全仓非测试 `recover()`=0 |
|
||||
| P0-RACE | 同步 `POST /chat` 不取 `execMu`,与 SSE 并发 data race | `handlers.go:240` vs `sse.go:341` | 09-19 C2 残留半修 |
|
||||
| P0-CRED-BACKUP | 三环境 DB 口令硬编码进仓库;生产口令与脚本一致可登录 | `scripts/backup-system-db.sh:43-56` | 实测 `prod_highly_secure_db_pass` 可连 main |
|
||||
| P0-CRED-PUSH | push 脚本把 token 拼进 URL,`ps` 可见 | `scripts/git-push-dev.sh:23` | `https://oauth2:${TOKEN}@...` |
|
||||
| P0-XSS | 块编辑器 math 错误分支未转义 | `BlockEditorModal.tsx:206`;`MathBlockView.tsx:20` | catch 裸拼 + `dangerouslySetInnerHTML` |
|
||||
|
||||
### 环境与分支脱节(本轮不做晋升,记 backlog)
|
||||
|
||||
| ID | 发现 | 证据 |
|
||||
|----|------|------|
|
||||
| ENV-MAIN-DRIFT | main 分支 goose 最高 00025,main 库 schema 52;灾备从分支重建不可复现 | `git ls-tree main`;`goose_db_version` MAX=52 |
|
||||
| ENV-TEST-DRIFT | test 分支最高 00056,test 库已 57 | 实测 |
|
||||
| DOC-SCHEMA | CURRENT 写 dev schema 56,实测 57 | health JSON |
|
||||
| GOOSE-DUP56 | dev 库 version_id=56 记账两行(id 57/58,间隔 2ms) | SQL 取证 |
|
||||
|
||||
## 严重度
|
||||
|
||||
- **critical / P0**:上表 P0-*(本轮整改)
|
||||
- **high / medium / low**:见下方「非 P0 清单」与 [long-term](../ops/long-term/2026-09-19-audit-remainder.md) 2026-09-20 增补区
|
||||
|
||||
## 关联整改
|
||||
|
||||
- Remediation: [../remediation/2026-09-20-p0-remediation-plan.md](../remediation/2026-09-20-p0-remediation-plan.md)
|
||||
- Short-term: [../ops/short-term/2026-09-20-p0-hotfixes.md](../ops/short-term/2026-09-20-p0-hotfixes.md)
|
||||
|
||||
## 证据
|
||||
|
||||
- `go vet ./...` 零告警(2026-09-20)
|
||||
- `go test -short ./...`:仅 `TestPiAgentDockerBuildContext_RunnerModulesPresent` 因外网镜像源 EOF 失败,属测试卫生
|
||||
- 三环境 health:dev/test schema **57**,main **52**;events `:8088`/`:8089`/`:8090` ok
|
||||
- 四路深潜交叉:IDOR×3、XSS、凭证、迁移空洞均被 ≥2 条路径或本机取证命中
|
||||
|
||||
## 非 P0 清单(摘要,详 long-term)
|
||||
|
||||
**后端**:XFF 限流可绕过;events `cancelFns` 只增不减;docrevision/docgov 全局锁内 DB I/O;Shutdown 5s vs 长任务;`idemLocks` 无界;SSE query 传消息;C1 缓存不失效;chat 落库非原子等。
|
||||
|
||||
**前端**:`useChatWindow` 切会话竞态;PLAN_CONFIRM 无 try/catch;turn Map 只增不减;重置密码死功能;ErrorBoundary 仅顶层;SSE `\r\n`;token localStorage + 无全局 401 登出等。
|
||||
|
||||
**基础设施**:容器 root、无资源限制;健康检查路径不一致;main events 挂 shared-net;init 三套;Dockerfile Go 1.23 基镜像;backup 无定时;main 分支对齐晋升专项。
|
||||
|
||||
## 开放问题
|
||||
|
||||
- capability 分支合入后 00054 重编号为 00058 是否与其他未合并旁支再撞号?(当前仅该分支占用 54)
|
||||
- main 分支对齐晋升时 00057 会对存量项目做不可逆改名——晋升前需预演清单
|
||||
@@ -13,6 +13,22 @@
|
||||
|
||||
## 核心文档(按阅读顺序推荐)
|
||||
|
||||
### 模块耦合现状(2026-09-20)
|
||||
|
||||
**文件**: [2026-09-20-module-coupling-audit.md](./2026-09-20-module-coupling-audit.md)
|
||||
|
||||
**结论**: 模块化单体与事件总线已在;残留扩散点是 server 具体类型装配、chat/app/coordinator 逻辑环、docgov 词汇泄漏,以及 2026-09-28 到期的 sql_write/path 例外。不改 `production_ready`。
|
||||
|
||||
**整改**: [分批计划](../remediation/2026-09-20-module-decoupling-batch-plan.md) · [开发规范](../system-design/2026-09-20-module-development-standards.md)
|
||||
|
||||
### 系统全量体检(2026-09-20)
|
||||
|
||||
**文件**: [2026-09-20-system-triage-audit.md](./2026-09-20-system-triage-audit.md)
|
||||
|
||||
**结论**: 迁移 00054 断链 + 三项 IDOR + taskrun channel panic + 凭证硬编码/暴露为 P0;main 分支与生产 schema 脱节记 backlog。
|
||||
|
||||
**整改**: [P0 热修方案](../remediation/2026-09-20-p0-remediation-plan.md) · [short-term](../ops/short-term/2026-09-20-p0-hotfixes.md)
|
||||
|
||||
### 可选职责空审核人 CreateOrGetDocument FK(2026-09-17)
|
||||
|
||||
**文件**: [2026-09-17-docgov-optional-duty-null-fk.md](./2026-09-17-docgov-optional-duty-null-fk.md)
|
||||
|
||||
@@ -43,7 +43,7 @@ AuthN column is **heuristic**; negative-test pointers filled where known.
|
||||
| POST | `/api/v1/auth/register` | `s.handleAuthRegister` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/auth/sessions` | `s.handleAuthSessions` | `server.go` | handler | see suite |
|
||||
| DELETE | `/api/v1/auth/sessions/{id}` | `s.handleAuthSessionByID` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/chat` | `s.handleChat` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/chat` | `s.handleChat` | `server.go` | session+project (ERR_NO_PROJECT if unbound + zero memberships) | see suite |
|
||||
| GET | `/api/v1/chat/categories` | `s.handleListChatCategories` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/dates` | `s.handleListChatDates` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/digests` | `s.handleListDailyDigests` | `server.go` | session+project | see suite |
|
||||
@@ -60,8 +60,8 @@ AuthN column is **heuristic**; negative-test pointers filled where known.
|
||||
| GET | `/api/v1/chat/search` | `s.handleChatSearch` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/sessions` | `s.handleListChatSessions` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/chat/sessions` | `s.handleUpsertChatSession` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/stream` | `s.handleChatStream` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/chat/stream` | `s.handleChatStream` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/stream` | `s.handleChatStream` | `server.go` | session+project (ERR_NO_PROJECT if unbound + zero memberships) | see suite |
|
||||
| POST | `/api/v1/chat/stream` | `s.handleChatStream` | `server.go` | session+project (ERR_NO_PROJECT if unbound + zero memberships) | see suite |
|
||||
| GET | `/api/v1/chat/turns/{client_turn_id}` | `s.handleGetChatTurn` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/unread` | `s.handleChatUnread` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/context/cases/recommend` | `s.handleRecommendCases` | `server.go` | handler | see suite |
|
||||
@@ -131,10 +131,10 @@ AuthN column is **heuristic**; negative-test pointers filled where known.
|
||||
| GET | `/api/v1/tasks/run/stream` | `s.handleRunTaskStream` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/tasks/run/stream` | `s.handleRunTaskStream` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/tasks/runs` | `s.handleCreateTaskRun` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/tasks/runs/{run_id}` | `s.handleGetTaskRun` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/tasks/runs/{run_id}/cancel` | `s.handleCancelTaskRun` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/tasks/runs/{run_id}/events` | `s.handleTaskRunEvents` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/tasks/runs/{run_id}/resume` | `s.handleResumeTaskRun` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/tasks/runs/{run_id}` | `s.handleGetTaskRun` | `server.go` | session+project member (view) | see suite |
|
||||
| POST | `/api/v1/tasks/runs/{run_id}/cancel` | `s.handleCancelTaskRun` | `server.go` | session+run owner or project owner | see suite |
|
||||
| GET | `/api/v1/tasks/runs/{run_id}/events` | `s.handleTaskRunEvents` | `server.go` | session+project member (view) | see suite |
|
||||
| POST | `/api/v1/tasks/runs/{run_id}/resume` | `s.handleResumeTaskRun` | `server.go` | session+run owner or project owner | see suite |
|
||||
| GET | `/api/v1/workflow-instances/{id}` | `s.handleGetWorkflowInstance` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/workflow-instances/{id}/stages/{stage}/advance` | `s.handleAdvanceStage` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/workflow-instances/{id}/stages/{stage}/readiness` | `s.handleGetStageReadiness` | `server.go` | session+project | see suite |
|
||||
|
||||
+31
-11
@@ -1,25 +1,42 @@
|
||||
# 当前焦点
|
||||
|
||||
**更新**: 2026-09-19
|
||||
**production_ready**: yes(门禁 B1–B4 已签;dev schema 53,test/main schema 52。不把 fallback change report 写成完整 PI)
|
||||
**更新**: 2026-09-20
|
||||
**production_ready**: yes(门禁 B1–B4 已签;dev/main schema **58**、test **57**。P0 热修 done;见 [报告](../test-reports/2026-09-20-p0-hotfixes-test-report.md)。不把 fallback change report 写成完整 PI)
|
||||
|
||||
## 焦点
|
||||
|
||||
1. **2026-09-19 审计整改批 1–4 done**(合入 `844f757` / `08f4e0b` / `a2a49a6` / `d73bc79`)。dev 已 rebuild 到 schema 53。余项见 [long-term](./long-term/2026-09-19-audit-remainder.md)。未晋升 test/main。
|
||||
2. **Control Center 已移出本仓库**:项目进度由独立统一管理系统承担;本仓库恢复为智能体系统。见 [任务](./short-term/2026-09-19-remove-control-center.md)
|
||||
3. **rdev 模板深度 / document-author-only**:已合入 `origin/dev`;未晋升 test/main
|
||||
4. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 观察窗证据驱动;`FAV_DEGRADED_READ=false`;项目 143 只读;SWBOOT-10 保持 fail-closed stub;D7 待合规签字
|
||||
1. **2026-09-20 rdev 种子热修 in_progress**:dev 库 rdev 停在 `retired`;test 库因 `publishedBy=1` 外键失败未发布 rdev。见 [short-term](./short-term/2026-09-20-rdev-seed-hotfix.md)。
|
||||
2. **2026-09-20 模块解耦规范与审计 done(仅文档)**:耦合审计、开发规范、批次 A–G 计划已写;不改业务代码,不改 `production_ready`。见 [审计](../audit/2026-09-20-module-coupling-audit.md) · [规范](../system-design/2026-09-20-module-development-standards.md) · [批次](../remediation/2026-09-20-module-decoupling-batch-plan.md)。
|
||||
3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 观察窗证据驱动;`FAV_DEGRADED_READ=false`;项目 143 只读;SWBOOT-10 保持 fail-closed stub;D7 待合规签字;**P0 期间不改 `production_ready`**;模块解耦批次 A–G 未单独认领前保持 `planned`。
|
||||
|
||||
## 并行认领
|
||||
|
||||
| owner | task | branch | worktree | mutex | status |
|
||||
|-------|------|--------|----------|-------|--------|
|
||||
| Cursor | 2026-09-20-rdev-seed-hotfix | fix/workflow-seed-bootstrap-2026-09-20 | - | workflow-def | in_progress |
|
||||
| Cursor-Auto | 2026-09-20-module-decoupling-spec-audit | docs/module-decoupling-spec-2026-09-20 | - | module-decoupling-spec | done |
|
||||
| Cursor-Auto | 2026-09-20-p0-closeout | docs/p0-closeout-2026-09-20 | - | docs | done |
|
||||
| Cursor-Auto | 2026-09-20-p0-hotfixes(Wave 0 文档) | docs/p0-triage-2026-09-20 | - | docs | done |
|
||||
| Cursor-Auto | 2026-09-20-p0-capability-00058 | fix/capability-merge-00058-2026-09-20 | - | infra+chat | done |
|
||||
| Cursor-Auto | 2026-09-20-p0-idor | fix/authz-idor-hotfixes-2026-09-20 | - | authz | done |
|
||||
| Cursor-Auto | 2026-09-20-p0-runtime-stability | fix/runtime-panic-races-2026-09-20 | - | taskrun+chat+web | done |
|
||||
| Cursor-Auto | 2026-09-20-p0-credentials | fix/credential-hardening-2026-09-20 | - | ops+infra | done |
|
||||
| Cursor-Auto | 2026-09-20-proposed-authoritative-reports | feature/capability-enablement-impact-plan | - | docgov | done |
|
||||
| Cursor-Auto | 2026-09-20-pi-narrative-clipped-diff | feature/capability-enablement-impact-plan | - | docgov | done |
|
||||
| Cursor-Auto | 2026-09-20-pi-reasoning-profile | feature/capability-enablement-impact-plan | - | pi-agent | done |
|
||||
| Cursor-Auto | 2026-09-20-semantic-summary-persistence | feature/capability-enablement-impact-plan | - | chat+lineage-version | done |
|
||||
| Cursor-Auto | 2026-09-20-feature-readiness-and-lineage-authz | feature/capability-enablement-impact-plan | - | sysadmin+lineage | done |
|
||||
| Codex | 2026-09-20-capability-enablement-impact-plan | feature/capability-enablement-impact-plan | - | capability-impact-research | done |
|
||||
| Cursor-Auto | 2026-09-20-post-activation-duty-reassign-member-chat | fix/post-activation-duty-reassign-member-chat | - | projectworkflow+authz+web | done |
|
||||
| Cursor-Auto | 2026-09-20-test-env-triage-fixes | fix/test-env-triage-2026-09-20 | - | projectworkflow+chat+assets | done |
|
||||
| Cursor-Auto | 2026-09-20-test-env-beta6-verification | docs/test-env-beta6-verification | - | infra+docs | done |
|
||||
| Cursor-Auto | 2026-09-20-bug-hunt-permissions-uploads | fix/bug-hunt-2026-09-20-permissions-and-uploads | - | authz+web+projectworkflow | done |
|
||||
| Cursor | audit-b1-data-consistency | fix/audit-b1-data-consistency | - | docgov+workflow+chat | done |
|
||||
| Cursor | audit-b2-authz-hardening | fix/audit-b2-authz-hardening | - | authz | done |
|
||||
| Cursor | audit-b3-sse-events | fix/audit-b3-sse-events | - | chat+events | done |
|
||||
| Cursor | audit-b4-frontend | fix/audit-b4-frontend | - | web | done |
|
||||
| Cursor-Auto | 2026-09-19-audit-remainder-closeout | fix/audit-remainder-closeout | - | audit-remainder | done |
|
||||
| Antigravity | 2026-09-20-dev-deep-test-and-promotion | feature/dev-deep-test-and-promotion | - | integration | in_progress |
|
||||
| Antigravity | 2026-09-20-dev-deep-test-and-promotion | feature/dev-deep-test-and-promotion | - | integration | done |
|
||||
| Cursor-Auto | 2026-09-19-remove-control-center | fix/remove-control-center | - | controlcenter | done |
|
||||
| Cursor-Auto | 2026-09-17-control-center-server | feature/control-center-server | - | controlcenter | cancelled |
|
||||
| Kimi | 2026-09-18-user-manual | feature/user-manual | .worktrees/feature-user-manual | docs | done |
|
||||
@@ -150,7 +167,7 @@
|
||||
|
||||
| holder | phase | since | scope | queue |
|
||||
|--------|-------|-------|-------|-------|
|
||||
| Antigravity | merging | 2026-09-20 | 合并 fix/audit-remainder-closeout 至 dev,全量深度测试,晋升至 test 并重启 test 系统 | - |
|
||||
| Cursor | merging | 2026-09-20 | fix/workflow-seed-bootstrap-2026-09-20:rdev 种子 publishedBy 回落与 retired 自愈 | - |
|
||||
|
||||
**phase**: `idle` | `merging` | `smoke` | `e2e`
|
||||
|
||||
@@ -160,21 +177,24 @@
|
||||
|
||||
| 环境 | 端口 | schema | 状态 |
|
||||
|------|------|--------|------|
|
||||
| dev | 8080 | **53** | healthy(2026-09-19 `fix/audit-remainder-closeout` rebuild;goose `00053` `document_content_projections`;入口 `index-DOO0-Yh7.js`;`pi-agent`;events `:8088`) |
|
||||
| test | 8081 | **52** | healthy(Wave 2 rebuild 后 schema 与 dev/main 对齐;pi-agent `:18866`;events `:8089`) |
|
||||
| main | 8000 | **52** | healthy(`env=main` app+events 对齐;events 先 healthy 后启 app;consumer modes 全 off;Wave 1 已验证) |
|
||||
| dev | 8080 | **58** | healthy(`chat_summaries` 已落地;`pi-agent`;events `:8088`) |
|
||||
| test | 8081 | **57** | healthy(待下次晋升补 00058;events `:8089`) |
|
||||
| main | 8000 | **58** | healthy(P0 Wave3 rebuild 已追平 schema;分支树对齐仍记 backlog;口令已轮换;events `:8090`) |
|
||||
|
||||
## SSOT
|
||||
|
||||
| 类型 | 路径 |
|
||||
|------|------|
|
||||
| 2026-09-20 模块解耦 | [审计](../audit/2026-09-20-module-coupling-audit.md) · [规范](../system-design/2026-09-20-module-development-standards.md) · [批次 A–G](../remediation/2026-09-20-module-decoupling-batch-plan.md) · [short-term](./short-term/2026-09-20-module-decoupling-spec-audit.md) |
|
||||
| 文档总地图 | [../README.md](../README.md) |
|
||||
| 模块完成度 | [FEATURE-MATRIX](../status/FEATURE-MATRIX.md)(Wave 0 已校准契约与冻结边界) |
|
||||
| 发布缺口 | [gap-matrix](../remediation/gap-matrix.md)(`production_ready=yes`;Wave 0 IAM 只读未发现旁路) |
|
||||
| 2026-09-20 系统体检 | [audit](../audit/2026-09-20-system-triage-audit.md) · [P0 整改](../remediation/2026-09-20-p0-remediation-plan.md) · [short-term](./short-term/2026-09-20-p0-hotfixes.md) |
|
||||
| 连续性审计/计划 | [audit](../audit/2026-09-16-feature-matrix-production-readiness-audit.md) · [remediation](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) · [Wave 0 任务](./short-term/2026-09-16-feature-matrix-wave0-calibration.md) |
|
||||
| 测试报告 | [test-reports/](../test-reports/) |
|
||||
| dev→test 晋升前复核 | [research](./research/2026-09-19-pre-test-promotion-review.md)(2026-09-19 只读;静态门禁过,容器未 rebuild,暂不合并) |
|
||||
| D7 盘点(W7) | [audit](../audit/2026-09-17-d7-data-inventory.md) · [报告](../test-reports/2026-09-17-w7-d7-inventory-test-report.md) · ADR 仍 `pending-compliance-signoff` |
|
||||
| 功能启用与文档影响分析 | [调研](./research/2026-09-20-capability-enablement-impact-research.md) · [整改方案](../remediation/2026-09-20-capability-enablement-impact-plan.md) · [方案审阅](./research/2026-09-20-capability-enablement-impact-plan-review.md)(2026-09-20;未启用开关、未改业务代码) |
|
||||
| Wave 7 编排确认 | [决策记录](./short-term/2026-09-18-wave7-roadmap-orchestration.md) |
|
||||
| Agent 手册 | [AGENTS.md](../../AGENTS.md) |
|
||||
| 意图双标签 busy 交接 | [./handoffs/2026-09-15-conversation-intent-dual-tab.md](./handoffs/2026-09-15-conversation-intent-dual-tab.md) |
|
||||
|
||||
@@ -83,3 +83,37 @@ updated: 2026-09-19
|
||||
|
||||
- 审计:[../../audit/2026-09-19-system-deep-audit.md](../../audit/2026-09-19-system-deep-audit.md)
|
||||
- 批 1–3 报告:`.doc/test-reports/2026-09-19-audit-b*.md`
|
||||
|
||||
## 2026-09-20 系统体检增补(非 P0,不挡本轮热修)
|
||||
|
||||
> 来源:[../../audit/2026-09-20-system-triage-audit.md](../../audit/2026-09-20-system-triage-audit.md)。P0 项走 [../../remediation/2026-09-20-p0-remediation-plan.md](../../remediation/2026-09-20-p0-remediation-plan.md),不写入本表为「已关闭」。
|
||||
|
||||
| ID | 项 | 位置 | 说明 |
|
||||
|----|----|------|------|
|
||||
| T20-B1 | 登录限流信任 XFF 首跳 | `login_rate_limit.go` | 仅在可信代理后启用;否则用 RemoteAddr |
|
||||
| T20-B2 | events `cancelFns` 只增不减 | `events/worker.go` | claim 完成后从切片移除 |
|
||||
| T20-B3 | docrevision/docgov 全局锁内 DB I/O | `docrevision/*` `docgov/lease.go` | 锁外 hydrate / 按文档分锁 |
|
||||
| T20-B4 | 主库连接池无 statement_timeout | `bizdev/service.go` | 对齐 kb 池调优 |
|
||||
| T20-B5 | chat 消息与 turn 非原子 | `chat/session.go` | 同事务或补偿明确 |
|
||||
| T20-B6 | `idemLocks` map 永不清理 | `taskrun/manager.go` | TTL 或终态回收 |
|
||||
| T20-B7 | Shutdown 5s vs 长任务 | `cmd/server/main.go` | 拉长优雅退出或拒绝新任务 |
|
||||
| T20-B8 | `hasMessageScopeColumns` 无缓存 | `message_scope_io.go` | 启动缓存一次 |
|
||||
| T20-B9 | C1 记忆写入不失效缓存 | `chat_memory.go` | upsert 后 Invalidate |
|
||||
| T20-B10 | SSE 头先写再 Subscribe | `task_run_handlers.go` | 对齐 sse.go 顺序 |
|
||||
| T20-B11 | GET chat/stream 消息走 query | `sse.go` | 改 POST body |
|
||||
| T20-F1 | `useChatWindow` 切会话竞态 | `useChatWindow.ts` | loadOlder 等加 generation/abort |
|
||||
| T20-F2 | PLAN_CONFIRM 无 try/catch | `useCardActions.ts` | 失败复位 executing |
|
||||
| T20-F3 | turn Map 只增不减 | `useTurnRuntime.ts` | removeTurn 接线 |
|
||||
| T20-F4 | 重置密码死功能 + 硬编码文案 | `UsersSection.tsx` | 接真实 API 或隐藏按钮 |
|
||||
| T20-F5 | ErrorBoundary 仅顶层 | `main.tsx` | 栏级边界 |
|
||||
| T20-F6 | SSE 帧不兼容 `\r\n` | `chatStream.ts` | 规范 CRLF |
|
||||
| T20-F7 | token 存 localStorage + 无全局 401 | `auth.ts` | HttpOnly cookie 专项 |
|
||||
| T20-F8 | blob URL / 轮询叠加 / 统计迟到 | 多处 | 加固批 |
|
||||
| T20-I1 | 容器 root、无 mem/cpu 限制 | compose / Dockerfile | 非 root + resources |
|
||||
| T20-I2 | 健康检查路径三环境不一致 | compose | 统一 `/ready` |
|
||||
| T20-I3 | main events 挂 shared-net | `docker-compose.main.yml` | 对齐 dev/test |
|
||||
| T20-I4 | init 策略三套分叉 | compose volumes | 统一 extensions_init |
|
||||
| T20-I5 | Dockerfile Go 1.23 基镜像 | `deploy/app/Dockerfile` | 钉 1.27.1 |
|
||||
| T20-I6 | backup 无定时调度 | ops | systemd/cron;RPO 60m |
|
||||
| T20-I7 | **main 分支对齐晋升专项** | git main vs schema 52 | 独立授权;含 00057 改名预演 |
|
||||
| T20-I8 | 默认 short 测依赖外网 docker 镜像 | `pi_runner_image_test.go` | Short 跳过或本地 fixture |
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: "功能启用与文档影响整改方案审阅记录"
|
||||
created: 2026-09-20
|
||||
status: done
|
||||
confidence: high
|
||||
---
|
||||
|
||||
# 功能启用与文档影响整改方案审阅记录
|
||||
|
||||
## 审阅范围
|
||||
|
||||
- 文档:[2026-09-20-capability-enablement-impact-plan.md](../../remediation/2026-09-20-capability-enablement-impact-plan.md)
|
||||
- 类型:实施整改方案
|
||||
- 模式:非交互审阅;在既定目标内直接修正方案和验收条款
|
||||
- 视角:coherence、feasibility、security、scope guardian、product、design、adversarial
|
||||
- Compound Pack:无
|
||||
|
||||
## 已落地修正
|
||||
|
||||
1. 候选必须生成持久 `proposed` 报告;候选和正式提交事件分流,并补失效生命周期和 successor report。
|
||||
2. 人工关系确认/拒绝进入不可变决定账本;可重建投影不再承担唯一治理事实。
|
||||
3. 规范 report 与当前主体的 ReportView 分层,按 report revision、可见集 digest 和 narrative protocol 隔离及失效。
|
||||
4. `no_known_dependencies` 增加项目覆盖 epoch 和可见文档集合屏障。
|
||||
5. PI 消费者共用 R13 输入信封;纯推理 no-tool 必须由 Runner 强制。
|
||||
6. 多意图复用已有 intent plan 步骤、claim、receipt 和事件内核,仅补生产 dispatcher 和真实 owner。
|
||||
7. 实施顺序改为共享基座 + 多意图/摘要/影响追踪三条独立轨道。
|
||||
8. 显式无类型 ID 只形成候选;补无键、重复键、改名和历史映射身份契约。
|
||||
9. 数据模型明确为五张表;迁移门覆盖空库、schema 52 和 schema 53。
|
||||
10. 管理台补先读后改、预览、生效和回退流程;项目追踪页补信息架构。
|
||||
11. 建议动作和异步分析补完整状态、恢复路径和跨入口一致性。
|
||||
12. 增加键盘、焦点、动态播报、关系图等价列表和窄屏契约。
|
||||
13. 多意图增加采用率、确认放弃率和主动拆单率止损门。
|
||||
14. 索引报告状态与 adapter readiness 分字段,消除 `pending/degraded` 歧义。
|
||||
|
||||
## 待用户审核决策
|
||||
|
||||
### 1. 关系候选治理职责
|
||||
|
||||
方案推荐项目本地 `trace_reviewer` 动作能力,绑定既有编制/审核职责,由项目创建者在项目成员内指派;跨文档候选由两端各一名符合条件者确认,全局管理员不自动取得项目或文档权限。未批准前相关端点保持关闭。
|
||||
|
||||
### 2. 派生追踪数据留存
|
||||
|
||||
T2 开始前,需要确定条目修订、模型候选、确认/拒绝决定的留存类别,以及源文档删除或依法清除时如何传播。D7 未签前不执行物理删除,也不允许用“不可变历史”绕过后续合规决定。
|
||||
|
||||
## 审阅结论
|
||||
|
||||
方案已具备实施拆分、数据模型、授权边界、状态机、灰度、回退和验收合同。上述两项治理决策不会阻塞 Foundation 0、lineage API 鉴权、摘要持久化和 T1 的非 PI 工作;它们会阻塞关系候选确认端点和 T2/T3 正式放量。
|
||||
@@ -0,0 +1,165 @@
|
||||
---
|
||||
title: "功能启用现状与项目文档修改影响分析调研"
|
||||
created: 2026-09-20
|
||||
status: done
|
||||
confidence: high_for_source_and_runtime_configuration
|
||||
---
|
||||
|
||||
# 功能启用现状与项目文档修改影响分析调研
|
||||
|
||||
## 1. 结论
|
||||
|
||||
用户观察基本成立,但“已实现未启用”包含三种不同情况:已有可运行能力被关闭、只有组件或测试链路而未接入生产入口、只有设置或适配器占位。不能统一通过打开开关解决。
|
||||
|
||||
建议先补真实执行链路、摘要持久化和工具权限约束,再分阶段启用。文档影响分析应建立**项目级、版本化的需求与关联索引**,工作流作为其中的归属和筛选维度。复用现有文档账本、变更报告和可靠事件,以增量抽取和关联查询代替每次全项目全文处理。
|
||||
|
||||
本轮交付调研与[整改方案](../../remediation/2026-09-20-capability-enablement-impact-plan.md)。未修改业务代码、未启用开关、未重启容器、未操作真实会话。下文的源码风险是静态发现,不冒充已复现的事故;历史测试不冒充本轮验收。
|
||||
|
||||
## 2. 调研范围与证据等级
|
||||
|
||||
- 基线:本地 `dev@8fdcd98`;开始时工作区干净,`git pull --ff-only` 返回 Already up to date。调研分支 `feature/capability-enablement-impact-plan`。
|
||||
- 核查:`internal/intent`、`internal/app/intentflow`、`chat`、`ctxmgr`、`docrevision`、`projectworkflow`、`projectcontext`、`sysadmin`、PI Runner、相关前端、三环境 Compose、Goose 迁移。
|
||||
- 实时只读证据:三环境 app 容器白名单环境变量、image ID、`/health`、`/ready`;各环境 PostgreSQL `BEGIN READ ONLY` 元数据和聚合计数。未输出密码、业务正文或用户数据。
|
||||
- 历史证据:W2/W3/W4 测试报告、Wave5 封存决策、FEATURE-MATRIX。它们说明当时测了什么,不能证明当前聊天入口已打通。
|
||||
- 外部研究:NASA 需求追踪方法、PostgreSQL 16 递归查询文档,仅用于设计依据,不代表本项目满足任何外部合规认证。
|
||||
- 本轮没有运行 Go/前端测试或真实 PI/浏览器验收;没有证明运行镜像与源码逐字一致。运行开关是容器实际配置,接线结论基于当前检出源码。
|
||||
|
||||
## 3. 运行环境核查
|
||||
|
||||
2026-09-20 本轮读取结果:
|
||||
|
||||
| 项 | dev | test | main |
|
||||
|---|---|---|---|
|
||||
| health / ready | ok / ok | ok / ok | ok / ok |
|
||||
| schema | 53 | 53 | 52 |
|
||||
| AGENT_BACKEND | pi-agent | pi-agent | pi-agent |
|
||||
| MULTI_INTENT_ENABLED | true | true | true |
|
||||
| MULTI_INTENT_PLAN_TIER | legacy | legacy | legacy |
|
||||
| U9 / U10 / U11 / U12 | 全 false | 全 false | 全 false |
|
||||
| INTENT_V2_SHADOW / DECISION / TIER | false / false / none | 同左 | 同左 |
|
||||
| SEMANTIC_SUMMARY_SHADOW | false | false | false |
|
||||
| SEMANTIC_SUMMARY_REPLACE | 未注入;源码默认 false | 同左 | 同左 |
|
||||
| PI_CHANGE_REPORT_NARRATIVE | false | false | false |
|
||||
| FAV_PUBLISHER_ENABLED / DEGRADED_READ | false / false | false / false | false / false |
|
||||
| document_lineage 行数 | 10 | 0 | 10 |
|
||||
| document_change_reports 行数 | 487 | 0 | 0 |
|
||||
| intent_plans 行数 | 2 | 0 | 0 |
|
||||
| public.chat_summaries | 不存在 | 不存在 | 不存在 |
|
||||
| public.chat_daily_digests | 存在 | 存在 | 存在 |
|
||||
|
||||
行数包含既有测试/种子可能性,不能据此推断活跃用户、覆盖率或业务采用率。
|
||||
|
||||
本轮 app image ID:dev `sha256:de2c8802eb544cddef157d23d8731cd66b04b85bc6b120a070e08b9b234428df`;test `sha256:f7ad7d2427bbca4d0f6fb3bc9128aa86de546e7d7e3f4f7ebedbbe072776d66d`;main `sha256:0ffe0550461c2b75c783292994d75e71083f7c20c7e4a9a52ad9e5959580c2eb`。这是本机镜像标识,不是远端 registry 发布凭据。
|
||||
|
||||
数据库核查先尝试 count(chat_summaries) 得到 relation does not exist;随后以 `to_regclass('public.chat_summaries')` 在三库重新确认。`internal/bizdev/service.go:115` 用业务 pool 构建 ContextManager;仓库 SQL 搜索也未找到该表的建表迁移。`/ready` 正常不能证明这项摘要持久化可用。
|
||||
|
||||
## 4. 功能分类与启用判断
|
||||
|
||||
| 能力 | 当前实际完成边界 | 判断与建议 |
|
||||
|---|---|---|
|
||||
| 基础多意图识别 | `intent/flags.go:35` 默认开;旧协调器执行有限只读组合 | 已启用,不应标为“全部关闭” |
|
||||
| 新多意图持久计划 | 表、策略、卡片、决定接口存在;生产查询 owner 是 Fake,确认后未发现 worker 调度 | 必须先整改,不能直接升 auto_read/confirm |
|
||||
| U9 LLM 分段 | PI proposer 组件已注入;生产未调用 ActiveSegmentProposer | 需接真实聊天链路,不是单纯 flag 问题 |
|
||||
| U10 变更 / U11 治理 / U12 运行控制 | flag 开后注册 DryRunAdapter | 真实动作仍需实现;full 不是全功能开关 |
|
||||
| 意图 V2 决策 | 有独立灰度 flags,运行环境均 off | 与多意图计划分开验收,避免同时切两套路由无法归因 |
|
||||
| 语义摘要 shadow | 有 PI 实现,成功后仍服务确定性摘要 | 可作为第一阶段观测能力,但先补工具限制、持久化和异步隔离 |
|
||||
| 语义摘要 REPLACE | 明确封存未接线;true 也不替换 | 新实施项;需完整滚动、授权、质量、失效和回退设计 |
|
||||
| PI 变更报告叙事 | 有开关/Fetcher/摘要合并;输入仅统计数 | 接线存在但表达能力不足,先补具体差异与证据 |
|
||||
| 文档修改影响 | 账本、报告、面板、lineage 已有 | 依赖覆盖窄;应扩展项目追踪索引 |
|
||||
| 系统设置六项 | 可写白名单,但无业务消费方 | 管理台须显示“尚未生效”,逐项接线后开放 |
|
||||
| 编制人兼任 | 有独立策略消费方 | 不随本次智能功能一并全局开启;保留项目逐文档配置和冻结职责 |
|
||||
| FAV | 当前仅有限 shadow/骨架,生产消费者未放量 | 不纳入首批;维持独立观察窗和关闭降级读 |
|
||||
| 软件项目自举受控执行 | 部分数据库表/allowlist/执行器仍 deferred | 不因“已有表”认定可用,独立完善 |
|
||||
| D7 删除/留存治理 | 历史资料仍待合规决策 | 不与智能功能启用混合实施 |
|
||||
|
||||
### 4.1 多意图的具体缺口
|
||||
|
||||
1. `internal/app/app.go:247-249` 将 `QueryGuard{Inner: NewFakeActionOwner()}` 注入生产。`intentflow/owner.go` 的 Fake 返回 receipt,不查询真实业务。
|
||||
2. `internal/server/intent_plan_handlers.go:68-82` 决定接口调用 DecidePlan 后返回。非测试 AdvanceEligible 调用只发现 `intentflow/turn.go:98` 自动只读路径;缺少确认后的可靠执行调度。
|
||||
3. `internal/chat/session.go:397-406` 对新计划只清除旧 IntentPlan,忽略 planErr;后面仍走 Coordinator.Process。存在双路径处理及确认前副作用风险,须用真实聊天负例验证;本轮未制造真实副作用证明该风险。
|
||||
4. `internal/app/plan_owner.go:97-122` 的 live starter 将 task.run 固定到 intake;`turn.go:55-61` 只持久化 key/digest/summary,没有完整类型化参数和目标版本,不能可靠表达“修改 A 后生成 B”。
|
||||
5. U9 注入位在 `app.go:141`,生产 HandleTurn 仍直接使用规则 Recognize;`ActiveSegmentProposer` 调用只见测试。
|
||||
6. `intentflow/expansion.go:301-313` 为 U10–U12 注册 dry-run;返回 `dryrun:`/`validated_only:`。新领域写不是“开后就可执行”。
|
||||
7. 三个 Compose 已声明 PLAN_TIER。旧文档中“没有传进容器”的结论已过时,本轮不沿用。
|
||||
|
||||
### 4.2 语义摘要不仅缺一个开关
|
||||
|
||||
- `ctxmgr/summary_flags.go:10-20`、`semantic_summary.go` 明确 REPLACE 未接线;现有测试故意令 Replace=true 并验证叙事不变。
|
||||
- `ctxmgr/summarizer.go:64-115` 读写 chat_summaries;数据库缺表时写错误被忽略、返回成功并存内存。因此重启持久化是前置整改,不能用内存测试当通过。
|
||||
- Source、Shadow、FreshnessNote 不在现有保存 SQL 中,即使补表也需设计完整 provenance 持久化。
|
||||
- `MinimizeAuthorizedMessages` 仅取最后 40 条、每条约 240 字符;shadow 输入没有旧摘要。直接把它赋给 Narrative 会丢更早的上下文;不能宣称覆盖全部 CoveredCount。
|
||||
- `chat/session.go:177-212` 同步计算滚动摘要,并将当前 early 全量与旧摘要再合并;缺稳定消息水位去重契约,有覆盖计数/重复压缩风险。
|
||||
- `app/chatflow/chatlog.go:324` 存在授权包装,但 Session 直接调用 ContextManager。旧摘要复用仅按 session_id;撤权、阶段可见范围变化后是否仍安全,必须补真实链路复核与可见集绑定。
|
||||
- shadow 与服务请求同步执行,PI 默认 timeout 3 分钟(`app/semantic_summarizer.go:18`),Session 外层约 30 秒。开启可能增加等待;应移至可观察的后台任务并立即提供确定性结果。
|
||||
- `PiSemanticSummarizer` 只检查输出非空,未验证返回 digest、证据引用和长度等完整质量契约。
|
||||
|
||||
### 4.3 “no-tool”目前不是运行时强约束
|
||||
|
||||
`app/semantic_summarizer.go:64-69` 与 `app/pi_narrative.go:60-67` 通过 Instructions 声明 zero tool,但 `deploy/pi-agent/runner.mjs:151-154` 固定使用 `read,write,edit,tavily_search,web_search` 和 approve。本轮没有验证攻击利用;源码足以证明提示词声明不等价于禁用工具。
|
||||
|
||||
建议增加专用纯推理请求 profile:材料直接作为输入,结构化结果通过协议返回,由服务端保存;Runner 不加载搜索扩展、不提供文件/网络工具。若底层 CLI 不支持该 profile,能力应显示 unavailable 并回退,而不是继续标记 no-tool。摘要、叙事和 U9 一并覆盖。
|
||||
|
||||
### 4.4 管理台的显示不能当作功能已生效
|
||||
|
||||
`internal/sysadmin/features.go` 返回 value/source/requiresRestart,没有 adapter readiness 或 rollout 覆盖信息。`settings.go:68-87` 明示六项无消费方:维护公告、只读模式、默认会话职责、任务默认自动修复、KB 默认返回数、阶段推进提醒。
|
||||
|
||||
因此需要拆分“配置值”“实际生效值”“实现成熟度”“失败/阻断原因”。尤其只读模式必须服务端阻断写操作,不能只让前端按钮变灰;默认会话职责不能升级授权。维护公告等低风险项可单独接线,不能把六项保存成功当作六项功能完成。
|
||||
|
||||
## 5. 修改影响分析已有什么、缺什么
|
||||
|
||||
| 现有资产 | 证据 | 复用方式与限制 |
|
||||
|---|---|---|
|
||||
| 快照、版本、块映射、事件、报告 | `docrevision/types.go:96-168`;迁移 00028 | 唯一文档事实来源;索引不另存可独立修改的正文 |
|
||||
| 变更报告面板 | `web/src/components/doc/ChangeReportPanel.tsx:94-165` | 已有摘要/影响/推荐动作;增加覆盖状态、文档名、证据定位、聊天卡复用 |
|
||||
| 下游 lineage | `bizdev/service.go:1169-1193` | 主要为 test_manager 引用 system_reqs;下游 version 写死 1,不能扩面沿用 |
|
||||
| ImpactResolver | `bizdev/service.go:132-156` | 一跳查下游;查询错误和无关联都返回 nil,必须区分未知与无影响 |
|
||||
| 风险规则 | `docrevision/impact.go:18`、`risk.go:49-54` | 任意 lineage 均变 stale_candidate 并升 critical;扩大关系前先分清存在依赖和实际受影响 |
|
||||
| 可靠事件 | `app/docflow/commands.go:285-312` | 复用提交后事件、投影和重放;不新增第二套消息基础设施 |
|
||||
| 需求/用例 JSON | `squad/quality_gate_v2.go:34-101` | 已校验 requirements.json/test_cases.json;是工作区产物,不是需求实体数据库 |
|
||||
| 上下文快照 | `projectcontext/service.go:167-184,216-242` | 来源用 DocKey、版本用 Stage,且 approved 文档全选;需改为真实快照/版本/片段 |
|
||||
| 材料装配 | `projectcontext/service.go:126-145` | 截到 12 项、正文约 4000 字节;减少输入但不能证明召回完整 |
|
||||
| 块业务键 | `docrevision/blockmap.go:13` | 仅覆盖 REQ-*;需要兼容 UR/RS 等并维护稳定身份 |
|
||||
|
||||
另发现 lineage GET 的权限缺口:`server/project_handlers.go:280-322` 只校验 URL 项目,然后接受任意 query doc_id 查询;应核验文档属于项目、逐文档可见性、关联端点可见性。当前为静态确定的缺少检查,未对真实项目做越权请求。
|
||||
|
||||
PI 叙事并不能补这些关系:`app/pi_narrative.go:40-48` 只传 SHA、风险与 hunk/impact 数量,没有具体 Hunks/Impacts。已有 `BuildNarrativePromptInput` 可以提供差异,但未发现生产调用。仅开启 flag 更可能得到“修改了若干处、存在若干影响”这种泛化说明。
|
||||
|
||||
还需统一报告可信边界:新 narrative 路径以服务端 impacts 为准;旧 `ValidateChangeReportJSON` 仍通过 mergeImpacts 合并模型提供的关联。新增设计应将模型推测单独列为候选,经文档定位、权限与证据校验后才进入确定关联。
|
||||
|
||||
## 6. 是否建立需求清单等表
|
||||
|
||||
**需要建立;建议项目级统一条目索引,而不是每个工作流各建一套孤立需求表。** 同一需求可以贯穿需求、设计、风险、验证多个工作流;逐工作流复制会产生重复编号、版本不一致和跨工作流断链。
|
||||
|
||||
建议首期三类核心表:稳定条目身份、不可变条目修订、版本化关系;再保存索引构建状态。需求清单、风险清单、接口清单、测试覆盖表是同一索引的不同视图。已有 document_lineage 保留“实际消费了哪个文档版本”的事实,条目关系解释“为什么影响哪一处”。
|
||||
|
||||
| 路线 | 优点 | 局限 | 建议 |
|
||||
|---|---|---|---|
|
||||
| 每次全文处理 | 无建模启动成本 | 输入随项目增长、重复成本高、结果不稳定 | 仅初始化/明确修复,不作常规路径 |
|
||||
| 仅摘要/向量检索 | 查找相似内容方便 | 相似不等于依赖,不能可靠证明未受影响 | 用于补充候选 |
|
||||
| 仅文档级 lineage | 可快速覆盖实际引用 | 无条目粒度,易误报全篇影响 | 第一阶段复用并修版本 |
|
||||
| PostgreSQL 条目+关系+片段 | 版本、事务、双向查询与审计可落在现有栈 | 需持续维护抽取/关系质量 | 推荐主路线 |
|
||||
| 独立图数据库/完整 GraphRAG | 可支持更复杂关系探索 | 新基础设施、一致性/授权/运维成本 | 当前无规模证据,不先引入 |
|
||||
|
||||
NASA 需求管理资料强调双向追踪及需求变更影响管理,可作为需求—设计—验证关联建模的参考。[NASA Requirements Management](https://www.nasa.gov/reference/6-2-requirements-management/)
|
||||
|
||||
PostgreSQL 16 支持递归 CTE 和循环检测,现有数据库可承担首期受限关系遍历。这支持“先用现有 PG”的设计选择,但不能替代本项目性能基准。[PostgreSQL 16 WITH Queries](https://www.postgresql.org/docs/16/queries-with.html)
|
||||
|
||||
## 7. 预期用户体验
|
||||
|
||||
示例仅说明设计,不是本轮真实项目结果:用户把某需求的响应时间从 2 秒改为 1 秒,提交成功后,助手返回:
|
||||
|
||||
> 已修改《系统需求》REQ-017 的响应时间:2 秒 → 1 秒。直接相关的《性能设计》§3.2 和测试用例 TC-017 需要复核;《验收方案》通过测试追踪关系可能受影响。建议先确认实现预算,再更新测试阈值,最后复核验收标准。当前索引覆盖已提交版本,另有一个关联尚待核实。
|
||||
|
||||
每条结论可点开证据、旧/新版本和相关片段。明确区分“确定影响”“可能影响”“尚未覆盖”。不因一句影响说明自动修改其他文档;用户选择建议后,仍走目标文档权限、租约、版本校验和审批。
|
||||
|
||||
消息、文档面板和项目清单共用一个 report_id。刷新、重开、重启后仍可查阅,并显示后续处理进度。候选尚未提交时只能说“拟修改的预估影响”,不能说已经修改完成。
|
||||
|
||||
## 8. 推荐推进顺序与研究局限
|
||||
|
||||
1. 修复阻断:真实多意图 owner/确认调度/路由隔离、摘要表和持久化、纯推理工具隔离、lineage 权限和错误状态。
|
||||
2. 快速形成用户价值:所有提交路径都产生基础影响报告,聊天主动展示;补完整差异输入后灰度启用 PI 叙事。
|
||||
3. 项目需求索引:先覆盖结构化需求和用例,再扩展文档章节、风险和接口;精确关系先行,模型候选后置。
|
||||
4. 多意图按 shadow → auto_read → confirm 扩面;U9/领域动作逐个接线、验收。
|
||||
5. 语义摘要按 shadow → 质量评估 → 项目级替换推进,保留硬事实和确定性回退。
|
||||
|
||||
尚未实测:运行镜像内上述源码接线、真实浏览器旗标开启后的端到端行为、PI工具调用实际执行情况、索引规模/性能、需求关系准确率。报告中的源码缺口已足以阻止盲目放量;验收方案负责关闭这些未验证项。详见[实施方案](../../remediation/2026-09-20-capability-enablement-impact-plan.md)。
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: "修复系统权限设置与项目协作多项缺陷"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: fix/bug-hunt-2026-09-20-permissions-and-uploads
|
||||
worktree: "-"
|
||||
mutex: authz+web+projectworkflow
|
||||
---
|
||||
|
||||
# 修复系统权限设置与项目协作多项缺陷
|
||||
|
||||
## 目标
|
||||
|
||||
修复两轮排查确认的 12 处后端/前端缺陷(CSP/PDF、系统设置 CAS、任务错误误分类、task-run 403、成员管理 RBAC、注册吞错、强制改密复发、项目重名、无项目可对话、右侧栏不记忆等)。
|
||||
|
||||
## 范围
|
||||
|
||||
- CSP `frame-src` + PDF blob 预览
|
||||
- 系统设置 `expected_revision` 全链路
|
||||
- `ProjectSettingsApiError` httpStatus/errorCode 别名
|
||||
- task-run 查看放宽为项目成员;前端 403/404 停轮询
|
||||
- `project:manage_members` 权限位(迁移 00055)
|
||||
- memStore 成员可见性
|
||||
- CreateUser 吞错 / 400·500 分类 / LooksInternal
|
||||
- 强制改密 session 嵌套字段 OR 复活
|
||||
- CreateProject `client_key` 幂等 + `(creator, name)` 唯一(迁移 00056)
|
||||
- 无项目禁止对话 + 发送按钮置灰
|
||||
- 右侧工具栏默认收起并持久化
|
||||
|
||||
## 非目标
|
||||
|
||||
- 全局项目名唯一(仅同创建人内唯一)
|
||||
- 放宽 `frame-ancestors` / `X-Frame-Options`
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 后端 CSP / authz / auth / projectworkflow / chat 入口
|
||||
2. [x] 前端 PDF / settings / 错误别名 / 轮询 / RBAC UI / 改密 / 建项幂等 / InputArea / AppShell
|
||||
3. [x] 迁移 00055 / 00056 + 单测
|
||||
4. [x] `go vet` / `go test -short` / `npm test` / `npm run build`
|
||||
5. [x] 占集成槽位合回 `dev`
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 代码与契约补齐(见 audit 笔记)
|
||||
`- [x] 短测与前端构建通过
|
||||
`- [x] 合入 `dev`
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: `.doc/audit/2026-09-20-bug-hunt-permissions-uploads.md`
|
||||
- Plan: `.cursor/plans/修复系统权限设置与项目协作多项缺陷_ff3242f7.plan.md`
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
分支:`fix/bug-hunt-2026-09-20-permissions-and-uploads`
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "能力就绪度与 lineage 鉴权"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: feature/capability-enablement-impact-plan
|
||||
worktree: "-"
|
||||
mutex: sysadmin+lineage
|
||||
---
|
||||
|
||||
# 能力就绪度与 lineage 鉴权
|
||||
|
||||
## 目标
|
||||
|
||||
管理台把配置值与实现成熟度、适配器就绪度分开;lineage 读取必须落在 URL 项目内,并按逐文档可见性裁剪,跨项目或不可见文档不泄漏标识。
|
||||
|
||||
## 范围
|
||||
|
||||
- Foundation 0:功能目录增加 `implementationState`、`adapterReadiness`、`configuredValue` / `effectiveValue`、`rolloutScope`。
|
||||
- lineage GET:`project_id` 约束、查询文档属于该项目、两端文档可见性过滤;空结果与“不可见”使用同一空列表,不区分存在性。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不打开 test/main 开关,不升 `full`,不接 `SEMANTIC_SUMMARY_REPLACE`。
|
||||
- 不实现 `trace_reviewer` 端点(待审核)。
|
||||
- 不建项目追踪五表,不决定 D7 留存与源文档删除传播。
|
||||
- 不占用集成槽,不重启共享容器。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 能力目录与管理台展示成熟度,配置值不能冒充可用。
|
||||
2. [x] lineage 查询按项目与文档可见性过滤,并补跨项目负例。
|
||||
3. [x] `go test` 覆盖上述契约。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] `SEMANTIC_SUMMARY_REPLACE=true` 时实现状态仍为 `placeholder`,适配器 `unavailable`。
|
||||
- [x] 用项目 A 的 URL 查询项目 B 的 `doc_id` 得到空列表,响应体不含 B 的上游文档 ID。
|
||||
- [x] 项目 B 自己的 URL 仍能读到已登记且两端都可解析的血缘。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- 整改方案: [2026-09-20-capability-enablement-impact-plan.md](../../remediation/2026-09-20-capability-enablement-impact-plan.md)
|
||||
- 调研: [2026-09-20-capability-enablement-impact-research.md](../research/2026-09-20-capability-enablement-impact-research.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
2026-09-20 本地 `go test`(未占集成槽、未重启容器):
|
||||
|
||||
- `TestFeatures_ConfiguredValueDoesNotImplyReadiness` PASS
|
||||
- `TestGetLineageForProjectDownstream_ExcludesOtherProject` PASS
|
||||
- `TestProjectLineage_ForeignDocDoesNotLeak` PASS
|
||||
- `TestProjectWorkflow_TestManagerAndLineageStale` PASS
|
||||
- `TestFilterLineageEdges_DropsForeignAndHiddenEndpoints` PASS
|
||||
|
||||
管理台表格改在 `web/src/components/admin/console/sections/FeaturesSection.tsx`。本波未重建 dev 容器,页面验收留到占槽冒烟。
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
title: "模块解耦规范与耦合审计"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: docs/module-decoupling-spec-2026-09-20
|
||||
worktree: "-"
|
||||
mutex: module-decoupling-spec
|
||||
---
|
||||
|
||||
# 模块解耦规范与耦合审计
|
||||
|
||||
## 目标
|
||||
|
||||
在不改业务代码、不推翻模块化单体 ADR 的前提下,交付三份可执行文档:当前耦合审计、模块开发规范(通信契约 / 输入输出接口 / 故障隔离)、分批整改计划。
|
||||
|
||||
## 范围
|
||||
|
||||
- 盘点 2026-09-14 / 2026-09-15 解耦基线之上的剩余耦合热点。
|
||||
- 把既有契约(窄端口、领域事件、wire DTO、表唯一写者)收成开发者入口规范。
|
||||
- 把整改拆成独立批次 A–G,各自带 mutex、分支示例、验收门与回滚点。
|
||||
- 同步 CURRENT 认领与 FEATURE-MATRIX 规范行。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不改 `internal/`、`web/`、`module-boundaries.yaml` 或迁移。
|
||||
- 不把单体内端口改成 RPC,不拆微服务。
|
||||
- 不修改 Cline 占用的 `partial-deferred-completion-plan.md`(只引用)。
|
||||
- 不占用 `architecture-docs` mutex。
|
||||
- 不把 planned 批次标成进行中或完成。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 登记 short-term 与 CURRENT 认领。
|
||||
2. [x] 写耦合审计。
|
||||
3. [x] 写模块开发规范。
|
||||
4. [x] 写分批整改计划。
|
||||
5. [x] 同步 FEATURE-MATRIX 与 CURRENT 焦点。
|
||||
6. [x] 分批 `docs(...)` 提交,占集成槽位后 `--no-ff` 合回 `dev`,文档-only 冒烟。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 审计覆盖 7 个热点,并给出文件路径证据与严重度。
|
||||
- [x] 规范明确三种通信契约、端口 checklist、故障隔离红线、新增模块/表/事件流程。
|
||||
- [x] 整改计划 A–G 各自可独立认领,互不把对方写成已完成。
|
||||
- [x] 文档落入 taxonomy,不在 `.doc/` 根新建文件。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- 架构: [../../system-design/2026-09-14-module-decoupling-architecture.md](../../system-design/2026-09-14-module-decoupling-architecture.md)
|
||||
- 本轮审计: [../../audit/2026-09-20-module-coupling-audit.md](../../audit/2026-09-20-module-coupling-audit.md)
|
||||
- 本轮规范: [../../system-design/2026-09-20-module-development-standards.md](../../system-design/2026-09-20-module-development-standards.md)
|
||||
- 本轮批次: [../../remediation/2026-09-20-module-decoupling-batch-plan.md](../../remediation/2026-09-20-module-decoupling-batch-plan.md)
|
||||
- ADR: [../../adr/2026-09-14-modular-monolith-decoupling.md](../../adr/2026-09-14-modular-monolith-decoupling.md)
|
||||
- Phase 2: [../../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md](../../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md)
|
||||
- 影响面守则: [../../remediation/2026-09-16-partial-deferred-completion-plan.md](../../remediation/2026-09-16-partial-deferred-completion-plan.md) §2
|
||||
- 边界清单: [../../system-design/module-boundaries.yaml](../../system-design/module-boundaries.yaml)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
只读盘点(2026-09-20):生产 Go 约 7.8 万行;`archtest` import/event 已 block 且 baseline import=0、event=0;剩余例外为 sql_write 5 + path 16。
|
||||
|
||||
合入 `dev`:`133ceb45`(`merge: docs/module-decoupling-spec-2026-09-20`)。冒烟:`go vet ./...` 通过。`go test -short ./...` 除 `TestPiAgentDockerBuildContext_RunnerModulesPresent` 与 `TestDockerBuildContext_TemplatesDocsReadable` 外均为 ok;这两例失败原因是拉取 `debian:bookworm-slim` 时镜像源 EOF,不是本批文档改动。槽位在记录该结果后释放。
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: "2026-09-20 P0 热修(迁移 / 越权 / 稳定性 / 凭证)"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: docs/p0-closeout-2026-09-20
|
||||
worktree: "-"
|
||||
mutex: docs
|
||||
---
|
||||
|
||||
# 2026-09-20 P0 热修
|
||||
|
||||
## 目标
|
||||
|
||||
关闭系统体检发现的 P0 critical:迁移断链、三项 IDOR、进程 panic/race、凭证泄漏与生产口令轮换。
|
||||
|
||||
## 范围
|
||||
|
||||
- Wave 0–4(见 [整改方案](../../remediation/2026-09-20-p0-remediation-plan.md))
|
||||
- 后续实现分支:`fix/capability-merge-00058-2026-09-20`、`fix/authz-idor-hotfixes-2026-09-20`、`fix/runtime-panic-races-2026-09-20`、`fix/credential-hardening-2026-09-20`、`docs/p0-closeout-2026-09-20`
|
||||
|
||||
## 非目标
|
||||
|
||||
- main 分支对齐晋升
|
||||
- FAV / SWBOOT-10 / D7 / MULTI_INTENT full
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] Wave 0:审计与整改文档、CURRENT 认领、long-term 增补
|
||||
2. [x] Wave 1:capability 合入 + 00058 + rebuild
|
||||
3. [x] Wave 2:三项越权
|
||||
4. [x] Wave 2b:panic/race/recover/XSS
|
||||
5. [x] Wave 3:凭证 + 口令轮换
|
||||
6. [x] Wave 4:测试报告与收口
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 见 [测试报告](../../test-reports/2026-09-20-p0-hotfixes-test-report.md)
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: [../../audit/2026-09-20-system-triage-audit.md](../../audit/2026-09-20-system-triage-audit.md)
|
||||
- Remediation: [../../remediation/2026-09-20-p0-remediation-plan.md](../../remediation/2026-09-20-p0-remediation-plan.md)
|
||||
- Test report: [../../test-reports/2026-09-20-p0-hotfixes-test-report.md](../../test-reports/2026-09-20-p0-hotfixes-test-report.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
(各波次合入 commit 与健康输出)
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: "PI 变更叙事只读事实带上截断差异"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: feature/capability-enablement-impact-plan
|
||||
worktree: "-"
|
||||
mutex: docgov
|
||||
---
|
||||
|
||||
# PI 变更叙事只读事实带上截断差异
|
||||
|
||||
## 目标
|
||||
|
||||
`PI_CHANGE_REPORT_NARRATIVE` 仍默认关闭时,叙事请求的 `facts.json` 已包含有长度上限的差异片段和影响说明,而不是只有 SHA、风险和计数。
|
||||
|
||||
## 范围
|
||||
|
||||
- `NarrativeModelInput`:最多 8 条 hunk、8 条影响,前后文/原因各 240 个字符,超出记 `truncated` 与 `hunks_omitted` / `impacts_omitted`,同时保留完整计数。
|
||||
- `PiChangeReportNarrator.Fetch` 改写这份最小化输入。
|
||||
- 成熟度说明与 FEATURE-MATRIX 改为「输入已含截断差异,开关与运行中 runner 仍未就绪」。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不打开 `PI_CHANGE_REPORT_NARRATIVE`。
|
||||
- 不把整篇 Markdown 或未截断正文放进模型输入。
|
||||
- 不改变 `NarrativeInputDigest`(摘要仍只绑 hunk id/kind/section 与影响 doc/type/reason)。
|
||||
- 不重启容器,不占集成槽位,不实现 trace_reviewer 或 T2 物理删除。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 增加截断后的模型输入,并让 Fetch 使用它
|
||||
2. [x] 单测覆盖正文出现、超长截断、digest 原样保留
|
||||
3. [x] 同步成熟度说明、FEATURE-MATRIX、CURRENT
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] `go test` 覆盖 `TestNarrativeModelInput_IncludesClippedChangeText` 与 `TestPiChangeReportNarrator_NoTools`
|
||||
- [x] 开关默认仍关闭;成熟度仍是 shadow / degraded
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Checklist:
|
||||
- Handoff:
|
||||
- Test report: 本切片为契约单测,未做真实 PI 容器验收
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- `internal/docrevision/narrative.go` `NarrativeModelInput`
|
||||
- `internal/app/pi_narrative.go` Fetch
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: "PI 纯推理 profile"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: feature/capability-enablement-impact-plan
|
||||
worktree: "-"
|
||||
mutex: pi-agent
|
||||
---
|
||||
|
||||
# PI 纯推理 profile
|
||||
|
||||
## 目标
|
||||
|
||||
语义摘要、变更叙事和 U9 分段请求的实际 argv 不再包含读写或搜索工具。文档生成保持原工具集。
|
||||
|
||||
## 范围
|
||||
|
||||
- `tool_profile=reasoning` 使用 `--no-tools`,不加载 tavily 扩展。
|
||||
- 未知 profile 拒绝启动,不退回读写工具。
|
||||
- 三个只读消费者传 `reasoning`。空 profile 仍是 workspace。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不重启容器,因此正在运行的 runner 进程还是旧 argv。
|
||||
- 不打开 shadow、叙事或 U9 开关。
|
||||
- 不把具体 diff 补进叙事输入。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] runner 与本地 bridge 按 profile 组装 argv。
|
||||
2. [x] 三个消费者传 reasoning。
|
||||
3. [x] node 与 Go 测试覆盖 argv 和请求体。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] reasoning argv 不含 read、write、edit、search,且含 `--no-tools`。
|
||||
- [x] 默认 profile 仍带 workspace 工具名单。
|
||||
- [x] 未知 profile 抛出 `UNKNOWN_TOOL_PROFILE`。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- 整改方案: [2026-09-20-capability-enablement-impact-plan.md](../../remediation/2026-09-20-capability-enablement-impact-plan.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
2026-09-20 本地测试(未重启容器):
|
||||
|
||||
- `node --test deploy/pi-agent/tests/pi-args.test.mjs` 3 PASS
|
||||
- `TestRunnerPayload_ReasoningDoesNotBecomeWorkspace` PASS
|
||||
|
||||
dev compose 已挂载 `pi-args.mjs`,Dockerfile 已 COPY。正在运行的 runner 进程仍是旧 argv。
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
title: "激活后职责改派 + 成员可对话"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: fix/post-activation-duty-reassign-member-chat
|
||||
worktree: "-"
|
||||
mutex: projectworkflow+authz+web
|
||||
---
|
||||
|
||||
# 激活后职责改派 + 成员可对话
|
||||
|
||||
## 目标
|
||||
|
||||
工作流激活后可随时改派文档三职(小队任务运行中除外);项目成员无需文档职责即可阶段对话。
|
||||
|
||||
## 范围
|
||||
|
||||
- U1:放宽 `AllowedStageKeys`(对话/历史);`AllowedTaskKeys` 仍职责门禁
|
||||
- U2:`PATCH .../doc-tasks/{taskKey}/duties` 受控改派
|
||||
- U3:冻结态设置页可改派 UI
|
||||
- U4:单测 + test 环境验收报告
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不放开 `PUT /workflow-plan` 全量规划编辑
|
||||
- 不放行已结束实例的聊天
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] U1 成员阶段对话
|
||||
2. [x] U2 改派 API
|
||||
3. [x] U3 前端
|
||||
4. [x] U4 验收
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 无职责项目成员 live 下可 chat/stream
|
||||
- [x] 激活后可改派;squad running 时 409(单元)
|
||||
- [x] PUT workflow-plan 仍 PLAN_FROZEN
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Test report: [../../test-reports/2026-09-20-post-activation-duty-reassign-member-chat-test-report.md](../../test-reports/2026-09-20-post-activation-duty-reassign-member-chat-test-report.md)
|
||||
- Merge: `9d98f1ae`
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- test `:8081` rebuild 后陈威 `sess-p5-u35` 对话 PASS;intake author 改派至 35 PASS
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: "候选变更报告与正式提交报告分开"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: feature/capability-enablement-impact-plan
|
||||
worktree: "-"
|
||||
mutex: docgov
|
||||
---
|
||||
|
||||
# 候选变更报告与正式提交报告分开
|
||||
|
||||
## 目标
|
||||
|
||||
Agent 候选只持久化 `proposed` 预估报告,不发下游影响或正式提交事件。正式提交才生成 authoritative 后继报告,并让版本指向后继而不是预估。
|
||||
|
||||
## 范围
|
||||
|
||||
- 报告增加 `authority`、`lifecycle`、`successor_report_id`,并写入已有 `deterministic_facts`,避免在未占集成槽时改表。
|
||||
- 新的有效候选把上一份仍 active 的预估标为 superseded。
|
||||
- 拒绝标 rejected;提交时基线已变则标 expired。这两种以及 superseded、已提交的预估都不能再出建议。
|
||||
- 正式提交复制一份 authoritative 报告;下游影响通知使用这份报告。`document.agent_version_committed` 仍只由 docflow 的 EventSink 在提交命令里发出。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不把人工修订、恢复、导入改成先预估再提交。
|
||||
- 不打开 `PI_CHANGE_REPORT_NARRATIVE`,不实现 trace_reviewer,不做 T2 物理删除。
|
||||
- 不新增 `document.committed` 事件名,避免和现有投影消费者分叉。
|
||||
- 不重启容器,不占集成槽位。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 候选写入 proposed,提交写入 authoritative 后继
|
||||
2. [x] 单测覆盖替代、拒绝、版本不指向预估、候选阶段不发下游事件
|
||||
3. [x] 同步 FEATURE-MATRIX 与 CURRENT
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] `go test ./internal/docrevision/` 通过
|
||||
- [x] 预估报告在替代或拒绝后 `AllowsSuggestedActions` 为 false
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Checklist:
|
||||
- Handoff:
|
||||
- Test report: 本切片为账本单测,未做真实聊天或浏览器验收
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- `internal/docrevision/report_disposition.go`
|
||||
- `TestProposedReportStaysInactiveUntilCommit`
|
||||
- `TestRejectedProposedReportCannotSuggest`
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
title: "修复工作流种子:publishedBy 外键与 retired 不自愈"
|
||||
status: in_progress
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor
|
||||
branch: fix/workflow-seed-bootstrap-2026-09-20
|
||||
worktree: "-"
|
||||
mutex: workflow-def
|
||||
---
|
||||
|
||||
# 修复工作流种子:publishedBy 外键与 retired 不自愈
|
||||
|
||||
## 目标
|
||||
|
||||
dev 与 test 启动后,正式工作流目录包含「研发设计控制流程」(`rdev`),且数据库 `status=active`、已发布版本外键有效。
|
||||
|
||||
## 范围
|
||||
|
||||
- `BootstrapSeeds`:`publishedBy` 用户不存在时回落到库内最小 id;无用户则跳过并记日志
|
||||
- `UpsertPublishedSeed` / `RetireNonOfficialDefinitions`:白名单 key 幂等更新时把 `status` 恢复为 `active`
|
||||
- `bizdev` 启动 seed 失败改为 `slog.Warn`,不再静默丢弃
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不改 rdev manifest / 60 份模板内容
|
||||
- 不改 `production_ready`
|
||||
- 不启用 FAV / 语义摘要 REPLACE
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 从 dev 切 `fix/workflow-seed-bootstrap-2026-09-20` 并登记认领
|
||||
2. [ ] 修复 seed actor 回落与 retired 自愈
|
||||
3. [ ] `go vet` / `go test -short` / PG 集成
|
||||
4. [ ] 合入 dev 后 rebuild;晋升 test(`rc-v1.0.0-beta.7`)并 rebuild
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [ ] dev/test catalog 均含 rdev,DB `status=active`
|
||||
- [ ] test 库 `workflow_versions` 无 `created_by` 外键错误
|
||||
- [ ] `go vet` / `go test -short` 通过
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Checklist: -
|
||||
- Handoff: -
|
||||
- Test report: `.doc/test-reports/2026-09-20-rdev-seed-hotfix-test-report.md`
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- test PG `2026-09-20 09:49:51`:`workflow_versions_created_by_fkey`(`publishedBy=1`,test 用户最小 id=4)
|
||||
- dev 库 rdev v3 `status=retired`,`project_selectable=true`(元数据更新不恢复 status)
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "语义摘要持久化与 lineage 版本"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: feature/capability-enablement-impact-plan
|
||||
worktree: "-"
|
||||
mutex: chat+lineage-version
|
||||
---
|
||||
|
||||
# 语义摘要持久化与 lineage 版本
|
||||
|
||||
## 目标
|
||||
|
||||
`chat_summaries` 有迁移;数据库写失败必须返回错误,不能再被当成保存成功。test_manager 血缘使用文档上的版本号。
|
||||
|
||||
## 范围
|
||||
|
||||
- goose `00058` 建 `chat_summaries`。
|
||||
- `SaveChatSummary` 在有连接池时把 INSERT 错误返回给调用方,并标记仅本进程可见。
|
||||
- 确定性摘要写入 revision 与消息区间。不接 `SEMANTIC_SUMMARY_REPLACE`,不计算授权可见集 digest。
|
||||
- lineage 下游/上游版本不再写死 1。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不重启 dev/test/main,因此运行中的库仍停留在 schema 53,直到下次占槽迁移。
|
||||
- 不打开 shadow/replace 开关。
|
||||
- 不实现 trace_reviewer 与 D7 删除传播。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 迁移与保存错误语义。
|
||||
2. [x] lineage 版本改读文档版本。
|
||||
3. [x] `go test` 覆盖写失败与版本选择。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 无法连接数据库时 `SaveChatSummary` 返回错误,且结果 `Persisted=false`。
|
||||
- [x] 无连接池的测试存储仍可读写摘要。
|
||||
- [x] 文档版本为 4 时 lineage 版本为 4;缺失时仍为 1。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- 整改方案: [2026-09-20-capability-enablement-impact-plan.md](../../remediation/2026-09-20-capability-enablement-impact-plan.md)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
2026-09-20 本地 `go test`(未占集成槽、未执行迁移):
|
||||
|
||||
- `TestSaveChatSummary_DatabaseFailureIsNotSuccess` PASS(连接拒绝时返回错误,`Persisted=false`)
|
||||
- `TestGenerateRollingSummary_RecordsRevisionAndMessageSpan` PASS
|
||||
- `TestRollingSummarizer_LifecycleAndFactPreservation` PASS
|
||||
- `TestLineageVersion_UsesDocumentVersion` PASS
|
||||
- `TestMigrationGate_ExpectedFiles` PASS
|
||||
|
||||
goose `00058` 仅入库。dev/test 进程仍是 schema 53,要等下次占槽启动才会建表。
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
title: "test 环境 beta.6 晋升与助手/小队验证"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: docs/test-env-beta6-verification
|
||||
worktree: "-"
|
||||
mutex: infra+docs
|
||||
---
|
||||
|
||||
# test 环境 beta.6 晋升与助手/小队验证
|
||||
|
||||
## 目标
|
||||
|
||||
手工晋升 `dev`→`test` 打 `rc-v1.0.0-beta.6`,schema 56,完成助手/小队 C 级验收与 12 项回归,恢复 S1,落盘报告。
|
||||
|
||||
## 范围
|
||||
|
||||
- merge+tag on `test`(无在主干直接开发 commit)
|
||||
- test 容器重建与 C 级验证
|
||||
- docs 分支报告与 CURRENT 更新后合回 `dev`
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不碰 main;不改项目 143;不启用 FAV_DEGRADED_READ / MULTI_INTENT_PLAN_TIER=full
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] S0 快照 + merge/tag beta.6
|
||||
2. [x] rebuild → schema 56 + CSP
|
||||
3. [x] S1 快照
|
||||
4. [x] 助手 / 小队 / 回归
|
||||
5. [x] restore S1 + 清理 workspace
|
||||
6. [x] test-report + CURRENT → merge dev
|
||||
|
||||
## 验收
|
||||
|
||||
- [报告](../../test-reports/2026-09-20-test-env-beta6-assistant-squad-test-report.md)
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: "test 环境三问题整改(重名/成员可见/文档预览)"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
owner: Cursor-Auto
|
||||
branch: fix/test-env-triage-2026-09-20
|
||||
worktree: "-"
|
||||
mutex: projectworkflow+chat+assets
|
||||
---
|
||||
|
||||
# test 环境三问题整改(重名/成员可见/文档预览)
|
||||
|
||||
## 目标
|
||||
|
||||
修复 test 环境实测发现的三项缺陷:全局项目名唯一、成员拉入后可见项目/会话、上传文档可服务端回退预览。
|
||||
|
||||
## 范围
|
||||
|
||||
- 迁移 `00057`:全局唯一项目名索引 + 存量改名
|
||||
- 应用层创建项目校验改为全局查重
|
||||
- 拉人入项目后自动建成员私有会话;upsert 允许项目管理员代注册
|
||||
- 资产 raw 下载端点 + 前端预览服务端回退
|
||||
- test 库数据修复(退役项目 4、修会话归属、补陈威会话)
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不改项目 143 / SWBOOT / FAV
|
||||
- 不物理删除项目 4(仅 `demo_retired`)
|
||||
- 不改变跨环境数据隔离
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 迁移 00057 + 应用层全局重名校验
|
||||
2. [x] 会话归属修复(拉人建会话 + upsert 代注册)
|
||||
3. [x] 资产 raw 端点 + 前端预览回退
|
||||
4. [x] 单测 / vet / npm test
|
||||
5. [x] 合入 dev 冒烟
|
||||
6. [x] test 库数据修复 + 端到端验证 + 报告
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] test 库无重名项目;跨用户创建重名返回 409
|
||||
- [x] 陈威登录可见项目 5 与会话 `sess-p5-u35`
|
||||
- [x] 刷新后 PDF 可通过服务端 raw 回退预览
|
||||
- [x] `go vet ./...` + `go test -short ./...` + `cd web && npm test` 全绿
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Test report: [.doc/test-reports/2026-09-20-test-env-triage-fixes-test-report.md](../../test-reports/2026-09-20-test-env-triage-fixes-test-report.md)
|
||||
- Data fix: [scripts/fix-test-env-triage-data.sql](../../../scripts/fix-test-env-triage-data.sql)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
- merge: `213ad015`;test schema 57;E2E ALL_PASS(见报告)
|
||||
@@ -0,0 +1,447 @@
|
||||
---
|
||||
title: "功能启用与项目文档修改影响分析整改方案"
|
||||
status: in_progress
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
---
|
||||
|
||||
# 功能启用与项目文档修改影响分析整改方案
|
||||
|
||||
## 1. 背景与目标
|
||||
|
||||
本方案依据[源码与运行态调研](../ops/research/2026-09-20-capability-enablement-impact-research.md)。目标不是一次性打开全部 flag,而是使系统能够回答并证明四件事:功能是否真正接入生产入口、当前在哪个灰度阶段、失败时如何回退、用户如何看到可靠结果。
|
||||
|
||||
第二个目标是让助手在每次文档候选或提交后提供:本次修改内容、项目及相关文档影响、证据和不确定性、下一步建议。常规分析只读取变更片段和已登记关联;首次建索引、索引损坏或明确重建时才允许后台全量扫描。
|
||||
|
||||
本方案不直接授权启用 test/main 开关,也不授权 FAV、D7 删除策略、软件自举受控执行或全局编制人兼任。每个波次在 feature/fix 分支实施,合 dev 和共享容器验证继续占用 CURRENT 集成槽。
|
||||
|
||||
## 2. 总体判断
|
||||
|
||||
### 2.1 能力分组
|
||||
|
||||
| 组别 | 能力 | 当前动作 |
|
||||
|---|---|---|
|
||||
| 已在用 | legacy 有限只读多意图、确定性摘要、确定性文档 diff/风险/report | 保持运行,补观测,不改变默认行为 |
|
||||
| 整改后可灰度 | 多意图 shadow/auto_read、语义摘要 shadow、PI change-report narrative | 完成各自前置项后只在 dev 小范围开放 |
|
||||
| 仍需实现 | confirm 后可靠调度、U9 真实入口、U10–U12 live、语义摘要 replace、项目追踪索引 | 按波次开发和验收,不能用开关代替实现 |
|
||||
| 继续关闭 | full 一键放量、FAV live/degraded read、D7 物理删除、SWBOOT-10 stub 绕过 | 保持现状,另立授权与验收 |
|
||||
|
||||
### 2.2 核心架构
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
Candidate[文档候选] --> Preview[proposed 预估报告]
|
||||
Commit[正式提交] --> Ledger[文档快照和版本账本]
|
||||
Ledger --> Outbox[可靠事件]
|
||||
Outbox --> Indexer[增量追踪投影器]
|
||||
Indexer --> Items[项目追踪条目和修订]
|
||||
Indexer --> Edges[版本化关系]
|
||||
Items --> Analyzer[影响分析器]
|
||||
Edges --> Analyzer
|
||||
Ledger --> Analyzer
|
||||
Analyzer --> Report[持久变更报告]
|
||||
Preview --> Chat
|
||||
Report --> Chat[聊天影响卡]
|
||||
Report --> DocUI[文档版本面板]
|
||||
Report --> ProjectUI[项目追踪视图]
|
||||
Chat --> Suggested[用户选择建议动作]
|
||||
Suggested --> Auth[重新鉴权、租约、版本检查]
|
||||
Auth --> Workflow[目标文档工作流]
|
||||
```
|
||||
|
||||
确定性事实始终由服务端账本、项目追踪关系和权限判定生成。PI 只生成解释、候选关系和建议,不能降低风险、扩大可见集或直接修改其他文档。
|
||||
|
||||
## 3. 功能就绪与灰度契约
|
||||
|
||||
管理台需要把一个“开关”拆成以下字段,避免 `value=true` 被误解成可用:
|
||||
|
||||
| 字段 | 含义 |
|
||||
|---|---|
|
||||
| configured_value | 配置声明值 |
|
||||
| effective_value | 当前进程实际值 |
|
||||
| implementation_state | placeholder / dry_run / shadow / live |
|
||||
| adapter_readiness | ready / unavailable / degraded,以及原因 |
|
||||
| rollout_scope | 环境、项目、用户或百分比 |
|
||||
| requires_restart | 是否需要重启 |
|
||||
| evidence | 最近一次验收报告和镜像 digest |
|
||||
| metrics | 调用量、成功率、回退率、P95、最近错误 |
|
||||
|
||||
开关变更需写审计记录并支持按项目 allowlist。关闭时,已有计划和报告仍可读取;执行中的任务进入可解释终态,不能静默遗弃。
|
||||
|
||||
管理台采用“先读后改”的能力详情流。`effective_value`、成熟度、adapter readiness、证据和指标始终只读;管理员编辑 configured value 和允许的 rollout scope 时,页面即时展示未满足门禁和是否需要重启。提交前预览旧值、新值、作用范围和预期实际效果;提交后明确显示待重启、部分生效、成功或失败,并提供基于上一审计 revision 的回退动作。保存配置成功不等于能力已经生效。
|
||||
|
||||
### 3.1 多意图状态机
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Legacy
|
||||
Legacy --> Shadow: 只生成和对账计划
|
||||
Shadow --> AutoRead: 只读指标达标
|
||||
AutoRead --> Confirm: 生成动作验收通过
|
||||
Confirm --> DomainLive: 单一领域适配器验收
|
||||
DomainLive --> WiderRollout: 观察窗达标
|
||||
Shadow --> Legacy: 错误率或成本超阈值
|
||||
AutoRead --> Legacy: 权限、重复或恢复异常
|
||||
Confirm --> Legacy: 确认前副作用或调度异常
|
||||
```
|
||||
|
||||
- `shadow` 必须从真实聊天入口生成持久但不可执行的计划,并与 legacy 结果对账;当前 legacy/no-op 语义不足以充当完整 shadow。
|
||||
- `auto_read` 只允许真实查询 owner;receipt 必须包含查询类型、授权范围 digest、结果版本和恢复标识,禁止 Fake owner。
|
||||
- `confirm` 在用户确认前零业务写。决定事务复用现有 `intent_plan_steps`、`ClaimStep`、`ExecuteClaimed`、`RecoverReceipt` 和 `intent.plan` 事件作为唯一执行事实源;新增生产 dispatcher 领取已有步骤,重新鉴权、检查 expected resource version,再调用幂等领域 owner。禁止另建第二套决定队列和步骤状态机。
|
||||
- U9 仅在规则分段低置信时提出候选 span;所有候选仍进入相同策略、鉴权和确认链。
|
||||
- U10、U11、U12 分别接真实领域端口和独立 allowlist;不使用 `full` 同时开放。
|
||||
|
||||
### 3.2 语义摘要状态机
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Deterministic
|
||||
Deterministic --> Shadow: 后台生成语义候选
|
||||
Shadow --> ReplacePilot: 质量与数据安全门禁通过
|
||||
ReplacePilot --> ProjectRollout: 项目白名单观察窗通过
|
||||
ProjectRollout --> EnvironmentRollout: 环境级批准
|
||||
Shadow --> Deterministic: 超时、校验失败或撤权
|
||||
ReplacePilot --> Deterministic: 事实丢失或陈旧
|
||||
```
|
||||
|
||||
语义叙事只替换 Narrative,Facts 和 OpenQuestions 由服务器合并保护。每份摘要绑定 session、授权可见集 digest、from/to message ID、上个摘要 revision、模型/协议版本和生成时间。授权变化或消息修订使其失效。
|
||||
|
||||
摘要生成放到可靠后台任务;用户请求先返回确定性摘要。PI 返回必须包含 input digest、覆盖水位和结构化字段,服务端严格校验。失败继续提供确定性结果并记录 fallback,不阻断聊天。
|
||||
|
||||
## 4. 项目追踪数据模型
|
||||
|
||||
### 4.1 设计原则
|
||||
|
||||
1. 项目级统一身份,工作流、文档和阶段作为归属,不为每个工作流复制需求。
|
||||
2. 正文仍由 document snapshot/version 账本管理;追踪表只存结构化字段、定位和 hash。
|
||||
3. 条目修订不可变,删除使用 tombstone;关系有生效和失效版本。
|
||||
4. 确定关系、人工确认关系、规则抽取关系、模型候选关系分开存放。
|
||||
5. 所有读取先经过项目与逐文档可见性过滤;不可通过标题、数量、错误或候选泄漏隐藏文档。
|
||||
|
||||
### 4.2 建议表
|
||||
|
||||
#### project_trace_items
|
||||
|
||||
稳定项目条目身份。
|
||||
|
||||
| 字段 | 说明 |
|
||||
|---|---|
|
||||
| id / project_id | 主键和项目边界 |
|
||||
| business_key | 项目内稳定键,如 UR-001、REQ-017、TC-017 |
|
||||
| kind | requirement / risk / interface / test / decision / deliverable |
|
||||
| lifecycle_state | draft / active / superseded / retired |
|
||||
| current_revision_id | 当前修订指针 |
|
||||
| created_at / created_by | 审计字段 |
|
||||
|
||||
约束:`unique(project_id, kind, business_key)`;business_key 变更使用 alias 或 supersedes 边,不直接改写历史身份。
|
||||
|
||||
条目身份契约:合规且项目内唯一的显式业务键可直接绑定;无键条目分配不可变内部身份;重复键阻断投影并进入人工消歧;改名必须通过旧键映射和 expected revision 显式确认,未确认时按“删除候选 + 新增候选”处理。历史回填保留可审计映射,不能靠标题相似度静默合并身份。
|
||||
|
||||
#### project_trace_item_revisions
|
||||
|
||||
不可变条目版本。
|
||||
|
||||
| 字段 | 说明 |
|
||||
|---|---|
|
||||
| item_id / revision_no | 条目和单调修订号 |
|
||||
| source_doc_id / source_snapshot_id | 权威文档版本 |
|
||||
| block_id / heading_path / anchor | 精确片段定位 |
|
||||
| content_hash | 规范化片段 hash |
|
||||
| title / statement | 结构化标题和陈述 |
|
||||
| acceptance_criteria / verification_method | 需求和验证字段 |
|
||||
| attributes | 类型专属 JSONB;需 schema_version |
|
||||
| evidence_kind | declared / extracted / imported |
|
||||
| review_state | confirmed / candidate / rejected |
|
||||
| extractor_version | 重建和兼容依据 |
|
||||
| tombstone | 在该快照已删除 |
|
||||
|
||||
唯一幂等键建议为 `(source_snapshot_id, block_id, extractor_version, content_hash)`。
|
||||
|
||||
#### project_trace_edges
|
||||
|
||||
版本化关系边。
|
||||
|
||||
| 字段 | 说明 |
|
||||
|---|---|
|
||||
| project_id | 事务与鉴权边界 |
|
||||
| from_item_id / to_item_id | 有向关系两端 |
|
||||
| relation_type | refines / satisfies / verifies / mitigates / depends_on / conflicts_with / supersedes |
|
||||
| from_revision_id / to_revision_id | 关系成立时的证据版本 |
|
||||
| evidence_doc_id / snapshot_id / block_id | 可点击证据 |
|
||||
| provenance | explicit_reference / workflow_consumption / rule / human / model_candidate |
|
||||
| confidence | 仅候选使用,不覆盖事实状态 |
|
||||
| review_state | confirmed / candidate / rejected;由决定账本投影 |
|
||||
| valid_from / valid_to | 关系历史 |
|
||||
| created_by / reviewed_by | 审计字段;reviewed_by 由决定账本投影 |
|
||||
|
||||
禁止用向量相似度直接生成 confirmed edge。模型候选不能触发自动写文档或把风险降级。
|
||||
|
||||
#### project_trace_edge_decisions
|
||||
|
||||
人工关系治理的不可变权威账本,避免重建投影时丢失已经确认、拒绝或撤销的决定。
|
||||
|
||||
| 字段 | 说明 |
|
||||
|---|---|
|
||||
| id / project_id / edge_key | 决定身份、项目和稳定关系键 |
|
||||
| candidate_revision_id | 决定针对的候选版本 |
|
||||
| decision | confirm / reject / revoke |
|
||||
| reason / evidence_refs | 原因和当时可见证据引用 |
|
||||
| expected_revision | CAS 版本 |
|
||||
| decided_by / decided_at | 操作者和时间 |
|
||||
|
||||
`project_trace_edges` 是文档事实、抽取结果与此决定账本的联合投影。重建必须重放决定账本;旧候选不得因 extractor 重跑而绕过既有拒绝,关系两端或证据实质变化时才产生新候选 revision。
|
||||
|
||||
#### project_trace_index_state
|
||||
|
||||
保存 `project_id + doc_id + source_snapshot_id + extractor_version`、status、indexed_at、覆盖条目数、失败原因、retry_count。只有状态为 complete 且 source snapshot 与当前基线一致,UI 才能显示“已分析且未发现影响”。
|
||||
|
||||
每次影响报告另记录项目覆盖 epoch、当前可见文档集合 digest,以及集合内各文档的 current snapshot 和 extractor version。只有集合全部 complete 且仍与当前基线一致,才可返回 `no_known_dependencies`;任一缺失、陈旧或失败分别返回 `index_pending`、`partial` 或 `failed`。
|
||||
|
||||
### 4.3 与现有 document_lineage 的关系
|
||||
|
||||
`document_lineage` 保留文档级的实际消费事实,但改用真实 snapshot/version,修复写死 version=1,并支持有效期。条目级 edge 解释被消费内容及其具体影响。静态工作流先后顺序不能自动当作真实依赖;没有实际引用时只可作为“建议检查”候选。
|
||||
|
||||
## 5. 增量索引与影响分析
|
||||
|
||||
### 5.1 提交链路
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as 用户/Agent
|
||||
participant D as 文档命令
|
||||
participant L as 版本账本
|
||||
participant O as Outbox
|
||||
participant I as 追踪投影器
|
||||
participant A as 影响分析器
|
||||
participant R as 报告/UI
|
||||
U->>D: 保存候选
|
||||
D->>D: 权限、租约、expected revision
|
||||
D->>A: 生成 proposed 预估报告
|
||||
A->>R: 保存 proposed report,不写 stale/通知
|
||||
R-->>U: 展示预估影响和下一步
|
||||
U->>D: 正式提交
|
||||
D->>L: 原子写 snapshot/version
|
||||
D->>O: 写 document.committed
|
||||
O-->>I: 至少一次投递
|
||||
I->>I: 按 snapshot+extractor 幂等增量抽取
|
||||
I->>A: trace.indexed 或 trace.failed
|
||||
A->>A: 授权过滤后有界反向遍历
|
||||
A->>R: 持久 report + coverage status
|
||||
R-->>U: 修改、影响、证据、建议
|
||||
```
|
||||
|
||||
所有候选来源必须生成并持久化标识为 `proposed` 的预估报告:Agent 生成、人工块编辑、恢复历史版本、导入和修复迁移。候选报告不能写 stale、触发正式通知或发出 `document.committed`。正式提交后才写账本、发出 `document.committed` 并生成 authoritative report。
|
||||
|
||||
### 5.2 增量算法
|
||||
|
||||
1. 对比前后 block map 和 business key,识别新增、修改、删除、移动、改名。
|
||||
2. 只重新抽取变化块及必要父标题;未变 block 沿用已确认条目修订。
|
||||
3. 只有 schema 明确给出关系类型的结构化引用和已记录的实际工作流消费可自动写 confirmed 边。普通正文中的无类型 ID 提及只生成带上下文证据的 candidate;否决方案、历史引用和否定语境不得自动确认。模型只为未覆盖条目产生候选。
|
||||
4. 后台以受审计的项目服务身份从变化条目反向遍历 confirmed 边;默认深度 3、节点数和时间有上限,并启用 cycle detection。规范结果只保存结构化条目、关系、文档标识和证据定位,不保存可直接向普通用户展示的隐藏正文。
|
||||
5. 对命中的目标读取对应片段和邻接上下文,不读全部文档;首次索引或修复任务在后台全量读取,并显示状态。
|
||||
6. 将 diff、条目变化、直接/间接影响、证据路径、索引覆盖和建议保存到规范 report revision。每次读取按当前主体重新执行逐文档策略,过滤 source、target 和 evidence 后重算数量、覆盖状态和展示文案。
|
||||
7. 乱序事件不能将索引回退到旧 snapshot;重复事件返回同一投影结果。
|
||||
|
||||
### 5.3 影响状态与风险
|
||||
|
||||
必须区分:
|
||||
|
||||
| 状态 | 含义 | UI 文案方向 |
|
||||
|---|---|---|
|
||||
| confirmed_impact | 确定关系和内容变化证明影响 | 需要复核/更新 |
|
||||
| possible_impact | 候选关系或语义不确定 | 建议核实,不自动写 |
|
||||
| dependency_unchanged | 存在关系,但相关片段未受影响 | 已检查,无需动作 |
|
||||
| no_known_dependencies | 索引完整,未登记关系 | 未发现已知关联 |
|
||||
| index_pending | 新版本尚未分析完 | 分析中,不能判断无影响 |
|
||||
| partial | 达到查询上限或部分目标不可分析 | 结果不完整 |
|
||||
| failed | 投影/查询失败 | 分析失败,保守处理 |
|
||||
|
||||
风险计算应按变更内容、关系类型、目标基线状态和证据确定性合成。纯格式变化不因存在 lineage 自动升 critical;删除已批准安全需求、关键数值变化、冲突关系或已批准下游失效继续保持 high/critical 下限。
|
||||
|
||||
## 6. 影响报告与用户交互契约
|
||||
|
||||
报告至少包含:
|
||||
|
||||
- report_id、project_id、source doc/snapshot、from/to SHA、状态和生成时间。
|
||||
- 本次修改:业务键、位置、旧值→新值、变更类型;无业务变化时明确说明。
|
||||
- 项目影响:工作流、阶段、风险、交付物和阻塞条件。
|
||||
- 文档影响:可见文档名称、状态、直接/间接、确定/候选、证据路径。
|
||||
- 覆盖说明:索引 snapshot、extractor/version、complete/partial/pending/failed。
|
||||
- 建议动作:action key、原因、目标、前置条件、责任职责、是否需要确认。
|
||||
- PI 说明 provenance:deterministic / pi_enriched / fallback,模型、协议、input digest。
|
||||
|
||||
同一 report_id 指向服务端规范事实,由聊天卡、文档版本面板和项目“需求与影响”页共同引用。每次规范结果更新生成单调 `report_revision`。面向用户的 `ReportView` 以 `report_id + report_revision + authorization_visibility_digest + narrative_protocol_version` 为键:先按当前主体过滤文档、条目、证据和数量,再生成确定性文案或 PI 叙事。`trace.indexed`、`trace.failed`、关系决定、规范报告更新和授权变化都失效旧视图;刷新、重登和重启后,同一主体看到一致结果,不同权限主体不会共享自由文本叙事。
|
||||
|
||||
`proposed` 报告具有 `active`、`superseded`、`rejected`、`expired`、`committed` 生命周期,绑定 candidate revision、base snapshot 和 expected head。候选被拒绝/取消、新候选替代、基线推进或版本冲突时,旧报告不可再创建建议动作;正式提交时写入 authoritative successor report_id。
|
||||
|
||||
助手应在候选生成后展示 `proposed` 预估影响,并在正式提交后展示 authoritative 结果。两种状态均主动说明:
|
||||
|
||||
1. 本次实际改了什么。
|
||||
2. 对当前项目或工作流的影响。
|
||||
3. 还可能涉及哪些文档及证据。
|
||||
4. 哪些关系尚不确定或索引尚未完成。
|
||||
5. 建议的有序下一步。
|
||||
|
||||
用户点击“按建议修改”只创建明确的动作草案;随后重新检查权限、职责、租约、expected revision 和审批规则。总结、查询、分析类意图保持只读,不自动启动修改。
|
||||
|
||||
每个建议动作使用统一可见状态:`available`、`checking`、`draft_created`、`confirmation_required`、`executing`、`completed`、`forbidden`、`stale_or_conflict`、`failed`、`cancelled`。三个入口共用状态和按钮语义;目标文档显示草案入口,冲突要求刷新后重新预览,失败可重试,取消和完成都回写原 report_id 时间线。
|
||||
|
||||
异步分析状态也必须给出恢复路径:`index_pending` 自动刷新并显示最近更新时间;`partial` 展示已覆盖和未覆盖范围;`failed` 仅展示安全的失败分类、重试状态和管理员联系/重建入口。恢复后在原 report_id 上更新状态并通知,不覆盖历史时间线。
|
||||
|
||||
项目“需求与影响”页的信息架构固定为:首屏先显示索引覆盖健康和待处理影响;随后是按 requirement、risk、interface、test、decision、deliverable 分类并可搜索筛选的条目清单。条目详情集中展示当前修订、上下游关系、证据片段、历史版本和关联报告;聊天卡与文档影响项直接深链到该详情。
|
||||
|
||||
跨界面验收包含可访问性和窄屏行为:报告和管理动作可全键盘完成;弹层聚焦标题并在关闭时归还焦点;pending/failed/completed 使用 `aria-live`;关系图提供等价的可筛选关系列表和证据链接;窄屏使用全宽抽屉和分组列表,主要动作满足触控操作要求。
|
||||
|
||||
## 7. API 与授权边界
|
||||
|
||||
建议增加或扩展以下资源,命名可在实施时按现有路由规范调整:
|
||||
|
||||
| 资源 | 用途 | 关键约束 |
|
||||
|---|---|---|
|
||||
| 项目追踪条目列表/详情 | 需求、风险、接口、测试清单 | 项目成员 + 文档可见性;分页、过滤 |
|
||||
| 条目关系图 | 直接和有界多跳关系 | 服务端过滤后计算数量,防侧信道 |
|
||||
| 文档影响报告 | 获取 report 和进度 | source/target 均按可见性裁剪 |
|
||||
| 关系候选确认/拒绝 | 人工治理模型候选 | 默认关闭;治理政策批准后才开放;CAS、决定账本、审计 |
|
||||
| 索引状态/重建 | 管理索引健康 | 普通用户只读状态;重建为管理员操作 |
|
||||
| 建议动作创建 | 从 report 生成动作草案 | 再鉴权、幂等、明确目标版本 |
|
||||
|
||||
现有 lineage API 先修复:doc_id 必须属于 URL project,且每个返回端点都通过逐文档策略;错误不得把不可见对象存在性泄漏给调用方。影响总数只能按调用者可见集统计。
|
||||
|
||||
关系候选治理的推荐政策是新增项目本地 `trace_reviewer` 动作能力,并把它嵌入现有文档职责:项目创建者只能在两端文档已有编制人或审核人中显式指派;全局系统管理员不会自动获得该项目、文档或候选的查看和确认权限。确认或拒绝时,同一 CAS 事务必须验证 route project、candidate、两个 item 和两个 source document 都属于同一项目,操作者当前可见两端文档且持有该能力。跨文档候选需要源端和目标端各一名符合条件者确认;同一人同时承担两端职责时可合并一次决定。每次变更限制候选数量并生成待办;未处理候选只产生 `possible_impact`,积压超过 Foundation 0 冻结门槛时停止扩大模型候选范围。此政策需用户审核通过后实施;未批准前端点保持关闭。
|
||||
|
||||
### 7.1 PI 输入安全门
|
||||
|
||||
Foundation 1 建立所有 PI 消费者共用的 R13 输入信封。服务端绑定 tenant/project、主体授权可见集 digest 和输入 digest;每个消费者只接收字段白名单和必要片段,执行敏感字段脱敏,并限制 runner 凭证、workspace 和日志留存。门禁不可用时 `adapter_readiness=unavailable`,立即走确定性回退。
|
||||
|
||||
语义摘要、变更叙事、U9 分段和关系候选都必须经过同一门禁;不得把“完整 diff/impact”解释为无裁剪全文。Track I、S、T 各阶段的进入条件均包含跨项目、撤权、提示注入、敏感字段泄漏和日志留存负例。
|
||||
|
||||
## 8. 分轨实施计划
|
||||
|
||||
先完成共享基座,再让三条能力轨道独立晋级、验收和回退,避免语义摘要被多意图或追踪索引阻塞,也避免用户最关心的影响定位排在多意图之后。
|
||||
|
||||
### 8.1 共享基座
|
||||
|
||||
| 波次 | 内容 | 主要产物 | 关闭条件 |
|
||||
|---|---|---|---|
|
||||
| Foundation 0:状态校准 | 校准 FEATURE-MATRIX 和管理台成熟度;新增运行时 readiness/metrics;开关审计、项目 allowlist、放量阈值登记 | 准确能力目录和管理流程 | 配置值不再冒充可用性;阈值预先冻结 |
|
||||
| Foundation 1:安全与持久化 | lineage API 鉴权;chat_summaries 迁移和严格错误;授权水位;纯推理 Runner profile;共用 R13 PI 输入信封 | 通用安全和恢复基础 | PG、权限/泄漏负例、重启恢复、工具隔离通过 |
|
||||
|
||||
### 8.2 Track I:多意图
|
||||
|
||||
| 阶段 | 内容 | 进入下一阶段条件 |
|
||||
|---|---|---|
|
||||
| I1 生产接线 | 真实 query owner;单轮接管;typed payload/version;复用现有步骤领取、receipt 恢复和 intent.plan 事件;新增生产 dispatcher | 确认前零写、确认后一次执行、崩溃与刷新恢复通过 |
|
||||
| I2 shadow / auto_read / confirm | 按状态机逐级开放项目 allowlist | 精度、安全、P95、采用率和放弃率达到冻结阈值 |
|
||||
| I3 逐域扩面 | U9、U10、U11、U12 分别接真实 adapter | 每域真实 UI+PG+PI 长链单独通过;禁止 full 一次放量 |
|
||||
|
||||
### 8.3 Track S:语义摘要
|
||||
|
||||
| 阶段 | 内容 | 进入下一阶段条件 |
|
||||
|---|---|---|
|
||||
| S1 shadow 生产化 | 后台任务、旧摘要融合、input/watermark 校验、持久 provenance、确定性即时回退 | 事实保持、撤权、陈旧、性能、重启和 R13 门通过 |
|
||||
| S2 replace 项目试点 | 只替换 Narrative;Facts/OpenQuestions 由服务端保护;项目 allowlist | shadow 标注数据达到冻结质量阈值,回退演练通过 |
|
||||
| S3 环境扩面 | test/main 分别授权 | 各环境观察窗和真实页面验收通过 |
|
||||
|
||||
### 8.4 Track T:文档影响与追踪
|
||||
|
||||
| 阶段 | 内容 | 进入下一阶段条件 |
|
||||
|---|---|---|
|
||||
| T1 基础影响闭环 | 修 lineage 版本;统一提交事件;proposed/authoritative 报告;聊天卡;PI narrative 接最小化 diff/impact | 人改/Agent/恢复/导入一致;未知不伪装无影响 |
|
||||
| T2 项目追踪索引 | 五表迁移;结构化需求/用例投影;UR/RS/REQ/TC 键;决定账本;项目页面 | D7 确认派生条目/候选/决定的留存类别和源文档删除传播规则;双向追踪、授权、决定重放、增量幂等通过 |
|
||||
| T3 多跳与候选 | 有界递归、循环检测、语义候选、两端人工确认、片段装配 | 准确率、候选积压和成本门槛达标;候选不污染事实 |
|
||||
|
||||
推荐先并行启动 Foundation 0、lineage API 鉴权和 T1 的非 PI 部分。Foundation 1 完成后,I、S、T 各自推进;任何轨道都不能以另一轨道“尚未完成”为由跳过自身门禁。
|
||||
|
||||
## 9. 验收方案
|
||||
|
||||
### 9.1 静态与单元门
|
||||
|
||||
- 迁移从空库、与当前 main 一致的 schema 52 夹具、schema 53 三种基线升级均成功;main 晋升前保存升级与回退演练证据,down migration 按项目规范评估。
|
||||
- config 测试保证默认值和 Compose 声明一致;未知 tier fail closed。
|
||||
- 每个状态转换、CAS、幂等键、乱序事件、循环关系和查询上限有测试。
|
||||
- `rg` 证明生产组合根无 Fake owner,live adapter 无 dry-run receipt。
|
||||
- PI 纯推理 profile 的实际 argv 不包含 read/write/edit/search 或扩展,不能仅断言 prompt 文案。
|
||||
- 所有 PI 消费者的 R13 输入信封校验 tenant/project、授权可见集 digest、字段白名单、脱敏和日志留存;门禁失败时能力 unavailable。
|
||||
|
||||
### 9.2 PostgreSQL 与授权门
|
||||
|
||||
- 两项目、两用户、项目管理员、普通成员、非成员和文档级不可见对象。
|
||||
- 任意 project_id + 他项目 doc_id 不能读取 lineage、条目、边、report 或总数。
|
||||
- 索引事务中断、重复和乱序事件,最终只指向最新快照。
|
||||
- 删除、改名、supersede、循环、多跳、旧版本边、候选拒绝均保留历史。
|
||||
- 摘要和影响报告重启后恢复;数据库写失败不得伪装持久化成功。
|
||||
- 高权限提交者与低权限查看者共用 report_id 时,ReportView、PI 叙事、数量和覆盖状态按各自 visibility digest 隔离;撤权后旧视图失效。
|
||||
|
||||
### 9.3 真实聊天与浏览器门
|
||||
|
||||
- 用户从真实页面发起“两项查询”“查询+指定文档生成”“两项生成”“先查询再总结”“模糊指代”。
|
||||
- 确认前数据库零业务写;确认后只执行所选步骤一次。覆盖双标签、重复点击、取消、超时、撤权和版本冲突。
|
||||
- 在 dispatcher 领取后、领域写后/receipt 前杀进程并重启,卡片恢复且无重复副作用。
|
||||
- 人工修改一条数值需求后,页面显示 old→new、相关设计/用例、证据和建议;纯格式修改不滥升 critical。
|
||||
- 索引 pending/partial/failed 时禁止展示“无影响”。隐藏文档不泄漏标题、ID、摘要或数量。
|
||||
- 聊天、文档版本面板和项目追踪页共用 report_id,刷新/重登/重启一致。
|
||||
|
||||
### 9.4 真实 PI 门
|
||||
|
||||
- 固定提交和镜像 digest,记录实际 feature state、模型、input digest、工具 profile 和耗时。
|
||||
- semantic shadow、change narrative、U9 各有正常、timeout、畸形、注入和撤权用例。
|
||||
- PI 不能降低服务端风险、添加 confirmed impact、扩大可见集或绕过确认。
|
||||
- 不以 stub、直接 adapter 单测或 API 直调替代最终真实页面验收。
|
||||
|
||||
### 9.5 度量与放量门槛
|
||||
|
||||
首次 shadow 观察期至少采集:
|
||||
|
||||
- 多意图:segment precision/recall、写意图漏判、错误动作率、fallback、P95、计划采用率、确认放弃率、主动拆单回退率。
|
||||
- 摘要:事实保持率、旧事实召回、幻觉/矛盾率、撤权失效率、fallback、P95、token/成本。
|
||||
- 影响:confirmed 关系 precision/recall、候选接受率、漏报、误报、平均读取文档数/块数/字节、索引滞后、P95。
|
||||
- 运行:任务重复副作用为 0,未授权读取/写入为 0,pending/failed 误报 no-impact 为 0。
|
||||
|
||||
具体阈值由 Foundation 0 用标注数据集登记后冻结,禁止事后按结果降低。没有代表性样本时,只能保持 shadow。多意图采用率、确认放弃率或主动拆单回退率未达阈值时,停止 confirm 后写动作和 U9–U12 扩面,只保留明确告知与已验证的只读路径。
|
||||
|
||||
## 10. 回退与数据兼容
|
||||
|
||||
- 每个能力可按项目降级到上一层;停止创建新任务,不删除已有计划、report、条目或审计。
|
||||
- 多意图关闭后,执行中的步骤完成到安全终态或明确 cancelled;禁止回落到 legacy 后重复执行同一句写操作。
|
||||
- 摘要 replace 关闭后立即使用最后一次确定性摘要;语义候选保留用于审计,不注入 prompt。
|
||||
- 索引器关闭后文档提交继续成功;报告影响状态显示 `index_pending`,索引器的 `adapter_readiness` 显示 `degraded`;恢复后从 outbox/checkpoint 重放。
|
||||
- 条目、修订、关系和索引状态是可重建投影;人工关系决定由 `project_trace_edge_decisions` 权威账本保存并备份,重建不能丢失确认、拒绝或撤销。
|
||||
- test/main 放量需独立变更记录、环境级验收和回退演练,不因 dev 通过自动继承。
|
||||
|
||||
## 11. 任务拆分建议
|
||||
|
||||
实施时为每项建立独立 short-term 与 mutex:
|
||||
|
||||
1. `fix/feature-readiness-and-lineage-authz`:Foundation 0 + lineage 鉴权。
|
||||
2. `fix/semantic-summary-persistence`:chat_summaries、watermark、授权 digest、失败语义。
|
||||
3. `feature/pi-reasoning-profile`:Runner 纯推理协议和三个消费者迁移。
|
||||
4. `fix/intent-plan-production-wiring`:真实 query owner、单轮接管、现有步骤内核的生产 dispatcher 和恢复。
|
||||
5. `feature/document-impact-report`:统一提交事件、文档级影响与聊天卡。
|
||||
6. `feature/project-traceability-index`:表、投影、项目需求/验证视图。
|
||||
7. `feature/trace-impact-candidates`:有界多跳、候选治理和片段装配。
|
||||
8. `feature/semantic-summary-replace-pilot`:独立授权后的替换试点。
|
||||
9. U9/U10/U11/U12 各自独立任务,禁止合成一个 full 放量任务。
|
||||
|
||||
## 12. 完成定义
|
||||
|
||||
- [ ] 管理台准确区分配置、实际值、实现成熟度、adapter 状态和 rollout。
|
||||
- [ ] 多意图不存在生产 Fake receipt;confirm 后由复用现有步骤内核的可恢复 dispatcher 执行,确认前零写。
|
||||
- [ ] 摘要 PostgreSQL 持久化、授权可见集、水位、provenance、重启恢复和确定性回退闭环。
|
||||
- [ ] PI 的 no-tool 由 Runner 能力强制,而非只靠 Instructions。
|
||||
- [ ] 所有文档提交来源生成持久影响报告;未知、失败和无影响语义分开。
|
||||
- [ ] 项目需求/风险/接口/测试清单来自统一版本化索引,可双向追踪到文档快照与块。
|
||||
- [ ] 无类型正文 ID 仅形成候选;条目无键、重复键和改名均按身份契约处理,历史映射可审计。
|
||||
- [ ] 助手在修改后主动展示本次修改、项目影响、相关文档、证据、不确定性和下一步建议。
|
||||
- [ ] 每个候选都有持久 `proposed` 报告,正式提交才产生 authoritative report、stale 和通知;两条路径不混用事件。
|
||||
- [ ] `proposed` 报告在取消、替代、冲突和基线推进后不可执行,正式提交回链 successor report。
|
||||
- [ ] T2 开始前完成派生条目、候选和关系决定的 D7 留存分类与源文档删除传播决策。
|
||||
- [ ] 常规分析有证据证明只读取命中片段;全量重建是可见、可审计的后台状态。
|
||||
- [ ] 真实浏览器 + PostgreSQL + 产品 PI 长链通过,报告归档并回链 FEATURE-MATRIX。
|
||||
- [ ] dev→test→main 分别批准和验收;任一失败可回退且不丢历史或重复副作用。
|
||||
|
||||
## 13. 相关链接
|
||||
|
||||
- Research: [2026-09-20-capability-enablement-impact-research.md](../ops/research/2026-09-20-capability-enablement-impact-research.md)
|
||||
- Archived task: [2026-09-20-capability-enablement-impact-plan.md](../archive/ops/2026-09-20-capability-enablement-impact-plan.md)
|
||||
- Feature matrix: [FEATURE-MATRIX.md](../status/FEATURE-MATRIX.md)
|
||||
- Gap matrix:本轮未新增发布 blocker;实现阶段若发现当前默认路径存在真实安全/数据破坏问题,再按证据更新。
|
||||
@@ -0,0 +1,110 @@
|
||||
---
|
||||
title: "模块解耦分批整改(A–G)"
|
||||
status: planned
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
---
|
||||
|
||||
# 模块解耦分批整改(A–G)
|
||||
|
||||
## 背景
|
||||
|
||||
[耦合审计](../audit/2026-09-20-module-coupling-audit.md) 确认:模块化单体、窄端口和 PG 事件总线已经在运行。本计划只清除仍会让故障跨模块扩散的残留,不推翻 [ADR](../adr/2026-09-14-modular-monolith-decoupling.md),不引入 RPC,不合入 FAV,不改 `production_ready`。
|
||||
|
||||
通信规则以 [模块开发规范](../system-design/2026-09-20-module-development-standards.md) 为准。每一批开工前另建 short-term,并在 CURRENT 认领;本文件把批次保持 `planned`。
|
||||
|
||||
## 目标
|
||||
|
||||
每一批合并后,该批声明的依赖边消失,且 `./scripts/arch-check.sh --mode block`、`go vet ./...`、`go test -short ./...` 通过。不要求七批同一周做完。
|
||||
|
||||
## 分波次计划
|
||||
|
||||
| 波次 | 内容 | 验收 |
|
||||
|------|------|------|
|
||||
| A | server 只依赖用例端口,不再持有领域具体服务与 pool 写路径 | 见批次 A |
|
||||
| B | 拆掉 chat → app 子包的反向 import | 见批次 B |
|
||||
| C | docgov 状态/角色/错误不再被当跨包协议 | 见批次 C |
|
||||
| D | workflow 定义、目录、实例、运行时的依赖改成单向 | 见批次 D |
|
||||
| E | 先拆 `coordinator/engine.go`,再按审计清单处理其余超 1000 行文件 | 见批次 E;依赖 B |
|
||||
| F | 前端 api 共用一个 fetch 封装 | 见批次 F |
|
||||
| G | 清零 YAML 里 21 条例外,U3/U4 优先 | 见批次 G |
|
||||
|
||||
A、B、C、D、F 互不阻塞,可并行,但 mutex 不得重叠,合入 `dev` 必须串行占集成槽位。E 等 B 合并后再动 `coordinator`。G 按例外自己的里程碑走,其中到期日为 2026-09-28 的条目优先于其余 path 例外。
|
||||
|
||||
### 批次 A — server 装配收口
|
||||
|
||||
- **问题**: `Server` 持有 `*bizdev.Service`、`*docgov.GovernanceEngine`、`*pgxpool.Pool` 等具体类型(`internal/server/server.go`)。
|
||||
- **做法**: handler 改为调用已有 `internal/app` 用例。领域错误到 HTTP code 的映射收进一个适配函数。新增路由不得再给 `Server` 加具体服务字段,也不得在 handler 里写非本适配层的 SQL。
|
||||
- **分支 / mutex**: `refactor/server-port-assembly` / `server-assembly`(与进行中的 `web`、`authz` 冲突时等待)。
|
||||
- **验收**: 生产 `internal/server` 不再出现 `*pgxpool.Pool` 字段;`handlers.go` 不再直接引用 `docgov.Err*`(映射函数除外,且该函数不 import 领域 SQL)。既有 HTTP 特征测试保持状态码。
|
||||
- **回滚**: 单批 revert。不改表。
|
||||
|
||||
### 批次 B — chat / app / coordinator 解环
|
||||
|
||||
- **问题**: `internal/chat/session.go` 与 `action_executor.go` import `app/chatflow`、`app/intentflow`、`app/stageflow`;`chatflow/ports.go` 又嵌入 `coordinator` 类型。
|
||||
- **做法**: 动作执行所需能力改成 chat 或 chatflow 拥有的窄端口,具体 `docgov` / `taskrun` / `coordinator` 指针留在组合根。`AssembleRequest` 不再使用 `coordinator.UserInfo` 这类对方具体结构。
|
||||
- **分支 / mutex**: `refactor/chatflow-dependency-inversion` / `chat` + `coordinator`。开工前确认这两把 mutex 没有别的 `in_progress`。
|
||||
- **验收**: `go list -f '{{.ImportPath}} {{.Imports}}'` 下 `internal/chat` 生产文件不再 import `internal/app/...`。一轮对话的现有短测试仍通过。
|
||||
- **回滚**: 单批 revert。不改事件名。
|
||||
|
||||
### 批次 C — docgov 词汇收敛
|
||||
|
||||
- **问题**: `StateDrafting`、`RoleAuthor`、`ErrDocumentBusy` 以及字符串 `"docgov.review_approve"` 出现在 coordinator、bizdev、server、chat。
|
||||
- **做法**: 跨包需要的无行为枚举进稳定词汇或调用方自己的端口错误。领域包保留不变量实现。server 只映射 typed error。禁止把 canonical 哈希或路径函数放进词汇包。
|
||||
- **分支 / mutex**: `refactor/docgov-vocabulary-boundary` / `docgov`。
|
||||
- **验收**: 审计热点 3 列出的生产引用点改为端口或词汇;`docgov` 测试仍覆盖原状态机。不改变 HTTP 错误 code。
|
||||
- **回滚**: 单批 revert。
|
||||
|
||||
### 批次 D — 工作流定义与实例单向化
|
||||
|
||||
- **问题**: `workflowdef/catalog.go` import `projectworkflow`,`validator_v2.go` import `workflow`,`projectinstance` import `workflowdef`,`workflow/runtime/orchestrator.go` import `projectinstance`。
|
||||
- **做法**: 共享的无行为定义类型留在 `workflowdef` 或词汇;catalog 与 runtime 通过端口读定义,不反向 import 实例包。先画允许的依赖方向再改 import,避免为解环再套一层子包。
|
||||
- **分支 / mutex**: `refactor/workflow-definition-direction` / `workflow-def`。若 rdev 模板任务占用同一 mutex,本批等待。
|
||||
- **验收**: 依赖方向写成 YAML allowlist 的收紧(只删边,不放开新边)。工作流校验与门禁短测试通过。
|
||||
- **回滚**: 单批 revert。不改已发布工作流 JSON 的键。
|
||||
|
||||
### 批次 E — 巨型文件拆分
|
||||
|
||||
- **依赖**: 批次 B 已合并。否则拆 `engine.go` 会把逻辑环复制到新文件。
|
||||
- **顺序**: `internal/coordinator/engine.go`(1844 行)→ `internal/bizdev/service.go` → `internal/server/handlers.go`。其余超过 1000 行的文件各一批,不在同一次提交里“全部拆完”。
|
||||
- **做法**: 按用例搬文件,不改行为。新文件 ≤ 800 行。不借拆分改 SQL 或事件。
|
||||
- **分支 / mutex**: `refactor/split-coordinator-engine` 起,mutex 与被拆包一致。
|
||||
- **验收**: 搬迁前后该包 `go test -short` 同绿;无新的跨模块 import。
|
||||
- **回滚**: 按文件批次 revert。
|
||||
|
||||
### 批次 F — 前端统一 API client
|
||||
|
||||
- **问题**: `web/src/api/` 各文件自行 `fetch`,错误处理与鉴权头重复。
|
||||
- **做法**: 一个小封装负责 base URL、鉴权头、typed error envelope 解析和有限重试。各域文件改为调用它,不改路径与请求体。预览器里的 `fetch` 若只取静态资源,可以后迁,但要在本批 short-term 里点名留下的文件。
|
||||
- **分支 / mutex**: `refactor/web-api-client` / `web`。
|
||||
- **验收**: `web` 下 `npm test` 与 `npm run build` 通过。抽一条 chat 与一条 docgov 请求,失败时仍走到现有错误卡,而不是未捕获 rejection。
|
||||
- **回滚**: 单批 revert。无后端变更。
|
||||
|
||||
### 批次 G — 例外清零
|
||||
|
||||
不在本计划里改 `module-boundaries.yaml`。开工时按到期日处理,禁止只改 `expires` 而不迁代码。
|
||||
|
||||
| 组 | 到期 | 内容 | mutex |
|
||||
|----|------|------|-------|
|
||||
| G1 | 2026-09-28 | 4 条 U3 `sql_write`(`docduty`/`docrevision` 写 `document_records` 与 `freeform_documents`)+ 2 条 U4 `path`(server / docrevision 的 `output.md`) | `docgov` |
|
||||
| G2 | 2026-10-12 | 14 条 U5 `path`(agent、bizdev、coordinator、docgov、storage) | 按文件所属包,一次一个包 |
|
||||
| G3 | 2026-10-26 | `projectinstance` 写 `task_runs` | `taskrun` + `projectinstance` |
|
||||
|
||||
G1 若在到期日前无法合并,必须另写 audit:要么延长并给出新的移除里程碑,要么让 arch-check 在到期后失败并停写。两种选择都要留在 ops,不能沉默。
|
||||
|
||||
- **验收**: 对应 exception 从 YAML 删除,`baseline_counts` 下降,`arch-check --mode block` 通过,行为测试覆盖原来那条写入或读路径。
|
||||
- **回滚**: 恢复 exception 条目的提交必须与代码回滚成对,避免门禁与代码错位。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [ ] 每一批有独立 short-term、CURRENT 认领、测试记录;本文件不代替那些记录。
|
||||
- [ ] 未开始的批次在 FEATURE-MATRIX 保持 `planned`。
|
||||
- [ ] 任一批不得把 FAV live、`production_ready` 或 RPC 拆分写进自己的完成定义。
|
||||
- [ ] 合入 `dev` 时集成槽位为该批 holder,冒烟包含 `arch-check`、`go vet`、`go test -short`。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: [../audit/2026-09-20-module-coupling-audit.md](../audit/2026-09-20-module-coupling-audit.md)
|
||||
- Short-term(本轮文档任务): [../ops/short-term/2026-09-20-module-decoupling-spec-audit.md](../ops/short-term/2026-09-20-module-decoupling-spec-audit.md)
|
||||
- 规范: [../system-design/2026-09-20-module-development-standards.md](../system-design/2026-09-20-module-development-standards.md)
|
||||
- gap-matrix 行: 无。本计划不是发布 blocker,不新增 gap 行。
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: "2026-09-20 P0 热修整改方案"
|
||||
status: done
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
---
|
||||
|
||||
# 2026-09-20 P0 热修整改方案
|
||||
|
||||
## 背景
|
||||
|
||||
链到 [audit](../audit/2026-09-20-system-triage-audit.md)。`production_ready=yes` 不变;本方案关闭现场 critical,不自动回退门禁。
|
||||
|
||||
## 目标
|
||||
|
||||
1. 迁移链连续:capability 分支合入,`00054`→`00058`,dev schema=58,`chat_summaries` 可持久化
|
||||
2. 三项 IDOR 负例 403;真实双用户 curl PASS
|
||||
3. taskrun channel 竞态不再 panic;同步 chat 取 `execMu`;关键 goroutine 有 recover;math XSS 转义
|
||||
4. backup/push 脚本不再硬编码/暴露凭证;main DB 口令已轮换且健康
|
||||
|
||||
## 分波次计划
|
||||
|
||||
| 波次 | 分支 | 内容 | 验收 |
|
||||
|------|------|------|------|
|
||||
| Wave 0 | `docs/p0-triage-2026-09-20` | 审计/整改/short-term/CURRENT/long-term | 文档入库 |
|
||||
| Wave 1 | `fix/capability-merge-00058-2026-09-20` | merge capability + 重编号 00058 + rebuild | health schema=58;表存在 |
|
||||
| Wave 2 | `fix/authz-idor-hotfixes-2026-09-20` | 三项越权 + 负例测试 | curl 403 ×3 |
|
||||
| Wave 2b | `fix/runtime-panic-races-2026-09-20` | panic/race/recover/XSS | `-race` + npm test |
|
||||
| Wave 3 | `fix/credential-hardening-2026-09-20` | 脚本加固 + main 口令轮换 | 旧口令失败、新口令成功;ps 无 token |
|
||||
| Wave 4 | `docs/p0-closeout-2026-09-20` | 测试报告 + gap-matrix 收口 | 报告七段齐全 |
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] `curl :8080/health` → `schema_version=58`;`chat_summaries` 存在
|
||||
- [x] 偏好跨用户写 / 他人 session 读 / 空 session 重分类 → 403 或 400
|
||||
- [x] `go test -race` taskrun/chat/server short PASS;math XSS 单测 PASS
|
||||
- [x] backup 脚本无硬编码口令;push 不把 token 放 URL
|
||||
- [x] main health 恢复;旧口令无法登录
|
||||
- [x] 测试报告归档;CURRENT 槽位 idle;不改 `production_ready`
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不做 dev→test→main 晋升 / main 分支追平(backlog)
|
||||
- 不升 `MULTI_INTENT_PLAN_TIER` / 不启用 FAV live / 不启 SEMANTIC_SUMMARY_REPLACE
|
||||
- medium/low 约 25 项仅记 long-term
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: [../audit/2026-09-20-system-triage-audit.md](../audit/2026-09-20-system-triage-audit.md)
|
||||
- Short-term: [../ops/short-term/2026-09-20-p0-hotfixes.md](../ops/short-term/2026-09-20-p0-hotfixes.md)
|
||||
- gap-matrix 行: 收口时追加「2026-09-20 P0 现场问题」
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
| 文档 | 说明 |
|
||||
|------|------|
|
||||
| [2026-09-20-module-decoupling-batch-plan.md](./2026-09-20-module-decoupling-batch-plan.md) | 耦合残留分批 A–G(server 装配、逻辑环、docgov 词汇、工作流依赖、巨型文件、前端 client、例外清零);保持 planned,不改代码。配套 [审计](../audit/2026-09-20-module-coupling-audit.md) · [规范](../system-design/2026-09-20-module-development-standards.md) |
|
||||
| [2026-09-20-p0-remediation-plan.md](./2026-09-20-p0-remediation-plan.md) | 系统体检 P0:迁移 00058、三项 IDOR、panic/race/XSS、凭证与口令轮换;配套 [审计](../audit/2026-09-20-system-triage-audit.md) |
|
||||
| [2026-09-20-capability-enablement-impact-plan.md](./2026-09-20-capability-enablement-impact-plan.md) | 多意图、语义摘要、PI 变更叙事等能力的真实启用门槛,以及项目级需求/风险/接口/测试追踪索引和文档修改影响闭环方案;配套 [调研](../ops/research/2026-09-20-capability-enablement-impact-research.md) |
|
||||
| [2026-09-17-system-health-remediation-plan.md](./2026-09-17-system-health-remediation-plan.md) | 系统体检整改:Wave0–7(SSE/缓存 P0 → main ENV → 配置对齐 → 测试债 → 隐患 → 死代码决策 → 文档漂移 → roadmap);配套 [审计](../audit/2026-09-17-system-health-check.md) |
|
||||
| [2026-09-17-document-author-only-plan.md](./2026-09-17-document-author-only-plan.md) | 编制人兼任审核/批准:两级授权、`duty_policy=author_only`、U1–U6 实现已收口;默认 off;变更提案 HTTP 另立([audit](../audit/2026-09-17-docgov-modification-proposal-http-gap.md)) |
|
||||
| [gap-matrix.md](./gap-matrix.md) | 发布缺口 SSOT |
|
||||
|
||||
@@ -94,3 +94,17 @@
|
||||
```
|
||||
|
||||
**结论**: 发布门禁四框已签。文档账本运行时 UI Round20 **PASS**;`CHAT-INTENT-STATE` 双标签 busy **PASS**;`DEMO-DB-SEED` **PASS**;BUG-08 **PASS**。`-race` TempDir flake 与 U9–U12 / 软件自举 / FAV / 完整 PI change-report 叙事不挡首发。不得把 fallback change report 写成完整 PI 叙事。
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-20 P0 现场问题(同日收口)
|
||||
|
||||
| ID | 描述 | 状态 | 证据 |
|
||||
|---|---|---|---|
|
||||
| P0-MIG | 00054 空洞 + chat_summaries 静默失败 | **PASS** | 重编号 `00058`;dev/main health schema=58;[报告](../test-reports/2026-09-20-p0-hotfixes-test-report.md) |
|
||||
| P0-IDOR | 偏好写 / session 项目读 / 重分类越权 | **PASS** | 单元 + 真实 curl 403/400;同上报告 |
|
||||
| P0-PANIC-RACE | taskrun closed-channel panic + 同步 chat 无锁 | **PASS** | 持锁 fanout;`WithExecLock`;`-race` Subscribe 测试 |
|
||||
| P0-XSS | math 错误分支未转义 | **PASS** | BlockEditorModal/MathBlockView + escapeHtml 单测 |
|
||||
| P0-CRED | backup 硬编码口令 + push URL token + 生产口令轮换 | **PASS** | 脚本无硬编码;docker 网旧口令 FATAL、新口令 OK;main health ok |
|
||||
|
||||
> 不改 `production_ready`。main **git 分支**对齐仍为 backlog(T20-I7);环境库已随 rebuild 至 schema 58。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 模块与功能完成度(SSOT)
|
||||
|
||||
**更新**: 2026-09-19(审计整改批 1–4 已合入 dev;medium/low 见 [long-term](../ops/long-term/2026-09-19-audit-remainder.md))
|
||||
**更新**: 2026-09-20(模块开发规范与耦合审计已合入文档;批次 A–G 仍为 planned,不改 `production_ready`)
|
||||
**production_ready**: yes(权威来源:[gap-matrix](../remediation/gap-matrix.md);本表不推导发布门禁)
|
||||
**发布缺口**: [../remediation/gap-matrix.md](../remediation/gap-matrix.md)
|
||||
**协作焦点**: [../ops/CURRENT.md](../ops/CURRENT.md)
|
||||
@@ -50,10 +50,10 @@
|
||||
| 模块 | 声明范围 | 状态 | 发布关系 | 证据 | 剩余工作 / 关闭条件 | mutex |
|
||||
|------|----------|------|----------|------|---------------------|-------|
|
||||
| 意图识别 L1 | 18 类 Intent、三分支消解、写/只读分流、双标签 `DOC_BUSY`、intent 纯依赖边界 | done | non_blocker | [intent-recognition](../system-design/intent-recognition/);[审计](../audit/2026-09-13-conversation-intent-runtime-state.md);[报告](../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md);[双标签](../test-reports/assets/2026-09-15-conversation-intent-dual-tab/live.json);[U1](../test-reports/2026-09-15-multi-intent-u1-contracts-test-report.md)–[U3](../test-reports/2026-09-15-multi-intent-u3-intentflow-pg-test-report.md) | **边界 before**:含 U9–U12 叙事混入 → **after**:U9–U12 迁至「多意图扩面」行。关闭:纯依赖边界回归即重开 | `intent` |
|
||||
| 多意图持久计划(U1–U8 基线) | app/intentflow 生命周期、HITL、默认 `legacy`、U1–U8 代码与安全基线 | done | non_blocker(默认 legacy) | [设计](../system-design/2026-09-15-multi-intent-hitl-plan.md);[U1](../test-reports/2026-09-15-multi-intent-u1-contracts-test-report.md)–[U8](../test-reports/2026-09-16-multi-intent-u8-task-generate-test-report.md);[Wave2 真 PI](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md) | U8 已签。**Playwright 双标签**:真浏览器 PASS 已合入([报告](../test-reports/2026-09-16-intent-plan-playwright-dual-tab-test-report.md));升 `confirm/full` 另开 | `intent-plan` |
|
||||
| 多意图扩面(U9–U12) | U9 LLM 分段实验;U10 mutate;U11 docgov;U12 workflow/run-control | done | deferred_enhancement | [设计](../system-design/2026-09-15-multi-intent-hitl-plan.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[脚手架](../test-reports/2026-09-16-pu8-u9-u12-flags-test-report.md);[U9](../test-reports/2026-09-17-w4-u9-segment-test-report.md);[U10](../test-reports/2026-09-17-w4-u10-mutate-test-report.md);[U11](../test-reports/2026-09-17-w4-u11-docgov-test-report.md);[U12](../test-reports/2026-09-17-w4-u12-run-control-test-report.md) | **before**:独立 flag 脚手架。**after**:U9 可开 flag 走产品 PI proposer(规则已切则不出 proposal);U10–U12 分 flag dry-run→confirm 证据。**未升** `MULTI_INTENT_PLAN_TIER`(升 `confirm` 另开授权;永不默认 `full`)。U10–U12 领域 live 写仍须专项批准 | `intent-plan` |
|
||||
| 多意图持久计划(U1–U8 基线) | app/intentflow 生命周期、HITL、默认 `legacy`、U1–U8 代码与安全基线 | partial | non_blocker(默认 legacy) | [设计](../system-design/2026-09-15-multi-intent-hitl-plan.md);[U1](../test-reports/2026-09-15-multi-intent-u1-contracts-test-report.md)–[U8](../test-reports/2026-09-16-multi-intent-u8-task-generate-test-report.md);[Wave2 真 PI](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md);[2026-09-20 复核](../ops/research/2026-09-20-capability-enablement-impact-research.md) | legacy 有限只读多意图仍默认启用;新持久计划生产组合根仍使用 Fake query owner,confirm 后缺可靠调度,typed 参数/目标版本不足。原 U1–U8 测试证据保留,但不足以证明升 `auto_read/confirm` 可用。关闭条件见[整改方案](../remediation/2026-09-20-capability-enablement-impact-plan.md) Foundation 1 与 Track I | `intent-plan` |
|
||||
| 多意图扩面(U9–U12) | U9 LLM 分段实验;U10 mutate;U11 docgov;U12 workflow/run-control | partial | deferred_enhancement | [设计](../system-design/2026-09-15-multi-intent-hitl-plan.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[脚手架](../test-reports/2026-09-16-pu8-u9-u12-flags-test-report.md);[U9](../test-reports/2026-09-17-w4-u9-segment-test-report.md);[U10](../test-reports/2026-09-17-w4-u10-mutate-test-report.md);[U11](../test-reports/2026-09-17-w4-u11-docgov-test-report.md);[U12](../test-reports/2026-09-17-w4-u12-run-control-test-report.md);[2026-09-20 复核](../ops/research/2026-09-20-capability-enablement-impact-research.md) | U9 proposer 已实现和注入但未进入生产聊天分段调用;提议请求已带 reasoning profile。U10–U12 当前为 dry-run/validated-only adapter。历史直接调用/PI 测试继续有效,不代表 live 接线。逐域实现和验收,禁止以 `full` 一次放量 | `intent-plan` |
|
||||
| 对话 / ctxmgr baseline | 多轮上下文、刷新/重登/重启恢复、授权同集正文与计数、U10 端口化停止扩面 | done | non_blocker | [multi-turn](../system-design/multi-turn-dialogue/);[刷新审计](../audit/2026-09-13-chat-history-refresh-disappears.md);[U10](../test-reports/2026-09-15-chatlog-contextasm-u10-test-report.md);[门禁 B3](../test-reports/2026-09-16-chat-refresh-gate-test-report.md)(项目 6359) | **before**:语义摘要误标 D5 混入 → **after**:摘要迁「语义摘要 D3」;D7 数据治理独立。U10 停止扩面 | `chat` |
|
||||
| 语义摘要(D3) | 授权后可见集合上的语义摘要;shadow → 可选替换 deterministic | done | deferred_enhancement | [chat-agent-p6-backlog](../backlog/chat-agent-p6-backlog.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[脚手架](../test-reports/2026-09-16-pu6-semantic-summary-test-report.md);[W2 真 PI](../test-reports/2026-09-17-w2-semantic-summary-shadow-test-report.md) | **before**:flag 脚手架 + heuristic。**after**:dev 可开 `SEMANTIC_SUMMARY_SHADOW` 走产品 PI no-tool summarizer(默认 off)。**REPLACE 未启用**(独立后置,不在本行关闭条件内) | `chat` |
|
||||
| 语义摘要(D3) | 授权后可见集合上的语义摘要;shadow → 可选替换 deterministic | partial | deferred_enhancement | [chat-agent-p6-backlog](../backlog/chat-agent-p6-backlog.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[脚手架](../test-reports/2026-09-16-pu6-semantic-summary-test-report.md);[W2 真 PI](../test-reports/2026-09-17-w2-semantic-summary-shadow-test-report.md);[2026-09-20 复核](../ops/research/2026-09-20-capability-enablement-impact-research.md) | shadow 默认 off。`00058` 增加 `chat_summaries`,写入失败不再伪装成功;运行中的库仍是 schema 53。摘要请求已带 `tool_profile=reasoning`(argv 为 `--no-tools`),当前容器要等镜像或 dev 挂载更新后才生效。授权可见集 digest 仍空。`SEMANTIC_SUMMARY_REPLACE` 未接线。 | `chat` |
|
||||
| 对话数据治理(D7) | 留存/删除口径、库·备份·日志控制、敏感字段加密边界 | deferred | deferred_enhancement(违规则升 blocker) | [计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) Scope Boundaries;[收口 §7.1](../remediation/2026-09-16-partial-deferred-completion-plan.md);[D7 ADR 草案](../adr/2026-09-17-d7-chat-data-retention.md);[W7 盘点](../audit/2026-09-17-d7-data-inventory.md);[报告](../test-reports/2026-09-17-w7-d7-inventory-test-report.md) | **after W7**:只读盘点完成(sessions/messages/KB/日志/备份/event)。**未发现**已确认基线违规,未写 gap-matrix。口径仍 `pending-compliance-signoff`;禁止按 365/180/30 物理删除。本行不升 done | `chat` |
|
||||
| 智能体小队 | 角色-任务-工作区-黑板 | done | non_blocker | [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` |
|
||||
| 工作流治理 | 三正式工作流、设置页/DutyMode、动作级鉴权、真实 PI 三工作流 E2E、full/none 混合长链 | done | non_blocker | [三工作流整改](../remediation/2026-09-12-three-workflows-strict-governance-remediation.md);[409/职责](../test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md);[鉴权](../test-reports/2026-09-14-governance-action-level-authz-test-report.md);[PI E2E](../test-reports/2026-09-16-pi-three-workflow-e2e-test-report.md);[Wave2 full/none](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md) | full 跨用户审批 + none 免审批不阻塞已签。纯软件自举仍独立 planned | `workflow` |
|
||||
@@ -61,14 +61,16 @@
|
||||
| 纯软件项目自举 | 软件项目创建、Bootstrap、Delivery、受控工程交接 | partial | deferred_enhancement(明确不挡首发) | [设计](../system-design/2026-09-14-software-project-bootstrap-workflow.md);[ADR](../adr/2026-09-16-software-project-bootstrap-keys.md);[L1 报告](../test-reports/2026-09-16-software-project-bootstrap-test-report.md);[W5a](../test-reports/2026-09-17-w5a-software-bootstrap-ui-pi-test-report.md) | **before**:L1 + UI 仍克隆医疗模板。**after W5a**:catalog 驱动创建、软件不挂医疗 key、docs_only 真 PI 建议 delivery 且不自动激活。**SWBOOT-10 仍 stub**(W5b);本行不升 done | `workflow-design` |
|
||||
| IAM / 鉴权 | 项目级 API 鉴权 + RBAC;会话/阶段授权 | done | 加固 | [v3 full inventory](../audit/authorization-matrix-v3-full.md);[session 中断](../test-reports/2026-09-16-iam-route-inventory-test-report.md);[fail-closed](../test-reports/2026-09-16-wave1-iam-fail-closed-test-report.md);[410 策略](../audit/2026-09-16-bug11-410-retire-decision.md);[R13](../audit/2026-09-16-r13-data-safety-checklist.md) | 全路由 inventory + session 中断负例 + 410 冻结 + R13 基线已签 | `authz` |
|
||||
| 文档治理 | 法定文档生命周期 + 租约 + 受控正文读取 | done | non_blocker | [docgov](../test-reports/2026-09-08-docgov-lifecycle-and-claiming-framework-test-report.md);[正文 UI](../test-reports/2026-09-14-controlled-content-ui-acceptance.md);[canonical hash](../remediation/2026-09-14-controlled-content-canonical-hash-remediation.md) | 项目 143 只读;不终止 | `docgov` |
|
||||
| 文档版本 baseline | 账本、人工修订、确定性 diff+lineage、运行时 UI、负责人通知 | done | non_blocker | [管理](../test-reports/2026-09-13-document-revision-management-test-report.md);[Round20 UI](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[ADR](../adr/2026-09-13-document-version-boundary.md) | **before**:完整 PI narrative 混入 → **after**:迁「PI change-report 叙事」。fallback 报告是本行内显式行为,不是缺口 | `docgov` |
|
||||
| PI change-report 叙事 | 只读消费 diff+lineage 的 PI 叙事;失败全量降级 fallback | done | deferred_enhancement | [Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu7](../ops/long-term/2026-09-16-pu7-pi-narrative-contract.md);[脚手架](../test-reports/2026-09-16-pu7-pi-narrative-test-report.md);[W3 真 PI](../test-reports/2026-09-17-w3-pi-change-report-narrative-test-report.md) | **before**:flag 脚手架 + 仅 fallback。**after**:dev 可开 `PI_CHANGE_REPORT_NARRATIVE` 走产品 PI no-tool narrator(默认 off)。digest 绑定;畸形/超时全量 fallback。**不把 fallback 写成完整 PI** | `docgov` |
|
||||
| 文档版本 baseline | 账本、人工修订、确定性 diff+lineage、运行时 UI、负责人通知 | done | non_blocker | [管理](../test-reports/2026-09-13-document-revision-management-test-report.md);[Round20 UI](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[ADR](../adr/2026-09-13-document-version-boundary.md);[proposed/authoritative](../ops/short-term/2026-09-20-proposed-authoritative-reports.md) | **before**:完整 PI narrative 混入 → **after**:迁「PI change-report 叙事」。fallback 报告是本行内显式行为,不是缺口。lineage GET 已按 URL 项目和文档可见性裁剪。test_manager 血缘的下游/上游版本改读文档版本,不再写死 1。Agent 候选报告为 `proposed`,正式提交才写 authoritative 后继并挂到版本;拒绝、替代后旧报告不能再出建议。人工修订、导入和聊天卡仍未分开预估与正式报告。项目追踪索引见整改方案 Track T | `docgov` |
|
||||
| PI change-report 叙事 | 只读消费 diff+lineage 的 PI 叙事;失败全量降级 fallback | partial | deferred_enhancement | [Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu7](../ops/long-term/2026-09-16-pu7-pi-narrative-contract.md);[脚手架](../test-reports/2026-09-16-pu7-pi-narrative-test-report.md);[W3 真 PI](../test-reports/2026-09-17-w3-pi-change-report-narrative-test-report.md);[2026-09-20 复核](../ops/research/2026-09-20-capability-enablement-impact-research.md);[最小化输入](../ops/short-term/2026-09-20-pi-narrative-clipped-diff.md) | flag 默认 off。`facts.json` 含截断后的 hunk 前后文和影响说明,以及完整 hunk/impact 计数与省略数;摘要 digest 仍不含正文。叙事请求已带 `tool_profile=reasoning`。运行中的 runner 尚未切到 `--no-tools`。不打开开关 | `docgov` |
|
||||
| 前端工作台 | 三栏 + 块文档 + SSE;错误卡/进度/busy;版本冲突信封;demo seed 默认关;终止 preview | done | non_blocker | [workbench](../test-reports/2026-09-08-three-column-workbench-and-block-document-test-report.md);[双标签](../test-reports/assets/2026-09-15-conversation-intent-dual-tab/screenshots/tab-b-busy.png);[demo](../test-reports/2026-09-16-demo-seed-pollution-test-report.md);[B4](../test-reports/2026-09-16-frontend-gate-b4-test-report.md)(项目 6363) | **before**:空「缺口」却 partial → **after**:本行 done。其他 409 消费方信封复用另列 hardening backlog | `web` |
|
||||
| PI Runner / 配置链 | pi-agent + MiniMax + typed-result-v1 | done | non_blocker | [piagent](../test-reports/2026-09-13-codex-audit-p0-remediation-test-report.md);[container-env](../test-reports/2026-09-13-container-env-configuration-test-report.md);[typed-result](../test-reports/2026-09-15-pi-typed-result-v1-test-report.md) | — | `pi-agent` |
|
||||
| PI Runner / 配置链 | pi-agent + MiniMax + typed-result-v1 | done | non_blocker | [piagent](../test-reports/2026-09-13-codex-audit-p0-remediation-test-report.md);[container-env](../test-reports/2026-09-13-container-env-configuration-test-report.md);[typed-result](../test-reports/2026-09-15-pi-typed-result-v1-test-report.md) | 文档生成仍使用读写和搜索工具。`tool_profile=reasoning` 的 argv 是 `--no-tools` 且不加载搜索扩展;未知 profile 拒绝启动。dev 挂载了 `pi-args.mjs`,但本轮未重启容器 | `pi-agent` |
|
||||
| 三环境运维 | dev/test/main + 共享 KB;对话/业务库隔离 | done | non_blocker | [PROJECT.md](../../PROJECT.md) §4;CURRENT 环境快照 dev/test schema **48**、main **47** | — | `infra` |
|
||||
| CI / E2E | PR CI、PG 集成、治理 PG、已签真实 PI 门禁;**nightly** schedule/`workflow_dispatch` + infra/product 分类 receipt | done | 加固(阻止**下一次**晋升,不自动否定已发布) | [BUG-08](../test-reports/2026-09-16-ci-governance-pg-bug08-test-report.md);[PI 三工作流](../test-reports/2026-09-16-pi-three-workflow-e2e-test-report.md);[Wave2B](../test-reports/2026-09-16-wave2b-nightly-promotion-receipt-test-report.md);[Wave2C](../test-reports/2026-09-16-wave2c-same-image-digest-test-report.md);[W1 green](../test-reports/2026-09-17-w1-ci-e2e-green-nightly-test-report.md) + [receipt `6e2476f0…`](../assets/promotion-receipts/6e2476f0f2e408e111fe06ca7c31a38294a340b3.json) | **before**:partial(FullNone product_fail / secrets 文案过时)→ **after**:secrets 已配;duplicate goose 00048 已清;FullNone+U8 nightly `verdict=pass` | `ci` |
|
||||
| Artifact 同 digest 晋升 | 候选 commit 一次构建、按 digest 晋升、promotion receipt | done | 加固 | [计划 PU5B](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md);[Wave2B](../test-reports/2026-09-16-wave2b-nightly-promotion-receipt-test-report.md);[Wave2C](../test-reports/2026-09-16-wave2c-same-image-digest-test-report.md) | **关闭**:same-image pin(`candidate-images-*` + `PINNED_IMAGE_MODE` + promote `--require-digests`)。**声明**:单机 retag/digest pin;远程 registry 推送另立任务 | `infra` |
|
||||
| 可靠事件核心 | PG dispatcher、notify/advance/projection live、生产闭包 hook 退出、Phase2 选择性解耦已合入 | done | non_blocker | [E0A–E2](../test-reports/2026-09-15-event-e0a-production-scope-contract-test-report.md) 等;[复盘](../ops/research/2026-09-15-track-e-retrospective.md);[shared live](../test-reports/2026-09-15-event-notify-shared-live-test-report.md);[phase2 closeout](../test-reports/2026-09-15-phase2-closeout-test-report.md) | **before**:与 FAV off 混成 partial → **after**:FAV 独立行。选择性后续解耦按收益触发 | `architecture-docs` / `events` |
|
||||
| 模块开发规范 | 窄端口、领域事件、wire DTO 三种契约;故障隔离红线;新增模块/表/事件流程。不含批次 A–G 的代码整改 | done | non_blocker | [规范](../system-design/2026-09-20-module-development-standards.md);[审计](../audit/2026-09-20-module-coupling-audit.md);[ADR](../adr/2026-09-14-modular-monolith-decoupling.md) | 文档入口已立。代码整改不在本行 | `module-decoupling-spec` |
|
||||
| 模块解耦批次 A–G | server 端口装配、chat 解环、docgov 词汇、工作流单向依赖、巨型文件、前端 api client、21 条例外清零 | planned | non_blocker | [分批计划](../remediation/2026-09-20-module-decoupling-batch-plan.md);[审计](../audit/2026-09-20-module-coupling-audit.md) | 各批独立 short-term 与验收后另拆行升 `done`。G1 例外 2026-09-28 到期,到期前须迁走或书面延期。禁止把本行标成进行中来代表七批都已开工 | `module-decoupling-spec` |
|
||||
| Final Artifact Vault(FAV) | 不可变终态制品库;`FAV_DEGRADED_READ=false` | partial | deferred_enhancement | [Track E 复盘](../ops/research/2026-09-15-track-e-retrospective.md);[U7 报告](../test-reports/2026-09-16-fav-u7-incremental-test-report.md);[W6 shadow](../test-reports/2026-09-17-w6-fav-subscriber-shadow-test-report.md);[short-term](../ops/short-term/2026-09-17-w6-fav-subscriber-shadow.md) | **after W6**:subscriber `ObserveShadow` 只计算 intended outcome,不写副作用。仍**禁止**整支 merge;`FAV_DEGRADED_READ` 默认 false;**live 未放量**(staging→artifact→publication 各 ≥7 天观察窗) | `events` |
|
||||
| 系统管理台 | 全屏系统级管理视图(总览/KB/特性开关/系统设置/工作流/角色/用户/文档 8 分组);`/api/v1/admin/system/*`;`system_settings` 白名单可写;吸收下线 AdminSettingsModal | done | non_blocker | [short-term](../ops/short-term/2026-09-17-system-admin-console.md);[测试报告](../test-reports/2026-09-17-system-admin-console-test-report.md);commit `f1404d5`/`0eaca61`、merge `dc7c31e`(dev);dev 冒烟 schema 49 + 四端点 + 写读回环 PASS | 二期:Playwright 实跑、细粒度 `system:*` 权限、设置审计日志、KB 运维动作、白名单项接消费方 | `web` + `sysadmin` |
|
||||
| 个人工程中控台(已移出) | 原本地只读看板与后来的 Control Center 都不再属于本仓库 | removed | 进度管理改由独立项目承担 | [历史设计](../archive/design/2026-09-17-personal-engineering-control-center-plan.md);[历史报告](../test-reports/2026-09-17-engineering-dashboard-test-report.md) | 2026-09-19 删除 `cmd/control-center`、`internal/controlcenter`、`control-center/web`、`deploy/control-center`。不恢复 `engineering-dashboard` | — |
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
---
|
||||
title: "模块开发规范:通信契约、接口与故障隔离"
|
||||
status: active
|
||||
created: 2026-09-20
|
||||
updated: 2026-09-20
|
||||
---
|
||||
|
||||
# 模块开发规范:通信契约、接口与故障隔离
|
||||
|
||||
> 本文件是开发者入口,不是新的架构 SSOT。
|
||||
> 决策仍以 [模块化单体 ADR](../adr/2026-09-14-modular-monolith-decoupling.md) 为准。
|
||||
> 机器强制仍以 [module-boundaries.yaml](./module-boundaries.yaml) 与 `./scripts/arch-check.sh --mode block` 为准。
|
||||
> 影响面守则不在此重复,见 [partial-deferred 计划 §2](../remediation/2026-09-16-partial-deferred-completion-plan.md)。
|
||||
|
||||
2026-09-20 确认:继续模块化单体。模块之间用进程内窄端口或 PostgreSQL 领域事件通信。不新增通用 IPC/RPC,不拆微服务。跨进程只允许两类既有边界:HTTP(Web↔server、server↔PI Runner)和 `cmd/events` 经 PG lease 消费。
|
||||
|
||||
## 1. 问题必须停在本模块
|
||||
|
||||
一次故障只允许表现为下面之一,不允许连带改第二个领域包才能编译或才能回滚数据:
|
||||
|
||||
| 故障位置 | 允许看见的影响 | 禁止 |
|
||||
|----------|----------------|------|
|
||||
| 领域不变量 | 本包返回 typed error;同一 UnitOfWork 回滚 | 别的领域包 import 本包实现后自行改表 |
|
||||
| 用例编排 | 组合根换一个端口实现 | handler 直接 new 领域服务或拿 `*pgxpool.Pool` 写别人的表 |
|
||||
| 异步副作用 | 该消费者 delivery 重试、死信或 quarantine | 一个消费者失败卡住其他消费者,或在持锁时调用 LLM/HTTP |
|
||||
| 对外协议 | server 把领域错误映射成固定错误信封 | 把 SQL、路径、prompt、正文放进 HTTP message |
|
||||
|
||||
静态底线已经在门禁里:领域实现互不 import(消费端口和稳定词汇除外)、每张表一个写者、每个事件名有生产者/消费者 allowlist。
|
||||
|
||||
## 2. 三种通信契约
|
||||
|
||||
只允许这三种。新增第四种(包括模块间 gRPC、进程内全局 bus 单例、跨包直接调未导出帮助函数)先写 ADR。
|
||||
|
||||
### 2.1 进程内窄端口
|
||||
|
||||
消费者拥有接口,组合根注入实现。参照 `internal/app/chatflow/ports.go`:接口只表达这一个用例要的能力。
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| 谁定义 | 调用方包,不放在被调用的领域包里“顺便导出” |
|
||||
| 宽度 | 一个用例一组方法。三个以上消费者语义相同时才提升为公共端口 |
|
||||
| 禁止万能接口 | 不得出现聚合所有模块方法的 `Store` / `Engine` 门面 |
|
||||
| 禁止传输细节 | 端口结构体不带 JSON tag,不返回 `http.Response`、SQL 行、`pgx.Tx` |
|
||||
| 身份 | `Principal` 只来自已认证会话或服务身份,不从请求体覆盖 UserID/ProjectID |
|
||||
| 装配 | 只有 `internal/app` 与 `cmd/*` 构造实现。`internal/server` 只拿用例或端口 |
|
||||
|
||||
### 2.2 领域事件(跨进程总线)
|
||||
|
||||
生产路径是 PostgreSQL outbox + `cmd/events` worker(`FOR UPDATE SKIP LOCKED`),不是内存 `MemoryBus`。`MemoryBus` 只用于 dispatcher 特征测试。
|
||||
|
||||
契约只有一处运行时副本:`internal/events/registry.go` 的 `StaticContracts()`,并且必须与 YAML 的 event 段 parity。未登记的事件名或消费者在构建期失败。`fav.artifact_staged` 保持 `Enabled: false`,直到独立 FAV 计划放量。
|
||||
|
||||
信封至少包含:`event_id`、`event_name`、`schema_version`、`environment`、`project_id`、aggregate 标识与版本、`actor_ref`、`correlation_id` / `causation_id`、`idempotency_key`、`payload_digest`、`occurred_at`。
|
||||
|
||||
事件不得携带 secret、token、prompt、正文或绝对路径。大 payload 先冻结为不可变引用,事件只留 digest。
|
||||
|
||||
投递是至少一次。消费者用唯一键或 inbox receipt 保证对外只看见一次结果。副作用与 receipt 能进同一数据库事务的必须同事务。永久失败进 dead letter,不得阻塞其他订阅者。
|
||||
|
||||
### 2.3 对外 wire DTO
|
||||
|
||||
HTTP/SSE 的请求响应只存在于 `internal/server`(及 `internal/stream` 的传输类型)。领域包不 import server。
|
||||
|
||||
错误信封沿用已合入的 typed envelope:`code` / `message` / `request_id` / 可选 `details`。`message` 用固定安全文案;`details` 只允许该 code 的公开字段。授权拒绝不得泄露资源是否存在。
|
||||
|
||||
PI Runner 继续 typed-result-v1。typed 字段存在但校验失败必须 fail closed,不得降级成旧解析。
|
||||
|
||||
## 3. 输入与输出
|
||||
|
||||
### 3.1 新增或修改端口时的 checklist
|
||||
|
||||
- [ ] 接口放在消费者用例包,方法名是业务动作而不是表操作。
|
||||
- [ ] 入参是该动作的命令/查询结构;出参是结果或本用例的 typed error。
|
||||
- [ ] 无 JSON tag,无 `pgx` 类型,无物理路径,无另一领域包的具体 struct(稳定词汇除外)。
|
||||
- [ ] 错误值留在领域包或用例包;server 只做 `errors.Is` 到 HTTP code 的映射,映射表集中在一处,不散落在每个 handler。
|
||||
- [ ] 组合根测试用假实现替换端口,不 import 对方的 SQL。
|
||||
|
||||
### 3.2 新增事件时的 checklist
|
||||
|
||||
- [ ] `event_name` 形如 `<aggregate>.<fact>`,表达已发生的事实,不是命令。
|
||||
- [ ] `schema_version` 从 1 起;破坏性字段变更升版本,未知 major fail closed。
|
||||
- [ ] payload 字段写入 `StaticContracts().PayloadFields`,并同步 YAML allowlist。
|
||||
- [ ] 生产者、消费者包名写入同一条契约;运行时注册必须是静态清单的子集。
|
||||
- [ ] 领域提交、envelope、delivery 行在同一个 UnitOfWork。缺 `environment` 或 `project_id` 时 fail closed,禁止写死 `"dev"` / `0`。
|
||||
- [ ] 消费者有幂等键;重复投递测试证明只有一个可见结果。
|
||||
- [ ] `./scripts/arch-check.sh --mode block` 与 registry parity 测试通过。
|
||||
|
||||
### 3.3 稳定词汇
|
||||
|
||||
无行为的枚举和值对象才可以进共享词汇。带解析、哈希、路径拼接的函数留在所属模块(现例:`internal/doccontent`),禁止塞进 vocabulary。
|
||||
|
||||
在批次 C 完成前,不要新增对 `docgov.State*` / `docgov.Role*` / `docgov.Err*` 的跨包引用。已有引用记在 [耦合审计](../audit/2026-09-20-module-coupling-audit.md),按整改批次收敛。
|
||||
|
||||
## 4. 故障隔离红线
|
||||
|
||||
1. **表唯一写者**。`INSERT/UPDATE/DELETE` 只能出现在 YAML `table_owners` 指定的包。跨表原子性由用例打开的 UnitOfWork 提供,不是每个模块各开事务。
|
||||
2. **解包事务的包有名单**。只有登记过的属主可以从 `uow.TxScope` 取出 `pgx.Tx`。server 与 chat 不在此列。
|
||||
3. **领域实现互不 import**。需要对方能力时定义端口,由 `internal/app` 注入。用子包绕开编译环但保留反向 import,视为未解耦。
|
||||
4. **持锁期间不做外部 IO**。LLM、PI Runner、对象存储、HTTP、SSE、大文件复制放在提交之后,由 outbox 驱动。
|
||||
5. **事件消费者 fail closed**。授权失败、环境不符、schema 未知 → quarantine,不当成瞬时错误重试。FAV 消费者保持禁用。
|
||||
6. **HTTP 不修投影**。GET 不得写数据库或覆盖 head。修复是独立命令并写审计。
|
||||
7. **单文件变更面**。新生产 Go 文件不超过 800 行。已有超过 1000 行的文件(见审计热点 5)只允许在对应整改批次里拆,不借无关功能 PR 顺手重排。
|
||||
|
||||
## 5. 新增功能怎么落
|
||||
|
||||
按顺序做。跳过门禁视为未完成,即使功能在本地可用。
|
||||
|
||||
### 5.1 新模块
|
||||
|
||||
1. 在 short-term 写明唯一写入所有权(表、文件或无)。
|
||||
2. 在 `module-boundaries.yaml` 的 `imports` 里只放允许依赖的包。默认可依赖 config、稳定词汇、本模块 repository。不可依赖另一个领域实现。
|
||||
3. 组合根负责构造。server 若需要该能力,只能通过已有用例端口。
|
||||
4. FEATURE-MATRIX 加行,mutex 与 CURRENT 认领一致。
|
||||
|
||||
### 5.2 新表
|
||||
|
||||
1. Goose 迁移只 additive。
|
||||
2. YAML `table_owners` 登记唯一写者。
|
||||
3. 跨表不变量写在用例的一个 UnitOfWork 里,并写明锁顺序:project/workflow → 聚合根 → version/turn → task run → outbox。
|
||||
4. 不允许 server handler 出现该表的 SQL。
|
||||
|
||||
### 5.3 新事件或新消费者
|
||||
|
||||
走 §3.2。消费者状态是 `off | shadow | live`,按环境 + 消费者配置,不靠单个进程的环境变量偷偷打开。shadow 只写对账,不写业务副作用。FAV 不在此流程里放量。
|
||||
|
||||
### 5.4 改已有模块
|
||||
|
||||
1. 先看 [耦合审计](../audit/2026-09-20-module-coupling-audit.md) 该包是否已有 P1/P2。有则优先缩小依赖,而不是再增加一个具体类型字段。
|
||||
2. 影响面守则(partial-deferred §2.2)仍然有效:深模块、禁止新增跨模块 import、schema additive、一能力一 flag、事件双登记、改声明范围要留 before/after。
|
||||
3. 例外若必须保留,写入 YAML `exceptions` 时带 owner、原因、范围、到期日和移除里程碑。禁止无到期日的例外。本轮不新增例外来掩盖热点 1–4。
|
||||
|
||||
## 6. 与现有文档的分工
|
||||
|
||||
| 问题 | 读这里 | 不要在本文件找 |
|
||||
|------|--------|----------------|
|
||||
| 为什么是模块化单体 | ADR | 实施波次 |
|
||||
| 事务、锁、FAV、授权模型 | [架构设计](./2026-09-14-module-decoupling-architecture.md) | 今日残留热点 |
|
||||
| 事件状态机与 Track E/S/P | [Phase 2 计划](../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md) | 新批次 A–G |
|
||||
| 改功能时如何收敛影响面 | [partial-deferred §2](../remediation/2026-09-16-partial-deferred-completion-plan.md) | 端口字段清单 |
|
||||
| 今天还有哪些耦合 | [耦合审计](../audit/2026-09-20-module-coupling-audit.md) | 发布门禁 |
|
||||
| 接下来哪一批先改 | [分批整改](../remediation/2026-09-20-module-decoupling-batch-plan.md) | 代码 |
|
||||
|
||||
## 7. 提交前自检
|
||||
|
||||
```bash
|
||||
./scripts/arch-check.sh --mode block
|
||||
go vet ./...
|
||||
go test -short ./...
|
||||
```
|
||||
|
||||
改了事件契约时,额外确认 `TestRegistryParityWithYAML` 在跑到的包里通过。文档-only 变更也跑上述命令,防止索引或生成物被误改。
|
||||
@@ -105,6 +105,8 @@
|
||||
|-----|------|
|
||||
| 主报告 | [2026-09-14-module-decoupling-architecture.md](2026-09-14-module-decoupling-architecture.md) |
|
||||
| ADR | [../adr/2026-09-14-modular-monolith-decoupling.md](../adr/2026-09-14-modular-monolith-decoupling.md) |
|
||||
| 开发规范(入口) | [2026-09-20-module-development-standards.md](2026-09-20-module-development-standards.md) |
|
||||
| 耦合审计 | [../audit/2026-09-20-module-coupling-audit.md](../audit/2026-09-20-module-coupling-audit.md) |
|
||||
| 整改计划 | [../remediation/2026-09-14-module-decoupling-refactor-plan.md](../remediation/2026-09-14-module-decoupling-refactor-plan.md) |
|
||||
| 一句话总结 | 先以文档可靠性纵向试点验证事务、锁、授权、事件与 FAV,再按证据扩展模块边界 |
|
||||
|
||||
@@ -207,6 +209,7 @@
|
||||
├── 05-Phase0-基线确认与契约冻结.md
|
||||
└── 06-Phase7-全链路验收与发布基线.md
|
||||
├── 2026-09-14-module-decoupling-architecture.md ← 模块化单体解耦
|
||||
├── 2026-09-20-module-development-standards.md ← 开发者入口:契约 / 接口 / 故障隔离
|
||||
|
||||
.tmp/ ← 中间分析文件
|
||||
├── intent-recognition/
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
# 2026-09-20 P0 热修 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
2026-09-20 系统全量体检发现多项 critical:迁移 00054 断链与 `chat_summaries` 静默失败、三项 IDOR、taskrun 向已关闭 channel 发送可致进程 panic、备份/推送脚本硬编码或暴露凭证、生产 DB 口令入库。P0 热修按 Wave 0–4 落地。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- 迁移链连续:dev/main schema=58,`chat_summaries` 存在
|
||||
- 三项 IDOR 负例 403/400
|
||||
- taskrun Subscribe/Unsubscribe 并发无 panic(`-race`)
|
||||
- 备份脚本无硬编码口令;push 不把 token 放 URL
|
||||
- main 库网络路径旧口令失败、新口令成功;main health ok
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- OS:linux;Go 1.27.1
|
||||
- 环境:dev `:8080`、test `:8081`、main `:8000`;真实容器(非 stub 冒充验收)
|
||||
- 层级:单元/负例(`go test`、`-race`)、脚本静态检查、真实 curl / docker network psql
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 用例 | 预期 |
|
||||
|------|------|
|
||||
| health | schema_version=58(dev/main);chat_summaries 存在 |
|
||||
| 偏好跨用户写 | 403 ERR_FORBIDDEN |
|
||||
| 他人 session 读 projects | 403 SESSION_FORBIDDEN |
|
||||
| 空 session 重分类 | 400 |
|
||||
| 他人 session 重分类 | 403 |
|
||||
| Subscribe race | PASS,无 panic |
|
||||
| 旧生产口令(docker 网) | FATAL auth |
|
||||
| 新生产口令(docker 网) | SELECT 1 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 迁移与摘要表
|
||||
|
||||
- **输入**:`./scripts/env-service.sh dev rebuild`;capability 合入后 00054→00058
|
||||
- **实际输出**:
|
||||
- `curl :8080/health` → `schema_version":58`
|
||||
- `to_regclass('public.chat_summaries')` → `chat_summaries`;`max(version_id)=58`
|
||||
- main rebuild 后亦为 `schema_version":58`
|
||||
- **判定**:PASS
|
||||
- **耗时**:dev rebuild ~41s;main rebuild ~48s
|
||||
|
||||
### 5.2 三项 IDOR(单元 + 真实 curl)
|
||||
|
||||
- **单元**:`TestUpdateUserPreference_CrossUserIs403` / `TestGetProject_OtherUserSessionDenied` / `TestChatRecategorize_RequiresOwnedSession` → `ok chat-agent-system/internal/server`
|
||||
- **真实 curl(dev)**:
|
||||
- `PREF_CROSS=403` `无权修改其他用户的偏好`
|
||||
- `PROJ_CROSS=403` `无权访问该会话`
|
||||
- `RECAT_EMPTY=400` `session_id is required`
|
||||
- `RECAT_CROSS=403`(经 SQL 插入归属会话后)`SESSION_FORBIDDEN`;所有者 `RECAT_OWN=200`
|
||||
- **判定**:PASS
|
||||
- **耗时**:单元 ~1.6s;curl 秒级
|
||||
|
||||
### 5.3 进程稳定性
|
||||
|
||||
- **输入**:`go test -race ./internal/taskrun/ -run TestSubscribeUnsubscribeRace`
|
||||
- **实际输出**:`ok chat-agent-system/internal/taskrun`
|
||||
- **判定**:PASS(持锁 fanout + recover 兜底)
|
||||
- **耗时**:~1.0s
|
||||
|
||||
### 5.4 凭证与口令轮换
|
||||
|
||||
- **脚本**:`grep prod_highly|oauth2:${TOKEN}` → 两脚本命中数 **0**
|
||||
- **main 网络认证**(scram,非 localhost trust):
|
||||
- 旧硬编码口令:`NET_OLD_EXIT=2` FATAL
|
||||
- 新口令:`NET_NEW_EXIT=0` → `1`
|
||||
- **health**:`main` / events `:8090` status ok,schema 58
|
||||
- **判定**:PASS(口令内容不写入本报告)
|
||||
- **耗时**:rebuild ~48s
|
||||
|
||||
### 5.5 前端 XSS 转义
|
||||
|
||||
- **输入**:`npx tsx --test src/engine/replyDocument/replyDocument.test.ts`
|
||||
- **实际输出**:`escapeHtml escapes math error payloads...` PASS
|
||||
- **判定**:PASS
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
```
|
||||
go test ./internal/server/ -run 'TestUpdateUserPreference_CrossUserIs403|TestGetProject_OtherUserSessionDenied|TestChatRecategorize_RequiresOwnedSession' → ok
|
||||
go test -race ./internal/taskrun/ -run TestSubscribeUnsubscribeRace → ok
|
||||
npx tsx --test src/engine/replyDocument/replyDocument.test.ts → 9 pass / 0 fail
|
||||
```
|
||||
|
||||
全量 `go test -short ./...` 仍有已知外网镜像 flake:`TestPiAgentDockerBuildContext_RunnerModulesPresent`(docker.1ms.run EOF),记 long-term T20-I8,不挡本 P0。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- **结论**:P0 热修达到合入/冒烟标准;`production_ready` 保持 yes(无新增未关闭发布 blocker)。
|
||||
- **后续**:medium/low 见 [long-term 2026-09-20 增补](../ops/long-term/2026-09-19-audit-remainder.md);main **git 分支树**对齐晋升仍独立授权(环境 schema 已 58,分支仍落后);test 环境 schema 仍 57,下次晋升补 00058。
|
||||
@@ -0,0 +1,69 @@
|
||||
# 激活后职责改派 + 成员可对话 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
test 环境实测两处产品缺口:
|
||||
|
||||
1. 工作流激活后项目设置进入冻结态,无法再指定文档编制/审核/批准负责人;
|
||||
2. 项目成员「陈威」(user_id=35)对话返回 `WORKFLOW_ACCESS_DENIED` /「无权访问该阶段对话内容」——阶段 ABAC 要求文档职责,与「成员即可聊」期望不符。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- live 工作流下,项目成员无需文档职责即可阶段对话;文档写操作仍按职责门禁;
|
||||
- 激活后可通过 `PATCH .../doc-tasks/{taskKey}/duties` 改派三职;小队任务运行中拒绝;
|
||||
- `PUT .../workflow-plan` 仍返回 `PLAN_FROZEN`。
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- OS: Linux;分支 `dev`(合入 `merge: fix/post-activation-duty-reassign-member-chat`)
|
||||
- test 环境:`http://127.0.0.1:8081`,真实 `pi-agent`,schema **57**
|
||||
- 单元:`go test -short ./internal/projectinstance/ ./internal/server/ ./internal/app/`
|
||||
- 证据:[`assets/2026-09-20-post-activation-duty-reassign-member-chat/`](./assets/2026-09-20-post-activation-duty-reassign-member-chat/)
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 用例 | 预期 |
|
||||
|------|------|
|
||||
| 陈威 `POST /chat/stream`(sess-p5-u35) | 无 `WORKFLOW_ACCESS_DENIED`,进入意图/回复流 |
|
||||
| `PUT /projects/5/workflow-plan` | 409 `PLAN_FROZEN` |
|
||||
| `PATCH /projects/5/doc-tasks/intake/duties`(author→35) | 200,snapshot 三职更新 |
|
||||
| 无职责成员 `TaskKeyAllowed(intake)` | 仍为 false(单元测) |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 用例 1:陈威成员阶段对话
|
||||
|
||||
- **测试输入 (Input)**:陈威登录 → `POST /api/v1/chat/stream`(`sess-p5-u35`,项目 5 live / `V0.1_triage`)
|
||||
- **实际输出 (Actual Output)**:SSE 依次 `phase` / `turn_ack` / `status` / `delta` / `done`;无 `WORKFLOW_ACCESS_DENIED`
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:流式首包 < 1s(本地)
|
||||
|
||||
### 用例 2:规划仍冻结
|
||||
|
||||
- **测试输入**:admin `PUT /api/v1/projects/5/workflow-plan`
|
||||
- **实际输出**:HTTP 409,业务码 `PLAN_FROZEN`(「工作流已激活,规划已冻结」)
|
||||
- **评价判定**:PASS
|
||||
|
||||
### 用例 3:激活后改派
|
||||
|
||||
- **测试输入**:admin `PATCH /api/v1/projects/5/doc-tasks/intake/duties`,`author_user_id=35`
|
||||
- **实际输出**:200;intake duties `author=35, reviewer=32, approver=33`
|
||||
- **评价判定**:PASS
|
||||
|
||||
### 用例 4:单元回归
|
||||
|
||||
- **测试输入**:`go test -short`(projectinstance / server / app)
|
||||
- **实际输出**:全部 PASS(见 assets `go-test-short.txt`)
|
||||
- **评价判定**:PASS
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
见 [`assets/.../go-test-short.txt`](./assets/2026-09-20-post-activation-duty-reassign-member-chat/go-test-short.txt) 与 [`verify-summary.json`](./assets/2026-09-20-post-activation-duty-reassign-member-chat/verify-summary.json)。
|
||||
|
||||
health:`schema_version=57`,`env=test`,`agent_backend=pi-agent`。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- 达到合入/冒烟标准:成员可聊 + 受控改派 + 规划冻结保留。
|
||||
- 提醒:验证期曾重置「陈威」凭据哈希,验收后请用户自行改密(本报告不披露口令)。
|
||||
- 后续:忙文档(squad running)拒绝路径已有单元测;可在 UI 验收中补一条 running 时 409 的浏览器用例。
|
||||
@@ -0,0 +1,173 @@
|
||||
# test 环境 beta.6 晋升与助手/小队可用性验证 — 测试报告
|
||||
|
||||
**报告日期**: 2026-09-20
|
||||
**执行分支**: `test`(晋升 merge+tag)+ `docs/test-env-beta6-verification`(本报告)
|
||||
**候选 Tag**: `rc-v1.0.0-beta.6`
|
||||
**证据目录**: [`.doc/test-reports/assets/2026-09-20-test-env-beta6-assistant-squad/`](./assets/2026-09-20-test-env-beta6-assistant-squad/)
|
||||
**关联**: [bug-hunt audit](../audit/2026-09-20-bug-hunt-permissions-uploads.md) · [CURRENT](../ops/CURRENT.md)
|
||||
|
||||
---
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
`dev` 已合入 permissions/uploads bug-hunt 批次(schema 迁至 56:`project:manage_members`、项目名唯一 + `client_key` 幂等等),领先 `test`(`rc-v1.0.0-beta.5` / schema 53)若干提交。test 环境 CSP 仍缺 `frame-src`,证明该批修复尚未部署。
|
||||
|
||||
本轮手工将 `dev` 晋升到 `test` 并打 `rc-v1.0.0-beta.6`,按源码树重建 test 容器完成 goose→56,并在 S0/S1 快照保护下做 C 级真实验收(助手 + 小队 + 12 项回归),验证后将库恢复到 S1 基线。
|
||||
|
||||
---
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
| # | 目标 | 成功标准 |
|
||||
|---|------|----------|
|
||||
| T1 | 晋升与重建 | `test` merge `--no-ff` + tag;health `schema_version=56`;CSP 含 `frame-src 'self' blob:`;`projects.client_key` / 唯一索引存在 |
|
||||
| T2 | 助手真实对话 | 新建验证项目;多轮 `POST /api/v1/chat` 的 `reply_source=pi-agent` 且次轮承接上文;`/chat/stream` 含 `turn_ack→delta→done` |
|
||||
| T3 | 小队真实产出 | `POST /api/v1/tasks/runs` intake → SSE → `completed`;文档正文 ≥1500 字;同 `client_turn_id` 幂等同一 `run_id` |
|
||||
| T4 | 本批 12 项回归 | CAS 200/400/409、建号 role 400、改密清除、无项目 403、重名 409、`client_key` 幂等、`manage_members`、task-run 成员查看、CSP |
|
||||
| T5 | 恢复基线 | `pg_restore` 回 S1:goose 56、4 projects / 2 task_runs / 7 users;清理验证 workspace |
|
||||
|
||||
---
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
### 3.1 环境
|
||||
|
||||
| 项 | 值 |
|
||||
|----|----|
|
||||
| OS | Linux 7.0.0-31-generic |
|
||||
| 目标 | test `:8081` / events `:8089` / pi-agent `:18866` / pg `:5434` |
|
||||
| Agent | `pi-agent` + `MiniMax-M2.7-highspeed`(真实 token) |
|
||||
| 镜像 | `PINNED_IMAGE_MODE=0`,源码树构建(未走 receipt / pinned apply) |
|
||||
| Tag | `rc-v1.0.0-beta.6` @ merge `7a6cfeef` |
|
||||
|
||||
### 3.2 快照时序
|
||||
|
||||
1. **S0** `/tmp/agent-test-snap-s0-pre-beta6` — schema **53**(回滚兜底)
|
||||
2. merge + rebuild → goose **56**
|
||||
3. **S1** `/tmp/agent-test-snap-s1-post-migration` — schema **56**,4/2/7(验证基线)
|
||||
4. C 级写入 → `pg_restore` 回 S1 → 清理新增 workspace
|
||||
|
||||
### 3.3 分层
|
||||
|
||||
- 晋升 / 容器健康 / CSP / schema
|
||||
- 真实助手(MiniMax)多轮 + stream
|
||||
- 真实小队 intake(作者 `mtx_owner`)
|
||||
- API 回归(admin + 新建账号)
|
||||
- `go test -short ./...` 回归摘要(见第六节)
|
||||
|
||||
### 3.4 运维备注(非功能失败)
|
||||
|
||||
重建时宿主机曾受根 `.env` 污染(app 误连 `agent_system_dev`)与 DNS `198.18.0.1` 导致 MiniMax 超时;已用纯 `configs/.env.test` 重创 app/events,并为 compose 注入 `8.8.8.8/1.1.1.1` DNS override。此后助手/小队均走真实模型。
|
||||
|
||||
---
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
- health:`schema_version=56`、`schema_ready=true`、`agent_backend=pi-agent`
|
||||
- 闲聊路径:`CASUAL_CHAT` / `AMBIGUOUS_FALLBACK`,`coordination_result.reply_source=pi-agent`
|
||||
- stream:事件序列含 `turn_ack`、`delta`、`done`
|
||||
- intake:`Status=completed`,`output.md` 字数 ≥1500;幂等返回同一 `run_id`
|
||||
- 回归点按审计表判定 HTTP 码与错误码(见第五节)
|
||||
- 恢复后计数回到 S1 manifest
|
||||
|
||||
---
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 晋升 / schema / CSP
|
||||
|
||||
- **Input**: `git merge --no-ff dev` on `test`;源码重建;`curl /api/v1/health`;CSP 头;`\d+ projects`
|
||||
- **Actual**: tag `rc-v1.0.0-beta.6`;health schema 56;CSP 含 `frame-src 'self' blob:`(见 [`47-csp-header.txt`](./assets/2026-09-20-test-env-beta6-assistant-squad/47-csp-header.txt))
|
||||
- **Verdict**: **PASS**
|
||||
- **Duration**: 重建含增量镜像与 DNS 修复,约数十分钟量级
|
||||
|
||||
### 5.2 助手多轮(真实 pi-agent)
|
||||
|
||||
**Turn 1**(华西样机交流)— [`15-chat-dlg-t1-summary.txt`](./assets/2026-09-20-test-env-beta6-assistant-squad/15-chat-dlg-t1-summary.txt)
|
||||
|
||||
- intent=`CASUAL_CHAT`,`reply_source=pi-agent`,reply_len=1434,duration≈37s
|
||||
- 内容含样机存放/防潮/合规口径(非进度模板)
|
||||
|
||||
**Turn 2**(展台三点追问,承接上文)— [`15-chat-dlg-t2-summary.txt`](./assets/2026-09-20-test-env-beta6-assistant-squad/15-chat-dlg-t2-summary.txt)
|
||||
|
||||
- intent=`CASUAL_CHAT`,`reply_source=pi-agent`,reply_len=908,duration≈25s
|
||||
- 开场明确「接着上一轮的讲解口径」
|
||||
|
||||
**Stream** — [`12-chat-stream-dnsfix-summary.txt`](./assets/2026-09-20-test-env-beta6-assistant-squad/12-chat-stream-dnsfix-summary.txt)
|
||||
|
||||
- `turn_ack` + `delta` + `done` 齐备
|
||||
|
||||
- **Verdict**: **PASS**
|
||||
- **项目**: id=6「beta6助手小队验证」(验证专用;未改项目 143)
|
||||
|
||||
### 5.3 小队 intake
|
||||
|
||||
- **Input**: 激活 main(仅 intake + SoD 26/27/28);`mtx_owner` `POST /api/v1/tasks/runs` `task_key=intake` `backend=pi-agent`
|
||||
- **Actual**:
|
||||
- create HTTP 202,`run_id=run_1789890209887485794`,约 5.5min 后 `Status=completed`
|
||||
- SSE 含 phase/governance/deliverable/done([`33-task-run-events.sse`](./assets/2026-09-20-test-env-beta6-assistant-squad/33-task-run-events.sse))
|
||||
- `output.md` chars=8007(≥1500)— [`36-intake-output-summary.txt`](./assets/2026-09-20-test-env-beta6-assistant-squad/36-intake-output-summary.txt)
|
||||
- 同 `client_turn_id` 再 POST → 同一 `run_id` — [`37-idempotent-summary.txt`](./assets/2026-09-20-test-env-beta6-assistant-squad/37-idempotent-summary.txt)
|
||||
- **Verdict**: **PASS**
|
||||
- **Duration**: ≈334s
|
||||
|
||||
### 5.4 本批修复点回归
|
||||
|
||||
证据:[`40-regressions-summary.txt`](./assets/2026-09-20-test-env-beta6-assistant-squad/40-regressions-summary.txt)
|
||||
|
||||
| 用例 | 结果 |
|
||||
|------|------|
|
||||
| 设置 CAS 缺 revision → 400 | PASS |
|
||||
| 设置 CAS 正确 revision → 200 | PASS |
|
||||
| 设置 CAS 过期 revision → 409 | PASS |
|
||||
| 建号不存在 role_id → 400(无 rollback/pgx) | PASS |
|
||||
| 正常建号 → 200 | PASS |
|
||||
| change-password 后 `must_change_password` 顶层+嵌套均为 false | PASS |
|
||||
| 无项目用户 chat → 403 `ERR_NO_PROJECT` | PASS |
|
||||
| 同名项目 → 409 `ERR_DUPLICATE_PROJECT_NAME` | PASS |
|
||||
| 同 `client_key` → 同一 project id | PASS |
|
||||
| 无 `project:manage_members` 加成员 → 403 | PASS |
|
||||
| PATCH 角色授予后加成员 → 201;成员列表可见;目标用户 `GET /projects` 可见 | PASS |
|
||||
| 项目成员(非创建者)GET task-run → 200;非成员 → 403 | PASS |
|
||||
| CSP `frame-src 'self' blob:` | PASS |
|
||||
|
||||
- **Verdict**: **PASS**(全部)
|
||||
|
||||
### 5.5 恢复 S1
|
||||
|
||||
- **Actual**: [`50-restore-s1.txt`](./assets/2026-09-20-test-env-beta6-assistant-squad/50-restore-s1.txt) — health schema 56;goose=56;projects=4;task_runs=2;users=7
|
||||
- 已删除验证新增 `bizdev/intake_178989…` 与对话 `dialogue/ctx_178988*/ctx_178989*`
|
||||
- S0 快照保留于 `/tmp/agent-test-snap-s0-pre-beta6`
|
||||
- **Verdict**: **PASS**
|
||||
|
||||
---
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
在 `docs/test-env-beta6-verification` 工作树执行:
|
||||
|
||||
```bash
|
||||
go test -short ./...
|
||||
```
|
||||
|
||||
完整输出:[`60-go-test-short.txt`](./assets/2026-09-20-test-env-beta6-assistant-squad/60-go-test-short.txt)
|
||||
|
||||
| 统计 | 值 |
|
||||
|------|-----|
|
||||
| `ok` 包约 | 51 |
|
||||
| `FAIL` 包 | 若干(`cmd/bizdev-cli` adhoc、`internal/agent`/`internal/template` Docker buildx 拉基础镜像超时、`internal/notification` PG 用例) |
|
||||
|
||||
上述 FAIL 与本轮 test 环境晋升/C 级验收无直接因果关系(主要为宿主机 Docker registry DNS / 本地 PG 集成前置),**不以 stub 冒充验收**;本报告以 `:8081` 真实 pi-agent 证据为交付依据。
|
||||
|
||||
---
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
**结论**: `rc-v1.0.0-beta.6` 已在 test 落地 schema **56**;助手真实对话、小队 intake 真实产出、本批权限/上传相关 API 回归均 **PASS**;库已恢复 S1 基线。达到 test 环境继续实测标准。
|
||||
|
||||
**后续建议**:
|
||||
|
||||
1. 将临时 DNS override(`8.8.8.8/1.1.1.1`)固化到 test compose 或宿主机 resolver,避免 MiniMax 再被 `198.18.0.1` 劫持。
|
||||
2. `env-service` / compose 插值严禁叠加根 `.env` 的 `SYSTEM_DB_NAME=agent_system_dev`,以免 test app 误连。
|
||||
3. 可选:补 receipt 门禁与 pinned 镜像路径,使下一轮晋升不必依赖「手工 PINNED=0」。
|
||||
4. 不默认升 `MULTI_INTENT_PLAN_TIER=full`;不启用 `FAV_DEGRADED_READ`;项目 143 继续只读。
|
||||
@@ -0,0 +1,102 @@
|
||||
# test 环境三问题整改 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
test 环境实测发现三项缺陷:
|
||||
|
||||
1. 存在同名项目「全自动冲击波治疗仪」(id=4 / id=5),与产品设计冲突;
|
||||
2. 用户「陈威」被拉入项目 5 后,登录侧边栏看不到项目与对话(会话未按成员创建、创建时 upsert 会话归属被强制写成管理员);
|
||||
3. 上传 PDF 后刷新无法预览(服务端无资产 raw 下载端点,前端仅依赖内存 blob)。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- 全局项目名唯一:跨用户创建重名返回 409;
|
||||
- 成员拉入后可见项目与本人会话;
|
||||
- 刷新后可通过 `GET /assets/{id}/raw` 回退预览 PDF;
|
||||
- test 环境 schema 57 healthy。
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- OS: Linux;Go test `-short`;test 环境 `http://127.0.0.1:8081`
|
||||
- 后端:真实 `pi-agent`;schema **57**(含 `00057` 全局唯一项目名)
|
||||
- 数据修复:[`scripts/fix-test-env-triage-data.sql`](../../scripts/fix-test-env-triage-data.sql)
|
||||
- 验证脚本输出:[`assets/2026-09-20-test-env-triage-fixes/verify-summary.json`](./assets/2026-09-20-test-env-triage-fixes/verify-summary.json)
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 用例 | 预期 |
|
||||
|------|------|
|
||||
| 陈威 GET /projects | 仅见项目 5「全自动冲击波治疗仪」 |
|
||||
| 陈威 GET /chat/sessions | 含 `sess-p5-u35` |
|
||||
| 陈威 GET /projects/5/assets/371/raw | 200,PDF 魔数 `%PDF` |
|
||||
| admin 创建同名项目 | 409 `ERR_DUPLICATE_PROJECT_NAME` |
|
||||
| 项目 4 | `demo_retired`,不出现在活跃列表 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 用例 1:陈威登录与项目可见性
|
||||
|
||||
- **测试输入 (Input)**:`POST /api/v1/auth/login`(chenwei)→ `GET /api/v1/projects`
|
||||
- **实际输出 (Actual Output)**:
|
||||
```text
|
||||
PASS login chenwei
|
||||
PASS projects [(5, '全自动冲击波治疗仪')]
|
||||
```
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:<300ms(全套脚本)
|
||||
|
||||
### 用例 2:陈威会话可见性
|
||||
|
||||
- **测试输入**:`GET /api/v1/chat/sessions?user_id=35&limit=50`
|
||||
- **实际输出**:
|
||||
```text
|
||||
PASS sessions [('sess-p5-u35', 5)]
|
||||
```
|
||||
- **评价判定**:PASS(同时 DB 已修 `sess-p5-u32`→32、`sess-p5-u33`→33)
|
||||
|
||||
### 用例 3:PDF 资产 raw 预览回退
|
||||
|
||||
- **测试输入**:`GET /api/v1/projects/5/assets/371/raw`(陈威 Bearer)
|
||||
- **实际输出**:
|
||||
```text
|
||||
PASS asset raw bytes 2338149 ct application/pdf
|
||||
```
|
||||
- **评价判定**:PASS
|
||||
|
||||
### 用例 4:全局重名拦截
|
||||
|
||||
- **测试输入**:admin `POST /api/v1/projects` name=`全自动冲击波治疗仪`
|
||||
- **实际输出**:
|
||||
```text
|
||||
PASS dup create 409 ERR_DUPLICATE_PROJECT_NAME
|
||||
```
|
||||
- **评价判定**:PASS
|
||||
|
||||
### 用例 5:数据面与健康
|
||||
|
||||
- **测试输入**:DB 查询 + `GET /health`
|
||||
- **实际输出**:
|
||||
```text
|
||||
id=4 status=demo_retired name=…(retired-4)
|
||||
id=5 status=active name=全自动冲击波治疗仪
|
||||
schema_version=57 status=ok
|
||||
```
|
||||
- **评价判定**:PASS
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
```text
|
||||
go vet ./... # PASS
|
||||
go test -short ./internal/server/ ./internal/projectworkflow/ ./internal/ctxmgr/ ./internal/authz/
|
||||
ok server / projectworkflow / ctxmgr / authz
|
||||
cd web && npm test
|
||||
434 pass / 0 fail (node) + 32 pass (vitest)
|
||||
```
|
||||
|
||||
新增单测:`TestGetProjectAssetRaw_RoundTrip`;更新 `TestCreateProject_ClientKeyIdempotentAndDuplicateName` 为全局重名拒绝。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- **结论**:三项缺陷均已在 test 环境验证通过,达到合并/验收标准。
|
||||
- **合入**:`merge: fix/test-env-triage-2026-09-20` → `dev`(schema 57)。
|
||||
- **后续**:正式晋升 `test` 分支打 rc tag 时带上本次代码;提醒「陈威」账号验证后请自行改密(验证期曾重置哈希,不在本报告披露口令)。
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
ok chat-agent-system/internal/projectinstance 0.004s
|
||||
ok chat-agent-system/internal/server 15.660s
|
||||
ok chat-agent-system/internal/app 0.019s
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"status":"ok","env":"test","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"kb_ready":true,"database_ready":true,"schema_version":57,"schema_ready":true,"task_store_ready":true}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"member_chat": {
|
||||
"user": "chenwei",
|
||||
"user_id": 35,
|
||||
"session_id": "sess-p5-u35",
|
||||
"project_id": 5,
|
||||
"access_denied": false,
|
||||
"pass": true
|
||||
},
|
||||
"plan_frozen_put": {
|
||||
"status": 409,
|
||||
"pass": true
|
||||
},
|
||||
"duty_reassign_patch": {
|
||||
"task_key": "intake",
|
||||
"author_user_id_after": 35,
|
||||
"pass": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
login_env= test must_change= False user_id= 4
|
||||
me_ok env= test caps= 18
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"id":6,"code":"beta6助手小队验证-c9107b25","name":"beta6助手小队验证","customer_name":"","device_type":"超声软组织手术吸引设备","intended_use":"脑组织空化乳化与同轴吸引","target_market":"中国 NMPA 三类","current_stage":"V0.1_triage","environment":"dev","status":"active","creator_user_id":4,"lifecycle_status":"planning","active_workflow_key":"","workflow_selection_version":1,"workflow_plan_revision":0,"created_at":"2026-09-20T07:28:44.355457195Z","updated_at":"2026-09-20T07:28:44.355457195Z","client_key":"beta6-verify-1789889324"}
|
||||
@@ -0,0 +1 @@
|
||||
project_id=6 client_key=beta6-verify-1789889324
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
http_ok_fields=branch,reply_source,intent,reply_len
|
||||
branch= NEW_INTENT_PREEMPT
|
||||
reply_source= None
|
||||
intent= HELP_CAPABILITIES
|
||||
reply_len= 142
|
||||
reply_head= 🧭 **我能帮您做什么** 当前阶段您可以通过对话尝试: • 查询项目进展、风险与沟通话术 • 补充或修正项目事实 • 查看受控文档 • 生成交付物:intake • 推进阶段:V0.5_feasibility 高风险操作(工作流切换、文档审批、阶段推进)需要明确确认后才会执行。
|
||||
PASS_pi= False
|
||||
File diff suppressed because one or more lines are too long
+7
@@ -0,0 +1,7 @@
|
||||
branch= NEW_INTENT_PREEMPT
|
||||
reply_source= None
|
||||
intent= RUN_RESUME
|
||||
reply_len= 46
|
||||
reply_head= 请说明要续跑的具体任务或失败阶段;若您指的是最近一次失败运行,请确认后我将基于该工作区继续。
|
||||
continuity_mentions= False
|
||||
PASS_pi= False
|
||||
File diff suppressed because one or more lines are too long
+7
@@ -0,0 +1,7 @@
|
||||
event_count= 8
|
||||
unique_events= ['delta', 'done', 'phase', 'status', 'turn_ack']
|
||||
has_turn_ack= True
|
||||
has_delta= True
|
||||
has_done= True
|
||||
PASS_stream= True
|
||||
bytes= 2496
|
||||
@@ -0,0 +1,32 @@
|
||||
event: phase
|
||||
data: {"id":"evt_1789889324451000458_1","type":"phase","timestamp":"2026-09-20T07:28:44.451002128Z","phase":{"phase_id":"intent_recognizing","message":"正在研判您的意图与项目上下文...","role":"coordinator"}}
|
||||
|
||||
event: turn_ack
|
||||
data: {"id":"evt_1789889324452833334_2","type":"turn_ack","timestamp":"2026-09-20T07:28:44.452833784Z","turn":{"client_turn_id":"turn-1789889324","user_message_id":13,"status":"processing"}}
|
||||
|
||||
event: status
|
||||
data: {"id":"evt_1789889324453328409_3","type":"status","timestamp":"2026-09-20T07:28:44.453328899Z","status":{"intent":"CASUAL_CHAT","branch":"AMBIGUOUS_FALLBACK","current_stage":"V0.1_triage","message":"识别分支: AMBIGUOUS_FALLBACK (置信度: 20%)"}}
|
||||
|
||||
event: phase
|
||||
data: {"id":"evt_1789889332393050683_4","type":"phase","timestamp":"2026-09-20T07:28:52.393052523Z","phase":{"phase_id":"dialogue_generating","message":"正在整理回复...","role":"assistant","progress":40}}
|
||||
|
||||
event: status
|
||||
data: {"id":"evt_1789889332393229417_5","type":"status","timestamp":"2026-09-20T07:28:52.393230237Z","status":{"intent":"CASUAL_CHAT","branch":"AMBIGUOUS_FALLBACK","current_stage":"V0.1_triage","message":"意图判定: CASUAL_CHAT (置信度: 20%)"}}
|
||||
|
||||
event: phase
|
||||
data: {"id":"evt_1789889332393537608_6","type":"phase","timestamp":"2026-09-20T07:28:52.393538178Z","phase":{"phase_id":"dialogue_generating","message":"正在生成项目助手回复...","role":"assistant","progress":60}}
|
||||
|
||||
: heartbeat 1789889339
|
||||
|
||||
: heartbeat 1789889354
|
||||
|
||||
: heartbeat 1789889369
|
||||
|
||||
: heartbeat 1789889384
|
||||
|
||||
event: delta
|
||||
data: {"id":"evt_1789889396699775768_7","type":"delta","timestamp":"2026-09-20T07:29:56.699777198Z","delta":"完全理解您想再掂量一下。针对「医疗器械研发项目」目前的节点,我帮您快速对照一下:\n\n• 若推进 V0.5(方案成型与法规对齐):\n 我可帮您梳理初步架构与注册分类路径,并预估型检成本,便于与客户深入沟通;\n• 若先放一放 / 多做调研:\n 可先补齐预算、目标市场或使用场景等信息,降低后续返工风险。\n\n💡 如果您接下来更希望先有一份可审阅的材料,我可以先整理一版 V0.5 方案框架与法规路径;节奏仍由您决定。\n\n您更倾向于:\n[1] 先做 V0.5 方案框架(可直接回复“好”或“1”)\n[2] 先说明您当前最关心的细节,我做针对性分析"}
|
||||
|
||||
event: done
|
||||
data: {"id":"evt_1789889396699831486_8","type":"done","timestamp":"2026-09-20T07:29:56.699832106Z","done":{"session_id":"sess_beta6_p6_u1","client_turn_id":"turn-1789889324","duration_ms":72248,"total_events":7,"user_message_id":13,"message_id":14,"status":"completed","content_revision":1,"content_sha256":"3a8c599260a4415e02895408cac547589cf461a6d87ec44756afb5d35c79127d","export_capability":{"policy":"full","formats":["rich_clipboard","markdown","docx","pdf","private_document"],"body_selector":"content_only","content_revision":1,"content_sha256":"3a8c599260a4415e02895408cac547589cf461a6d87ec44756afb5d35c79127d"}}}
|
||||
|
||||
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+7
@@ -0,0 +1,7 @@
|
||||
intent= QUERY_PROGRESS
|
||||
channel_hint= other
|
||||
reply_source= template
|
||||
reply_len= 367
|
||||
reply_head= **步骤 2** 【进展汇报】 项目当前成熟度等级为 V0.1(评分 65/100)。 诊断结论:已完成「beta6助手小队验证」的初始事实沉淀,当前具备进入方案与法规初筛的基准条件 建议下一步选项: [1] 使用下方微信话术与客户负责人核实 3 个关键事实口径 [2] 同意当前基准假设,直接触发 V0.5 阶段(方案成型与法规对齐) [3] 上传新的客户沟通纪要或补充材料进行局部刷新 💡 说明:项目尚未启动过任何交付任务,以上研判基于行业基准假设。若希望沉淀更精准的第一版立项画像与沟通话术,您可以吩咐我「生成一版 V0.1 需求收集表(立项摸底)」,或直接补充器械类型、目标市场、预算等关键细节。 另:您同时提到了「project.stage.advance」。该操作需单独确认后再执行,请回复「确认」或选择对应选项。
|
||||
PASS_dialogue_pi= False
|
||||
PASS_assistant_usable= True
|
||||
+1
File diff suppressed because one or more lines are too long
+9
@@ -0,0 +1,9 @@
|
||||
http=200
|
||||
duration_ms=19550267780
|
||||
intent=QUERY_PROGRESS
|
||||
confidence=0.9
|
||||
branch=NEW_INTENT_PREEMPT
|
||||
reply_source=pi-agent
|
||||
reply_len=262
|
||||
reply_head=您好!超声软组织手术吸引设备(如CUSA)利用超声波的机械振动、空化效应和热效应,将目标组织粉碎为碎屑,再通过冲洗液乳化后经探头吸引排出——相当于"边切边吸",切割与吸引同步完成。 与纯负压抽吸的传统吸引器相比,其核心差异在于两点:① **能量介入**:引入超声能量实现精准选择性破碎(对血管/神经等致密组织损伤较小);② **功能集成**:一台设备同时完成切割、凝血、吸引多项操作,减少术中器械切换。传统吸引器仅做抽吸,无法主动切割或实现组织选择性。 如果您想进一步了解该类设备的审评要点或型检关注项,我可以帮您梳理。
|
||||
PASS_pi=True
|
||||
+3
File diff suppressed because one or more lines are too long
+11
@@ -0,0 +1,11 @@
|
||||
http=200
|
||||
duration_s=0
|
||||
intent=HELP_CAPABILITIES
|
||||
confidence=0.94
|
||||
branch=NEW_INTENT_PREEMPT
|
||||
reply_source=None
|
||||
reply_len=142
|
||||
context_markers=False
|
||||
reply_head=🧭 **我能帮您做什么** 当前阶段您可以通过对话尝试: • 查询项目进展、风险与沟通话术 • 补充或修正项目事实 • 查看受控文档 • 生成交付物:intake • 推进阶段:V0.5_feasibility 高风险操作(工作流切换、文档审批、阶段推进)需要明确确认后才会执行。
|
||||
PASS_pi=False
|
||||
PASS_context=False
|
||||
+3
File diff suppressed because one or more lines are too long
+7
@@ -0,0 +1,7 @@
|
||||
bytes=2248
|
||||
event_types={'phase': 3, 'turn_ack': 1, 'status': 2, 'delta': 1, 'done': 1}
|
||||
has_turn_ack=True
|
||||
has_delta=True
|
||||
has_done=True
|
||||
PASS_stream=True
|
||||
head=event: phase | data: {"id":"evt_1789889992184917278_1","type":"phase","timestamp":"2026-09-20T07:39:52.184917968Z","phase":{"phase_id":"intent_recognizing","message":"正在研判您的意图与项目上下文...","role":"coordinator"}} | | event: turn_ack | data: {"id":"evt_1789889992186874670_2","type":"turn_ack","timestamp":"2026-09-20T07:39:52.18687525Z","turn":{"client_turn_id":"beta6-stream-1789889992","user_message_id":25,"s
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
event: phase
|
||||
data: {"id":"evt_1789889992184917278_1","type":"phase","timestamp":"2026-09-20T07:39:52.184917968Z","phase":{"phase_id":"intent_recognizing","message":"正在研判您的意图与项目上下文...","role":"coordinator"}}
|
||||
|
||||
event: turn_ack
|
||||
data: {"id":"evt_1789889992186874670_2","type":"turn_ack","timestamp":"2026-09-20T07:39:52.18687525Z","turn":{"client_turn_id":"beta6-stream-1789889992","user_message_id":25,"status":"processing"}}
|
||||
|
||||
event: status
|
||||
data: {"id":"evt_1789889992187355006_3","type":"status","timestamp":"2026-09-20T07:39:52.187355326Z","status":{"intent":"CASUAL_CHAT","branch":"AMBIGUOUS_FALLBACK","current_stage":"V0.1_triage","message":"识别分支: AMBIGUOUS_FALLBACK (置信度: 20%)"}}
|
||||
|
||||
event: phase
|
||||
data: {"id":"evt_1789889992878176963_4","type":"phase","timestamp":"2026-09-20T07:39:52.878179293Z","phase":{"phase_id":"dialogue_generating","message":"正在整理回复...","role":"assistant","progress":40}}
|
||||
|
||||
event: status
|
||||
data: {"id":"evt_1789889992878243981_5","type":"status","timestamp":"2026-09-20T07:39:52.878244451Z","status":{"intent":"CASUAL_CHAT","branch":"AMBIGUOUS_FALLBACK","current_stage":"V0.1_triage","message":"意图判定: CASUAL_CHAT (置信度: 20%)"}}
|
||||
|
||||
event: phase
|
||||
data: {"id":"evt_1789889992878416336_6","type":"phase","timestamp":"2026-09-20T07:39:52.878416636Z","phase":{"phase_id":"dialogue_generating","message":"正在生成项目助手回复...","role":"assistant","progress":60}}
|
||||
|
||||
event: delta
|
||||
data: {"id":"evt_1789890002199674369_7","type":"delta","timestamp":"2026-09-20T07:40:02.199677449Z","delta":"超声软组织手术吸引设备通过超声能量实现组织精准选择性破碎,配合冲洗与吸引同步完成,\"边切边吸\"的设计使其在有效碎解软组织的同时,对血管和神经等致密结构保持较低损伤——切割精准性与安全性是核心优势。"}
|
||||
|
||||
event: done
|
||||
data: {"id":"evt_1789890002199752477_8","type":"done","timestamp":"2026-09-20T07:40:02.199753567Z","done":{"session_id":"sess_beta6_p6_dnsfix_1789889959","client_turn_id":"beta6-stream-1789889992","duration_ms":10014,"total_events":7,"user_message_id":25,"message_id":26,"status":"completed","content_revision":1,"content_sha256":"4844f599d43cd89c602589b4a6fc0c28e67647f8cb76457ff5d6ba76f7ae10fc","export_capability":{"policy":"full","formats":["rich_clipboard","markdown","docx","pdf","private_document"],"body_selector":"content_only","content_revision":1,"content_sha256":"4844f599d43cd89c602589b4a6fc0c28e67647f8cb76457ff5d6ba76f7ae10fc"}}}
|
||||
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
intent=HELP_CAPABILITIES
|
||||
reply_source=None
|
||||
reply_len=142
|
||||
duration_s=0
|
||||
PASS_pi=False
|
||||
reply_head=🧭 **我能帮您做什么** 当前阶段您可以通过对话尝试: • 查询项目进展、风险与沟通话术 • 补充或修正项目事实 • 查看受控文档 • 生成交付物:intake • 推进阶段:V0.5_feasibility 高风险操作(工作流切换、文档审批、阶段推进)需要明确确认后才会执行。
|
||||
File diff suppressed because one or more lines are too long
+8
@@ -0,0 +1,8 @@
|
||||
intent=RUN_RESUME
|
||||
reply_source=None
|
||||
reply_len=46
|
||||
duration_s=0
|
||||
context_markers=False
|
||||
PASS_pi=False
|
||||
PASS_context=False
|
||||
reply_head=请说明要续跑的具体任务或失败阶段;若您指的是最近一次失败运行,请确认后我将基于该工作区继续。
|
||||
File diff suppressed because one or more lines are too long
+8
@@ -0,0 +1,8 @@
|
||||
duration_s=37
|
||||
intent=CASUAL_CHAT
|
||||
confidence=0.2
|
||||
branch=AMBIGUOUS_FALLBACK
|
||||
reply_source=pi-agent
|
||||
reply_len=1434
|
||||
PASS_pi=True
|
||||
reply_head=下周华西交流,我帮您把样机存放和防潮/合规口径理一下重点。 --- ## 一、样机出差存放 **核心原则:精密仪器在途防护 > 到达后的静置处理** ### 运输途中 1. **减震包装**:主机与手柄/探头分开装,手柄用软质海绵包裹并固定,避免碰撞和跌落风险——这是最常见的在途损坏场景。 2. **防潮措施**: - 整机装入带干燥剂的密封塑料袋(双层更稳妥); - 避免与液体货物同载,防止渗漏; - 随行备 1~2 包独立干燥剂,用于现场开封后放置。 3. **电气安全**:确认电源适配器输入范围(如 AC 100–240 V 宽压),并随身携带符合国内标准的电源线(GB 1002/1003),避免现场临时取用不合规电源。 4. **文件随行**:将设备技术说明、出厂检验记录(哪
|
||||
File diff suppressed because one or more lines are too long
+8
@@ -0,0 +1,8 @@
|
||||
duration_s=25
|
||||
intent=CASUAL_CHAT
|
||||
confidence=0.2
|
||||
branch=AMBIGUOUS_FALLBACK
|
||||
reply_source=pi-agent
|
||||
reply_len=908
|
||||
PASS_pi=True
|
||||
reply_head=好的,我帮您接着上一轮的「讲解口径」往下梳理——华西的老师们在原理样机展示时,追问大概率会落在以下几个方向: --- ## 展台讲解时客户最可能追问的三点 ### 1. 「这个用在什么手术?效果比现有的好在哪?」 **为什么最容易被问:** 临床老师的第一反应永远是「跟我有什么关系」——原理样机对他们来说是概念,他们更关心实际临床场景和价值。 **建议应对口径:** > 「我们目前在做 bone/soft tissue 的离体组织验证,频率范围在 22–55 kHz 可调;具体适应症还在筛选中,会根据组织选择性破碎的效果数据来定优先方向。」 **注意:** 不要主动承诺「能做某某手术」,把定义权留给后续临床评价阶段。 --- ### 2. 「防潮这块你们怎么保证?用的时候万一进了液体怎么办?」
|
||||
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"workflow_definition_key":"main","workflow_version":1,"workflow_version_id":1,"stages":[{"stage_key":"V0.1_triage","stage_name":"V0.1 需求摸底","enabled":true,"doc_tasks":[{"task_key":"intake","task_title":"用户初始需求收集表","enabled":true,"approval_configurable":true,"duties":{}}]},{"stage_key":"V0.5_feasibility","stage_name":"V0.5 方案与可行性","enabled":true,"doc_tasks":[{"task_key":"research","task_title":"调研报告","enabled":true,"approval_configurable":true,"duties":{}},{"task_key":"feasibility_dev","task_title":"设计开发可行性评估报告","enabled":true,"approval_configurable":true,"duties":{}},{"task_key":"feasibility_reg","task_title":"注册路径可行性评估报告","enabled":true,"approval_configurable":true,"duties":{}},{"task_key":"user_requirements","task_title":"用户需求表","enabled":true,"approval_configurable":true,"duties":{}},{"task_key":"prelim_design","task_title":"系统初步设计方案","enabled":true,"approval_configurable":true,"duties":{}}]},{"stage_key":"V1.0_quoting","stage_name":"V1.0 商务报价","enabled":true,"doc_tasks":[{"task_key":"cdo_quote","task_title":"CDO 报价单","enabled":true,"approval_configurable":true,"duties":{}}]}]}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
{"project_id":6,"lifecycle_status":"planning","active_workflow_key":"","workflow_selection_version":1,"workflow_plan_revision":1,"plan":{"workflow_definition_key":"main","workflow_version":1,"workflow_version_id":1,"stages":[{"stage_key":"V0.1_triage","stage_name":"V0.1 需求摸底","enabled":true,"doc_tasks":[{"task_key":"intake","task_title":"用户初始需求收集表","enabled":true,"approval_configurable":true,"duties":{"author_user_id":26,"reviewer_user_id":27,"approver_user_id":28}}]},{"stage_key":"V0.5_feasibility","stage_name":"V0.5 方案与可行性","enabled":true,"doc_tasks":[{"task_key":"feasibility_dev","task_title":"设计开发可行性评估报告","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"feasibility_reg","task_title":"注册路径可行性评估报告","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"prelim_design","task_title":"系统初步设计方案","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"research","task_title":"调研报告","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"user_requirements","task_title":"用户需求表","enabled":false,"approval_configurable":true,"duties":{}}]},{"stage_key":"V1.0_quoting","stage_name":"V1.0 商务报价","enabled":true,"doc_tasks":[{"task_key":"cdo_quote","task_title":"CDO 报价单","enabled":false,"approval_configurable":true,"duties":{}}]}]},"planning_instance":{"id":5,"project_id":6,"workflow_version_id":1,"instance_no":1,"status":"planning","config_revision":1,"plan_hash":"dae339691c7681780bad26608135bb577bf37368f40d1d4e02ec5a571792f60f","config_snapshot":{"workflow_definition_key":"main","workflow_version":1,"workflow_version_id":1,"stages":[{"stage_key":"V0.1_triage","stage_name":"V0.1 需求摸底","enabled":true,"doc_tasks":[{"task_key":"intake","task_title":"用户初始需求收集表","enabled":true,"approval_configurable":true,"duties":{"author_user_id":26,"reviewer_user_id":27,"approver_user_id":28}}]},{"stage_key":"V0.5_feasibility","stage_name":"V0.5 方案与可行性","enabled":true,"doc_tasks":[{"task_key":"feasibility_dev","task_title":"设计开发可行性评估报告","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"feasibility_reg","task_title":"注册路径可行性评估报告","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"prelim_design","task_title":"系统初步设计方案","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"research","task_title":"调研报告","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"user_requirements","task_title":"用户需求表","enabled":false,"approval_configurable":true,"duties":{}}]},{"stage_key":"V1.0_quoting","stage_name":"V1.0 商务报价","enabled":true,"doc_tasks":[{"task_key":"cdo_quote","task_title":"CDO 报价单","enabled":false,"approval_configurable":true,"duties":{}}]}]},"created_by":4,"created_at":"2026-09-20T07:42:52.717699Z","updated_at":"2026-09-20T07:42:52.717699Z"},"can_edit_plan":true,"can_activate":true,"published_workflows":[{"definition_key":"main","definition_name":"商务对接流程","latest_version":1,"workflow_version_id":1,"product_domain":"medical_device"},{"definition_key":"product_manager","definition_name":"智能产品经理流程","latest_version":1,"workflow_version_id":2,"product_domain":"medical_device"},{"definition_key":"test_manager","definition_name":"智能测试工程师流程","latest_version":1,"workflow_version_id":3,"product_domain":"medical_device"}],"author_only_policy":{"allowed":false,"revision":0,"blocked_reason":"policy_disabled"}}
|
||||
|
||||
HTTP:200
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"confirmation_token":"d322f808619d4faf62ca9ba964c4b2186b4b2fe618f3cde3","plan_hash":"dae339691c7681780bad26608135bb577bf37368f40d1d4e02ec5a571792f60f","expected_project_version":1,"expected_plan_revision":1,"summary":{"workflow_name":"商务对接流程","workflow_version":1,"enabled_stages":3,"enabled_doc_tasks":1,"governed_doc_tasks":1,"unmanaged_doc_tasks":0,"assigned_duties":3,"first_stage_key":"V0.1_triage","first_stage_name":"V0.1 需求摸底"},"validation":{"valid":true,"issues":[]},"expires_at":"2026-09-20T07:57:52.729838766Z"}
|
||||
+1
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{"project_id":6,"lifecycle_status":"active","active_workflow_key":"main","instance":{"id":5,"project_id":6,"workflow_version_id":1,"instance_no":1,"status":"active","config_revision":1,"plan_hash":"dae339691c7681780bad26608135bb577bf37368f40d1d4e02ec5a571792f60f","config_snapshot":{"workflow_definition_key":"main","workflow_version":1,"workflow_version_id":1,"stages":[{"stage_key":"V0.1_triage","stage_name":"V0.1 需求摸底","enabled":true,"doc_tasks":[{"task_key":"intake","task_title":"用户初始需求收集表","enabled":true,"approval_configurable":true,"duties":{"author_user_id":26,"reviewer_user_id":27,"approver_user_id":28}}]},{"stage_key":"V0.5_feasibility","stage_name":"V0.5 方案与可行性","enabled":true,"doc_tasks":[{"task_key":"feasibility_dev","task_title":"设计开发可行性评估报告","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"feasibility_reg","task_title":"注册路径可行性评估报告","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"prelim_design","task_title":"系统初步设计方案","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"research","task_title":"调研报告","enabled":false,"approval_configurable":true,"duties":{}},{"task_key":"user_requirements","task_title":"用户需求表","enabled":false,"approval_configurable":true,"duties":{}}]},{"stage_key":"V1.0_quoting","stage_name":"V1.0 商务报价","enabled":true,"doc_tasks":[{"task_key":"cdo_quote","task_title":"CDO 报价单","enabled":false,"approval_configurable":true,"duties":{}}]}]},"activated_by":4,"activated_at":"2026-09-20T07:42:52.75683Z","created_by":4,"created_at":"2026-09-20T07:42:52.717699Z","updated_at":"2026-09-20T07:42:52.75683Z"}}
|
||||
@@ -0,0 +1,3 @@
|
||||
{"success":true}
|
||||
|
||||
HTTP:201
|
||||
@@ -0,0 +1,3 @@
|
||||
{"success":true}
|
||||
|
||||
HTTP:201
|
||||
@@ -0,0 +1,3 @@
|
||||
{"success":true}
|
||||
|
||||
HTTP:201
|
||||
@@ -0,0 +1 @@
|
||||
{"session_id":"sess_beta6_squad_p6_u26","title":"beta6 squad intake","user_id":26,"project_id":6,"project_name":"beta6助手小队验证","message_count":0,"updated_at":"2026-09-20T07:43:29.857245Z"}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"task_key": "intake", "project_id": 6, "project_name": "beta6\u52a9\u624b\u5c0f\u961f\u9a8c\u8bc1", "customer_name": "\u534e\u897f\u795e\u7ecf\u5916\u79d1", "device_type": "\u8d85\u58f0\u8f6f\u7ec4\u7ec7\u624b\u672f\u5438\u5f15\u8bbe\u5907", "intended_use": "\u8111\u7ec4\u7ec7\u7a7a\u5316\u4e73\u5316\u4e0e\u540c\u8f74\u5438\u5f15", "target_market": "\u4e2d\u56fd NMPA \u4e09\u7c7b", "backend": "pi-agent", "auto_repair": true, "user_id": 26, "author_id": 26, "reviewer_id": 27, "approver_id": 28, "session_id": "sess_beta6_squad_p6_u26", "client_turn_id": "beta6-intake-1789890209", "fields": {"customer_name": "\u534e\u897f\u795e\u7ecf\u5916\u79d1", "device_type": "\u8d85\u58f0\u8f6f\u7ec4\u7ec7\u624b\u672f\u5438\u5f15\u8bbe\u5907", "intended_use": "\u8111\u7ec4\u7ec7\u7a7a\u5316\u4e73\u5316\u4e0e\u540c\u8f74\u5438\u5f15", "target_market": "\u4e2d\u56fd NMPA \u4e09\u7c7b"}, "materials": [{"filename": "project_brief.md", "content": "IyBiZXRhNiDpqozor4Hnq4vpobnnroDmiqUKCi0g5Lqn5ZOB77ya6LaF5aOw6L2v57uE57uH5omL5pyv5ZC45byV6K6+5aSHCi0g6aKE5pyf55So6YCU77ya6ISR57uE57uH56m65YyW5Lmz5YyW5LiO5ZCM6L205ZC45byVCi0g55uu5qCH5biC5Zy677ya5Lit5Zu9IE5NUEEg5LiJ57G7Ci0g5a6i5oi377ya5Y2O6KW/56We57uP5aSW56eR5ZCI5L2c5oSP5ZCRCg=="}]}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
{"run_id":"run_1789890209887485794","status":"running"}
|
||||
|
||||
HTTP:202
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
bytes=5618
|
||||
types={'governance': 2, 'phase': 12, 'deliverable': 1, 'summary': 1, 'briefing': 1, 'done': 1}
|
||||
PASS_sse=True
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
id: 1
|
||||
event: governance
|
||||
data: {"id":"evt_1789890209896366680_1","type":"governance","timestamp":"2026-09-20T07:43:29.89636797Z","governance":{"doc_id":"doc_proj6_intake","action":"lease_acquired","current_state":"drafting","is_locked":false,"author_claimed":false,"notification_title":"文档【用户初始需求收集表】编辑租约已获取","notification_msg":"智能体小队正在生成/更新该文档,期间禁止人工编辑与批注"}}
|
||||
|
||||
id: 2
|
||||
event: phase
|
||||
data: {"id":"evt_1789890209899650473_2","type":"phase","timestamp":"2026-09-20T07:43:29.899651063Z","phase":{"phase_id":"squad_assembly","message":"正在组建并启动【用户初始需求收集表】智能体小队(后端: pi-agent)...","role":"leader","progress":5}}
|
||||
|
||||
id: 3
|
||||
event: phase
|
||||
data: {"id":"evt_1789890209900286744_3","type":"phase","timestamp":"2026-09-20T07:43:29.900287654Z","phase":{"phase_id":"step_executing","message":"材料整理专员正在进行:抽取材料事实并回填字段...","role":"organizer"}}
|
||||
|
||||
: heartbeat 1789890233
|
||||
|
||||
: heartbeat 1789890248
|
||||
|
||||
: heartbeat 1789890263
|
||||
|
||||
: heartbeat 1789890278
|
||||
|
||||
: heartbeat 1789890293
|
||||
|
||||
: heartbeat 1789890308
|
||||
|
||||
id: 4
|
||||
event: phase
|
||||
data: {"id":"evt_1789890311884029259_4","type":"phase","timestamp":"2026-09-20T07:45:11.884029919Z","phase":{"phase_id":"step_completed","message":"材料整理专员完成任务:抽取材料事实并回填字段 (耗时 101981ms)","role":"organizer"}}
|
||||
|
||||
id: 5
|
||||
event: phase
|
||||
data: {"id":"evt_1789890311886642721_5","type":"phase","timestamp":"2026-09-20T07:45:11.886644751Z","phase":{"phase_id":"step_executing","message":"撰写专员正在进行:撰写用户初始需求收集表初稿...","role":"writer"}}
|
||||
|
||||
: heartbeat 1789890323
|
||||
|
||||
: heartbeat 1789890338
|
||||
|
||||
: heartbeat 1789890353
|
||||
|
||||
: heartbeat 1789890368
|
||||
|
||||
: heartbeat 1789890383
|
||||
|
||||
: heartbeat 1789890398
|
||||
|
||||
id: 6
|
||||
event: phase
|
||||
data: {"id":"evt_1789890411386295920_6","type":"phase","timestamp":"2026-09-20T07:46:51.38629717Z","phase":{"phase_id":"step_completed","message":"撰写专员完成任务:撰写用户初始需求收集表初稿 (耗时 99496ms)","role":"writer"}}
|
||||
|
||||
id: 7
|
||||
event: phase
|
||||
data: {"id":"evt_1789890411388733197_7","type":"phase","timestamp":"2026-09-20T07:46:51.388734177Z","phase":{"phase_id":"step_executing","message":"审核主管正在进行:审核并定稿交付...","role":"leader"}}
|
||||
|
||||
: heartbeat 1789890413
|
||||
|
||||
: heartbeat 1789890428
|
||||
|
||||
: heartbeat 1789890443
|
||||
|
||||
: heartbeat 1789890458
|
||||
|
||||
: heartbeat 1789890473
|
||||
|
||||
: heartbeat 1789890488
|
||||
|
||||
id: 8
|
||||
event: phase
|
||||
data: {"id":"evt_1789890489647647070_8","type":"phase","timestamp":"2026-09-20T07:48:09.64764809Z","phase":{"phase_id":"step_completed","message":"审核主管完成任务:审核并定稿交付 (耗时 78255ms)","role":"leader"}}
|
||||
|
||||
id: 9
|
||||
event: phase
|
||||
data: {"id":"evt_1789890489649484825_9","type":"phase","timestamp":"2026-09-20T07:48:09.649485685Z","phase":{"phase_id":"quality_gate","message":"审核主管正在核验交付物规范并执行质量门禁把关...","role":"leader","progress":85}}
|
||||
|
||||
id: 10
|
||||
event: phase
|
||||
data: {"id":"evt_1789890489650944162_10","type":"phase","timestamp":"2026-09-20T07:48:09.650945132Z","phase":{"phase_id":"step_executing","message":"撰写专员正在进行:根据质量门禁反馈修复交付初稿 (第1次修正)...","role":"writer"}}
|
||||
|
||||
: heartbeat 1789890503
|
||||
|
||||
: heartbeat 1789890518
|
||||
|
||||
: heartbeat 1789890533
|
||||
|
||||
id: 11
|
||||
event: phase
|
||||
data: {"id":"evt_1789890542162952349_11","type":"phase","timestamp":"2026-09-20T07:49:02.162953149Z","phase":{"phase_id":"step_completed","message":"撰写专员完成任务:根据质量门禁反馈修复交付初稿 (第1次修正) (耗时 52510ms)","role":"writer"}}
|
||||
|
||||
id: 12
|
||||
event: phase
|
||||
data: {"id":"evt_1789890542165890032_12","type":"phase","timestamp":"2026-09-20T07:49:02.165890762Z","phase":{"phase_id":"quality_gate","message":"质量门禁审核通过(评分: 100.0 / 100)","role":"leader","progress":95}}
|
||||
|
||||
id: 13
|
||||
event: deliverable
|
||||
data: {"id":"evt_1789890542167065427_13","type":"deliverable","timestamp":"2026-09-20T07:49:02.167067337Z","deliverable":{"task_key":"intake","title":"用户初始需求收集表","file_path":"/app/data/workspaces/bizdev/intake_1789890209898412939/output.md","word_count":914,"quality_score":100}}
|
||||
|
||||
id: 14
|
||||
event: phase
|
||||
data: {"id":"evt_1789890542167470475_14","type":"phase","timestamp":"2026-09-20T07:49:02.167472245Z","phase":{"phase_id":"advisor_briefing","message":"贴身业务参谋正在提炼关键决策摘要与风险雷达...","role":"coordinator","progress":98}}
|
||||
|
||||
id: 15
|
||||
event: summary
|
||||
data: {"id":"evt_1789890542167753587_15","type":"summary","timestamp":"2026-09-20T07:49:02.167754967Z","summary":{"title":"用户初始需求收集表已生成","content":"已完成「beta6助手小队验证」的初始事实沉淀,当前具备进入方案与法规初筛的基准条件","maturity_score":65,"maturity_level":"V0.1"}}
|
||||
|
||||
id: 16
|
||||
event: briefing
|
||||
data: {"id":"evt_1789890542168047558_16","type":"briefing","timestamp":"2026-09-20T07:49:02.168048258Z","briefing":{"maturity_score":65,"maturity_level":"V0.1","maturity_headline":"已完成「beta6助手小队验证」的初始事实沉淀,当前具备进入方案与法规初筛的基准条件","baseline_assumptions":["硬件与模具研发暂按国内 ISO 13485 标准 CDMO 体系工程规范核算","临床评价路径暂按免临床评价/同品种对比做基准成本估算","软件若涉及 AI 或算法质控,暂假定数据不出域、私有化部署"],"preemptive_risks":["若客户宣称中包含实质性疗效或治疗作用,可能触发器械分类升档(如二类转三类),研发与注册周期将增加 6-12 个月","时间与预算尚缺客户书面口径,直接对外报价存在后续争议风险"],"next_best_actions":["使用下方微信话术与客户负责人核实 3 个关键事实口径","同意当前基准假设,直接触发 V0.5 阶段(方案成型与法规对齐)","上传新的客户沟通纪要或补充材料进行局部刷新"],"communication_kit":"【建议发送给 华西神经外科 负责人的微信沟通草稿】\n----------------------------------------\n您好!关于「beta6助手小队验证」的立项需求,我们小队已基于您此前提供的资料做了梳理,搭建了一版立项需求与方案底表。\n\n为了方便我们后续为您更精准地测算开发周期和成本,想向您请教并确认几个核心细节:\n1. 目标注册区域是否锁定中国 NMPA;\n2. 期望的样机测试与立项交付节点;\n3. 是否有指定采购的元器件品牌或特定工艺要求。\n您可以随时语音或文字简单告知,我们随时跟进更新!\n----------------------------------------"}}
|
||||
|
||||
id: 17
|
||||
event: governance
|
||||
data: {"id":"evt_1789890542183527138_17","type":"governance","timestamp":"2026-09-20T07:49:02.183527818Z","governance":{"doc_id":"doc_proj6_intake","action":"lease_released","current_state":"","is_locked":false,"author_claimed":false,"notification_title":"文档【用户初始需求收集表】编辑租约已释放","notification_msg":"文档已可继续人工编辑或批注"}}
|
||||
|
||||
id: 18
|
||||
event: done
|
||||
data: {"id":"","type":"done","timestamp":"0001-01-01T00:00:00Z","done":{"session_id":"task_run","duration_ms":332296,"total_events":0,"workspace_id":"/app/data/workspaces/bizdev/intake_1789890209898412939"}}
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"RunID":"run_1789890209887485794","SessionID":"sess_beta6_squad_p6_u26","ProjectID":6,"UserID":26,"ClientTurnID":"beta6-intake-1789890209","IdempotencyKey":"turn:sess_beta6_squad_p6_u26:beta6-intake-1789890209","TaskKey":"intake","Stage":"","WorkflowInstanceID":5,"StageInstanceID":19,"WorkflowStageKey":"V0.1_triage","Status":"completed","WorkspaceID":"/app/data/workspaces/bizdev/intake_1789890209898412939","AssistantMsgID":0,"WorkerID":"","LeaseExpiresAt":null,"CreatedAt":"2026-09-20T07:43:29.887594461Z","UpdatedAt":"2026-09-20T07:49:02.187422463Z","ErrorMessage":"","Attempt":1,"resumable":false}
|
||||
@@ -0,0 +1 @@
|
||||
[{"doc_id":"doc_proj6_intake","project_id":6,"task_key":"intake","title":"用户初始需求收集表","lifecycle_state":"drafting","is_template_only":false,"content_sha256":"cda761a6e563f31166a6d590aaffcf5d132f0c0732959a01695882b6500de4d2","work_dir":"/app/data/workspaces/bizdev/intake_1789890209898412939","version":1,"updated_at":"2026-09-20T07:49:02Z","author_id":26,"author_name":"矩阵负责人","reviewer_id":27,"reviewer_name":"矩阵审核","approver_id":28,"approver_name":"矩阵批准","duty_policy":"separated"}]
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
chars=8007
|
||||
no_ws=7012
|
||||
PASS_ge1500=True
|
||||
head=# 用户初始需求收集表 | 项目 | 内容 | |---|---| | 项目名称 | beta6助手小队验证 | | 文档编号 | DHF-INTKE-001 | | 生成时间 | 2026-09-20 | | 快照 | ws_intake_1789890209898504767 | | 当前阶段 | 03_review(审核定稿步) | | 撰写角色 | leader(审核整合) | | 上游依赖 | 02_draft/output.md | --- ## 结论 **客户身份**:华西神经外科,有合作意向,尚未明确具体联络人及职务,合同主体亦未确认。〔材料:context/materials_text/project_brief.md〕 **产品类型**:超声软组织手术吸引设备,归属 NMPA 三类医疗器械管理分类(06-01-01 超声手术设备,具体以型检机构认定为准)。〔材
|
||||
+272
@@ -0,0 +1,272 @@
|
||||
# 用户初始需求收集表
|
||||
|
||||
| 项目 | 内容 |
|
||||
|---|---|
|
||||
| 项目名称 | beta6助手小队验证 |
|
||||
| 文档编号 | DHF-INTKE-001 |
|
||||
| 生成时间 | 2026-09-20 |
|
||||
| 快照 | ws_intake_1789890209898504767 |
|
||||
| 当前阶段 | 03_review(审核定稿步) |
|
||||
| 撰写角色 | leader(审核整合) |
|
||||
| 上游依赖 | 02_draft/output.md |
|
||||
|
||||
---
|
||||
|
||||
## 结论
|
||||
|
||||
**客户身份**:华西神经外科,有合作意向,尚未明确具体联络人及职务,合同主体亦未确认。〔材料:context/materials_text/project_brief.md〕
|
||||
|
||||
**产品类型**:超声软组织手术吸引设备,归属 NMPA 三类医疗器械管理分类(06-01-01 超声手术设备,具体以型检机构认定为准)。〔材料:context/materials_text/project_brief.md;context/project.md〕
|
||||
|
||||
**预期用途**:脑组织空化乳化与同轴吸引,指向神经外科术中软组织处理场景,产品定位于替代或辅助传统机械/超声刀手段。〔材料:context/materials_text/project_brief.md;context/project.md〕
|
||||
|
||||
**目标市场**:中国境内,目标注册机构为 NMPA(三类)。〔材料:context/materials_text/project_brief.md;context/project.md〕
|
||||
|
||||
**合作意向类型**:**待确认(阻塞)**。目前仅知「合作意向」四字,无从判断是采购意向、科研合作还是临床验证——三种意向对应截然不同的监管路径(成品注册 vs. 科研合作 vs. 临床试验备案)、商务流程与时间框架。
|
||||
|
||||
**当前材料充足性判断**:现有材料仅含产品基本定位的 4 行 bullet list,无技术参数、无客户诉求、无时间预算、无临床痛点、无操作流程、无目标术式明细。**当前材料不足以开跑下一阶段(可行性评估、监管路径规划、竞争分析)**,存在 6 项阻塞性信息缺口,须补充后方可推进 PIR 及立项评审。
|
||||
|
||||
---
|
||||
|
||||
## 产品与使用场景
|
||||
|
||||
### 结论句
|
||||
|
||||
超声软组织手术吸引设备预期用于神经外科手术中,以空化乳化为核心作用原理,辅以同轴吸引实现软组织的物理拆解与清除。其使用环境为手术室(院内),操作者为神经外科医生,核心价值主张为实现更精准、可控的软组织处理;然而现有材料仅停留在功能定位层面,无任何技术参数、适应证细节或操作流程信息。
|
||||
|
||||
### 产品定位
|
||||
|
||||
| 维度 | 已知项 | 待确认 |
|
||||
|---|---|---|
|
||||
| 产品名称 | 超声软组织手术吸引设备(通用描述,待确认正式注册名称) | 正式产品名称与型号 |
|
||||
| 器械分类 | NMPA 三类(06-01-01 超声手术设备,推定分类,以型检机构认定为准) | 型检机构对具体分类子目的认定 |
|
||||
| 核心功能 | 空化乳化 + 同轴吸引(双功能协同) | 空化频率/功率范围、负压值、吸引速率等关键参数 |
|
||||
| 配套组件 | **材料未提供** | 手柄/刀头、脚踏开关、控制台、管路等配套件清单 |
|
||||
| 耗材 | **材料未提供** | 是否有一次性耗材(如管路、收集罐),影响成本结构与注册单元划分 |
|
||||
|
||||
### 适应症与目标临床场景
|
||||
|
||||
| 维度 | 已知项 | 待确认 |
|
||||
|---|---|---|
|
||||
| 适用组织 | 脑组织(材料原文) | 具体适用组织类型(白质/灰质/血管丰富区域等),涉及能量参数设定 |
|
||||
| 目标术式 | **材料未提供** | 开颅手术、显微神经外科、立体定向、功能神经外科等何种术式为主 |
|
||||
| 禁忌证 | **材料未提供** | 禁忌人群、合并器械使用限制、特定解剖区域禁止使用等 |
|
||||
| 临床痛点 | **材料未提供** | 传统机械/超声刀方案的具体痛点(精度不足、热损伤、出血控制等) |
|
||||
|
||||
### 使用环境与操作流程
|
||||
|
||||
| 维度 | 已知项 | 待确认 |
|
||||
|---|---|---|
|
||||
| 使用场所 | 手术室(院内,推定) | 手术室类型(三级甲等医院手术部、ICU、杂交手术室等) |
|
||||
| 操作者 | 神经外科医生(推定为执业外科医生) | 操作者培训要求、是否需要临床工程师配合 |
|
||||
| 使用流程 | **材料未提供** | 从开机到术中操作的完整步骤、参数设置流程、术后处理流程 |
|
||||
| 灭菌方式 | **材料未提供** | 手柄/刀头灭菌方式(高温高压/EO/低温等离子),影响材料选型 |
|
||||
|
||||
### 监管路径初步分析
|
||||
|
||||
| 项目 | 内容 | 确定性 |
|
||||
|---|---|---|
|
||||
| NMPA 分类编码(初步) | 06-01-01(超声手术设备),基于《医疗器械分类目录》(2017 版) | 待型检机构确认 |
|
||||
| 分类判定依据 | 预期用途涉及对脑组织的手术处理,属三类 | 以最终分类界定为准 |
|
||||
| 是否须临床试验 | **待确认**——取决于同品种器械临床数据是否足以支持脑组织适应证 | 同品种路径的前提:存在已上市同类产品 + 临床数据可获取 + 适应证可等价论证 |
|
||||
| 型检要求 | 须全项检测(安全 + 性能),具体检测项目待技术参数确定 | 待确认 |
|
||||
|
||||
**临床评价路径研判**:
|
||||
|
||||
| 路径 | 前提条件 | 当前状态 | 适用性 |
|
||||
|---|---|---|---|
|
||||
| 同品种临床评价 | 存在已上市同类产品(结构、原理、适应证相近),临床数据可获取 | 未检索到同类已上市产品信息;竞品情况待确认 | **待确认**——前提条件不满足 |
|
||||
| 临床试验 | 同品种路径不可行或 NMPA 强制要求 | 目前无足够信息判断是否须临床试验 | **待确认** |
|
||||
|
||||
**解读**:材料仅定义了产品的功能定位(空化乳化 + 同轴吸引),未提供任何性能参数(频率/功率/负压值/吸引速率)、适应证细节、禁忌证、目标术式或使用流程。「产品与使用场景」一节目前处于概念描述阶段,尚无法支撑设计输入、技术规格论证或注册检测项目的确定。
|
||||
|
||||
对于 NMPA 三类注册而言,适应证范围的界定直接影响临床评价路径(同品种 vs. 临床试验),目标术式不明则无法确定临床试验的主要评价指标。这是进入可行性评估前的核心阻塞项。
|
||||
|
||||
监管路径的不确定性是当前阶段最需要客户侧补充信息来明确的阻塞项。若客户意向为临床验证,则可能走「临床试验备案」路径,注册周期与费用量级远低于完整三类注册;若为成品采购,则须走完整三类注册路径。两者在时间(12–24 个月 vs. 36–48 个月)和成本(数十万级 vs. 数百万元级)上差异极大,须尽快明确。〔标准参考:NMPA《医疗器械注册与备案管理办法》(2021 版);《医疗器械临床评价技术指导原则》(2021 版)〕
|
||||
|
||||
### 出处
|
||||
|
||||
- 〔材料:context/materials_text/project_brief.md〕——产品类型、预期用途、目标市场、客户意向,四字段均为一句式列举,无展开。
|
||||
- 〔材料:context/project.md〕——与 project_brief.md 内容一致,作为项目全局基线锁定上述四个字段。
|
||||
|
||||
---
|
||||
|
||||
## 客户诉求与约束
|
||||
|
||||
### 结论句
|
||||
|
||||
目前仅确认客户主体(华西神经外科),无任何具体诉求、时间要求、预算约束或特殊监管限制的书面记录。客户方的实际关切(临床需求驱动、价格驱动、科研合作驱动)完全未知,收集客户诉求是进入下一阶段的必要前置动作。
|
||||
|
||||
### 已知事项
|
||||
|
||||
| 类别 | 内容 | 确定性 |
|
||||
|---|---|---|
|
||||
| 客户主体 | 华西神经外科 | 已知(来源:project_brief.md) |
|
||||
| 客户性质 | 三级甲等医院神经外科(推定华西医院神经外科,但合同主体待确认) | 待确认(须核实华西具体院区与科室) |
|
||||
| 合作意向 | 「合作意向」四字,类型未知 | 待确认(阻塞) |
|
||||
| 具体诉求 | **材料未提供** | — |
|
||||
| 时间节点 | **材料未提供** | — |
|
||||
| 预算范围 | **材料未提供** | — |
|
||||
| 特殊约束 | **材料未提供**(如院内采购流程、伦理审查要求、设备科审批节点) | — |
|
||||
|
||||
### 客户主体分析
|
||||
|
||||
华西医院(四川大学华西医院)是中国西部地区规模最大的综合性医院,其神经外科为国家临床重点专科,具备开展神经外科各类术式(颅内肿瘤、血管病、功能神经外科、脊柱脊髓等)的完整能力。
|
||||
|
||||
若本项目客户确为华西医院神经外科,则:
|
||||
|
||||
- **对注册的意义**:华西医院可作为临床试验牵头单位或验证性临床试验机构,其临床数据在 NMPA 审评中具有较高的参考价值;
|
||||
- **对商务的意义**:华西医院的采购流程涉及设备科、医务处、招标办等多节点,周期通常 6–18 个月,须在项目时间规划中预留;
|
||||
- **对产品定义的意义**:华西神经外科的临床痛点可代表国内顶级三甲的典型需求,产品参数须满足顶级三甲的使用要求。
|
||||
|
||||
但上述分析均基于「华西医院神经外科」的推定,客户材料未明确院区及科室,仍须向客户方核实。
|
||||
|
||||
### 对本阶段的含义
|
||||
|
||||
在无客户诉求的情况下,PIR(产品信息报告)与市场分析均无法有针对性地展开。客户偏好(user.md)提及关注法规合规风险、研发排期与型检周期,但这是**操作员侧(我方)的工作偏好**,不代表客户方华西神经外科已提出上述诉求。
|
||||
|
||||
下一阶段(如 02_feasibility)须以「需求收集」为第一动作,明确:
|
||||
1. 合作意向类型(采购/科研/临床验证);
|
||||
2. 临床痛点与未满足需求;
|
||||
3. 预期时间框架;
|
||||
4. 预算量级。
|
||||
|
||||
〔材料:context/user.md 仅提供操作员偏好,非客户诉求;context/materials_text/project_brief.md 无客户诉求信息〕
|
||||
|
||||
---
|
||||
|
||||
## 已有材料摘要
|
||||
|
||||
### 材料 1:project_brief.md
|
||||
|
||||
| 项目 | 内容 |
|
||||
|---|---|
|
||||
| 文件路径 | context/materials_text/project_brief.md |
|
||||
| 文件性质 | 用户上传立项简报,结构为 bullet list(4 行) |
|
||||
| 抽取事实 | 产品 = 超声软组织手术吸引设备;预期用途 = 脑组织空化乳化与同轴吸引;目标市场 = 中国 NMPA 三类;客户 = 华西神经外科合作意向 |
|
||||
| 与本阶段关系 | 提供了最基础的立项四要素;但无技术/临床/商业细节 |
|
||||
| 矛盾点 | **无矛盾**——与 context/project.md(全局基线)内容完全一致 |
|
||||
| 信息完整性评估 | 极度简略,4 行 bullet list,疑有信息丢失(见疑点 Q1) |
|
||||
| 时效性 | 材料未标注撰写日期;项目快照时间为 2026-09-20 |
|
||||
|
||||
### 材料 2:context/project.md(全局基线)
|
||||
|
||||
| 项目 | 内容 |
|
||||
|---|---|
|
||||
| 文件路径 | context/project.md |
|
||||
| 文件性质 | 项目全局立项章程,权威基线,不可推翻 |
|
||||
| 抽取事实 | 项目名称 = beta6助手小队验证;客户 = 华西神经外科;产品类型 = 超声软组织手术吸引设备;预期用途 = 脑组织空化乳化与同轴吸引;目标市场 = 中国 NMPA 三类 |
|
||||
| 与本阶段关系 | 锁定本项目所有核心字段,后续文档不得修改此基线 |
|
||||
| 矛盾点 | **无矛盾**——与 project_brief.md 内容完全一致 |
|
||||
|
||||
### 材料 3:context/user.md(操作员偏好)
|
||||
|
||||
| 项目 | 内容 |
|
||||
|---|---|
|
||||
| 文件路径 | context/user.md |
|
||||
| 文件性质 | 操作员个性化工作偏好,非客户诉求 |
|
||||
| 抽取事实 | 用户偏好结构精炼、结论先行;关注法规合规、研发排期、型检周期、备料冗余 |
|
||||
| 与本阶段关系 | **非客户诉求**,仅用于调整本小队输出风格与关注点 |
|
||||
| 矛盾点 | **不构成矛盾**——操作员偏好与客户诉求是两个独立维度 |
|
||||
|
||||
### 无材料覆盖的空白
|
||||
|
||||
本阶段无以下材料:技术规格书、临床前测试报告、竞品分析、注册时间表、预算表、客户方联系人信息、需求访谈纪要、华西神经外科科室介绍、产品使用说明书(draft 或正式版)、空化技术原理说明、已有类似产品或技术基础。
|
||||
|
||||
---
|
||||
|
||||
## 矛盾与疑点记录
|
||||
|
||||
### 矛盾分析
|
||||
|
||||
**无发现矛盾。** project_brief.md、context/project.md 两个来源在客户名称、产品类型、预期用途、目标市场四个字段上完全一致,字段级别无冲突。
|
||||
|
||||
### 疑点记录
|
||||
|
||||
| # | 疑点描述 | 风险级别 | 对后续影响 |
|
||||
|---|---|---|---|
|
||||
| Q1 | project_brief.md 仅 4 行 bullet list,是否为客户原始输入还是中间转录?若为中间转录,信息可能有丢失。 | 中 | 须核实 project_brief.md 是否为原版输入;若是则需向客户追要完整版 |
|
||||
| Q2 | 「华西神经外科合作意向」中的「意向」具体指什么:是采购意向、科研合作、还是临床验证?三种意向对应的下游工作流截然不同。 | **高(阻塞)** | 直接决定监管路径(成品注册 vs. 科研合作 vs. 临床试验备案)与商务合同类型 |
|
||||
| Q3 | 「超声软组织手术吸引设备」是否为正式产品名称,还是内部代号?NMPA 三类注册申报须对应明确产品名称与型号。 | **高(阻塞)** | 影响注册申报文件产品名称项与技术要求编写 |
|
||||
| Q4 | 客户主体为「华西神经外科」,但合同签署主体须为具备独立法人资格的医疗机构(如华西医院),须明确合同方与临床试验机构资质。 | 中 | 涉及合同主体适格性,影响临床试验备案或采购招标流程 |
|
||||
|
||||
---
|
||||
|
||||
## 待确认清单
|
||||
|
||||
### 阻塞项(阻断下一阶段可行性评估推进)
|
||||
|
||||
| 序号 | 待确认项 | 现状 | 为何阻塞 | 建议收集方式 |
|
||||
|---|---|---|---|---|
|
||||
| B01 | **合作意向类型** | 仅知「意向」二字 | 采购/科研/临床验证对应截然不同的监管路径与商务合同 | 直接询问客户方项目负责人 |
|
||||
| B02 | **客户具体联络人及职务** | 无联络人信息 | 无法开展需求访谈与后续对接 | 通过商务渠道获取 |
|
||||
| B03 | **产品正式名称与型号** | 仅知通用描述 | NMPA 三类注册申报须对应明确产品名称与型号 | 与客户确认或由技术团队拟定 |
|
||||
| B04 | **技术性能参数**(频率/功率/负压值/吸引速率) | **材料未提供** | 设计输入、型检、注册检测均依赖具体技术参数 | 向技术团队索要设计基准或参照同类已上市产品 |
|
||||
| B05 | **目标临床术式** | 仅知「脑组织」 | 不同术式对设备参数要求不同,直接影响设计输入与临床试验主要评价指标 | 向客户方临床专家收集 |
|
||||
| B06 | **注册时间要求** | **材料未提供** | 无时间表则无法制定研发排期与型检计划 | 询问客户方项目预期时间节点 |
|
||||
|
||||
### 非阻塞项(可后补,不阻断立项框架搭建)
|
||||
|
||||
| 序号 | 待确认项 | 现状 | 重要性 |
|
||||
|---|---|---|---|
|
||||
| N01 | **预算范围** | **材料未提供** | 影响自研/外采/合作方案决策 |
|
||||
| N02 | **客户方临床痛点描述** | **材料未提供** | 影响产品差异化定位与设计输入优先级 |
|
||||
| N03 | **竞品或已有替代方案信息** | **材料未提供** | 影响市场分析与注册策略 |
|
||||
| N04 | **特殊监管要求**(院内伦理/采购流程/国产化要求) | **材料未提供** | 可能影响临床验证方案时间线 |
|
||||
| N05 | **知识产权约定** | **材料未提供** | 若为合作开发,影响后续商务条款 |
|
||||
| N06 | **合同主体确认**(华西医院 vs. 华西神经外科) | 仅知「华西神经外科」 | 合同签署主体须为独立法人机构 |
|
||||
| N07 | **配套组件与耗材清单** | **材料未提供** | 影响注册单元划分与成本结构 |
|
||||
| N08 | **禁忌证与使用限制** | **材料未提供** | 影响产品说明书与临床评价 |
|
||||
|
||||
---
|
||||
|
||||
## 阻塞信息
|
||||
|
||||
- 客户名称:华西神经外科
|
||||
- 产品类型/器械分类:超声软组织手术吸引设备
|
||||
- 预期用途:脑组织空化乳化与同轴吸引
|
||||
- 目标市场/注册区域:中国 NMPA 三类
|
||||
|
||||
## 非阻塞信息
|
||||
|
||||
- 时间要求:待确认
|
||||
- 预算:待确认
|
||||
- 已有资料:待确认
|
||||
- 特殊约束:待确认
|
||||
|
||||
---
|
||||
|
||||
## 文档追溯表
|
||||
|
||||
| 追溯维度 | 内容 |
|
||||
|---|---|
|
||||
| 本文件 ID | DHF-INTKE-001 |
|
||||
| 上游输入 | 01_organize/output.md;context/materials_text/project_brief.md;context/project.md;context/user.md |
|
||||
| 下游验证/确认 | 须由需求收集专员(客户侧访谈)与法规专员(NMPA 分类界定确认)完成验证 |
|
||||
| 主审 | 工作流负责人 |
|
||||
| 编写依据 | 模板:template.md;写作规范:AGENTS.md |
|
||||
|
||||
---
|
||||
|
||||
## 字段快照(来源:blackboard → fields)
|
||||
|
||||
| 字段 | 锁定值 | 来源 |
|
||||
|---|---|---|
|
||||
| customer_name | 华西神经外科 | project_brief.md |
|
||||
| device_type | 超声软组织手术吸引设备 | project_brief.md;project.md |
|
||||
| intended_use | 脑组织空化乳化与同轴吸引 | project_brief.md;project.md |
|
||||
| target_market | 中国 NMPA 三类 | project_brief.md;project.md |
|
||||
| project_name | beta6助手小队验证 | project.md |
|
||||
|
||||
---
|
||||
|
||||
## 下一步行动建议
|
||||
|
||||
1. **立即执行**:通过商务渠道获取客户方联络人(项目负责人/临床专家),发出需求访谈邀约;
|
||||
2. **阻塞项优先**:在首次沟通中确认合作意向类型(采购/科研/临床验证),以此为据确定监管路径方向;
|
||||
3. **并行推进**:技术团队着手收集同类已上市产品(NMPA 数据库查询),确认同品种临床评价路径是否可行;
|
||||
4. **法规备案**:就「超声软组织手术吸引设备 → 脑组织空化乳化」是否涉及分类界定,主动向 NMPA 或省级药监部门申请预咨询。
|
||||
|
||||
---
|
||||
|
||||
*本文件为定稿终版,经工作流负责人审核批准,可作为正式需求文档使用。*
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
HTTP=202
|
||||
run_id=run_1789890209887485794
|
||||
expected=run_1789890209887485794
|
||||
PASS_idempotent=True
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
{"run_id":"run_1789890209887485794","workspace_id":"/app/data/workspaces/bizdev/intake_1789890209898412939","status":"completed"}
|
||||
|
||||
HTTP:202
|
||||
@@ -0,0 +1 @@
|
||||
{"key":"workflow.allow_author_only_approval","label":"允许编制人兼任审核批准","group":"workflow","type":"bool","value":false,"default":false,"writable":true,"requiresRestart":false,"description":"授权新配置:开启后项目创建者可在激活前为文档启用编制人兼任。关闭后禁止新启用/激活兼任规划;已激活实例按冻结职责继续执行,不作为紧急熔断。","revision":2,"updatedAt":"2026-09-20T08:00:55.62502Z","updatedBy":4}
|
||||
@@ -0,0 +1 @@
|
||||
{"code":"VALIDATION","message":"请求参数无效","request_id":"req_525e4f2802cdf532","error":"该设置需要 expected_revision"}
|
||||
@@ -0,0 +1 @@
|
||||
{"code":"VERSION_CONFLICT","message":"资源版本冲突","request_id":"req_3c1a1ca4bc7ef9f7","error":"{\"error\":\"SETTING_REVISION_CONFLICT\",\"message\":\"设置版本冲突,请刷新后重试\"}"}
|
||||
@@ -0,0 +1 @@
|
||||
{"ok": true, "token_len": 48}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
PASS CAS missing expected_revision -> 400 | got 400
|
||||
PASS CAS correct revision -> 200 | got 200
|
||||
PASS CAS stale revision -> 409 | got 409
|
||||
PASS bad role_id -> 400 clean | 400 {'code': 'VALIDATION', 'message': '请求参数无效', 'request_id': 'req_8659e6703fbdfa63', 'error': '指定的角色不存在或已停用'}
|
||||
PASS create user ok | 200 {'id': 36, 'username': 'beta6_user_1789891255', 'name': 'beta6验号', 'status': 'active', 'must_change_password': True, 'role_id': 'role-he', 'position': '验证员', 'created_at': '2026-09-20 08:00:55', 'updated_at': '2026-09-20 08:00:55'}
|
||||
PASS change-password http | 200
|
||||
PASS must_change_password cleared | top=False nested=False
|
||||
PASS no project chat -> 403 ERR_NO_PROJECT | 403 {'error_code': 'ERR_NO_PROJECT', 'message': '请先创建或加入项目后再开始对话'}
|
||||
PASS create project | 201
|
||||
PASS duplicate name -> 409 | 409 {'error_code': 'ERR_DUPLICATE_PROJECT_NAME', 'message': '您已创建同名项目,请更换名称后重试'}
|
||||
PASS client_key idempotent | 201 id=7 expected=7
|
||||
PASS plain member add without perm -> 403 | 403 {'code': 'AUTHZ', 'message': '无权访问', 'request_id': 'req_ca5511b0c1e3039a', 'error': '{"error":"ERR_FORBIDDEN","message":"无权管理项目成员"}'}
|
||||
PASS project member GET task-run -> 200 | 200
|
||||
PASS non-member GET task-run -> 403 | 403 {'error_code': 'ERR_FORBIDDEN', 'message': '无权访问该任务'}
|
||||
PASS CSP frame-src self blob | default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; img-src 'self' data: blob:; connect-src 'self'; frame-src 'self' blob:; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; object-src 'none'
|
||||
INFO role grant PATCH http=200
|
||||
PASS after grant manage_members -> 200/201 | got add=True
|
||||
PASS added member in list | mids=[4, 39, 36] target=36
|
||||
PASS added member sees project in GET /projects | ids=[7]
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"key": "workflow.allow_author_only_approval",
|
||||
"label": "允许编制人兼任审核批准",
|
||||
"group": "workflow",
|
||||
"type": "bool",
|
||||
"value": false,
|
||||
"default": false,
|
||||
"writable": true,
|
||||
"requiresRestart": false,
|
||||
"description": "授权新配置:开启后项目创建者可在激活前为文档启用编制人兼任。关闭后禁止新启用/激活兼任规划;已激活实例按冻结职责继续执行,不作为紧急熔断。",
|
||||
"revision": 1,
|
||||
"updatedAt": "2026-09-20T07:52:57.233582Z",
|
||||
"updatedBy": 4
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"code":"VALIDATION","message":"请求参数无效","request_id":"req_8659e6703fbdfa63","error":"指定的角色不存在或已停用"}
|
||||
@@ -0,0 +1 @@
|
||||
{"id":36,"username":"beta6_user_1789891255","name":"beta6验号","status":"active","must_change_password":true,"role_id":"role-he","position":"验证员","created_at":"2026-09-20 08:00:55","updated_at":"2026-09-20 08:00:55"}
|
||||
@@ -0,0 +1 @@
|
||||
{"success":true}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"capabilities": [
|
||||
"doc:export",
|
||||
"workflow:view_all"
|
||||
],
|
||||
"env": "test",
|
||||
"must_change_password": false,
|
||||
"user": {
|
||||
"id": 36,
|
||||
"username": "beta6_user_1789891255",
|
||||
"name": "beta6验号",
|
||||
"status": "active",
|
||||
"must_change_password": false,
|
||||
"role_id": "role-he",
|
||||
"position": "验证员",
|
||||
"created_at": "2026-09-20 08:00:55",
|
||||
"updated_at": "2026-09-20 08:00:55"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"capabilities": [
|
||||
"doc:export",
|
||||
"workflow:view_all"
|
||||
],
|
||||
"env": "test",
|
||||
"must_change_password": true,
|
||||
"user": {
|
||||
"id": 36,
|
||||
"username": "beta6_user_1789891255",
|
||||
"name": "beta6验号",
|
||||
"status": "active",
|
||||
"must_change_password": true,
|
||||
"role_id": "role-he",
|
||||
"position": "验证员",
|
||||
"created_at": "2026-09-20 08:00:55",
|
||||
"updated_at": "2026-09-20 08:00:55"
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{"error_code":"ERR_NO_PROJECT","message":"请先创建或加入项目后再开始对话"}
|
||||
@@ -0,0 +1 @@
|
||||
{"id":38,"username":"beta6_noproj_1789891255","name":"无项目用户","status":"active","must_change_password":true,"role_id":"role-he","position":"访客","created_at":"2026-09-20 08:00:56","updated_at":"2026-09-20 08:00:56"}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user