Compare commits
78
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d3bb7520a6 | ||
|
|
b5ce947e77 | ||
|
|
01a783b8d5 | ||
|
|
f6034fad37 | ||
|
|
909384c335 | ||
|
|
d661af71d5 | ||
|
|
a30931349a | ||
|
|
776b2b5cae | ||
|
|
81f6378233 | ||
|
|
ebe177eec8 | ||
|
|
025ffe0ab3 | ||
|
|
89ce3cc143 | ||
|
|
a27f2cc7fb | ||
|
|
247ddcd306 | ||
|
|
05ae1b3ffd | ||
|
|
90ad756ce2 | ||
|
|
950ce66ed8 | ||
|
|
a47cb84313 | ||
|
|
91d21ea632 | ||
|
|
7df43f419e | ||
|
|
212f0974d8 | ||
|
|
db85c7cab9 | ||
|
|
b2bcea3cd8 | ||
|
|
d48b36046d | ||
|
|
d07244c980 | ||
|
|
fb73d404f4 | ||
|
|
74d87b9e5d | ||
|
|
f1f24dca5b | ||
|
|
29da12d036 | ||
|
|
e843c3c7dc | ||
|
|
f54abcab82 | ||
|
|
84363b9180 | ||
|
|
d1a019b9d7 | ||
|
|
6264965267 | ||
|
|
5d7ac1a8f9 | ||
|
|
f0acbb10ad | ||
|
|
da15eb91b6 | ||
|
|
7c808bdcfc | ||
|
|
dcab3aec83 | ||
|
|
49ca6cd6dc | ||
|
|
4187bcfc9e | ||
|
|
2498bd2a13 | ||
|
|
c75842f945 | ||
|
|
67d73359fd | ||
|
|
fda159c995 | ||
|
|
a84778f21b | ||
|
|
8278022237 | ||
|
|
879f6fadef | ||
|
|
c360a928de | ||
|
|
7461138412 | ||
|
|
422f98012e | ||
|
|
574758a71f | ||
|
|
f1e87fb2e7 | ||
|
|
aac42936bc | ||
|
|
ad42f83e5b | ||
|
|
3a3b31996a | ||
|
|
c5d10aebcc | ||
|
|
a5bc317492 | ||
|
|
299530bf42 | ||
|
|
7fdbee6c0c | ||
|
|
514db3a086 | ||
|
|
16d1ba1d54 | ||
|
|
0353841a4a | ||
|
|
24e716e661 | ||
|
|
3400f0a7ac | ||
|
|
a453b290a7 | ||
|
|
73ae4b8f5b | ||
|
|
ea2b9f121e | ||
|
|
9d929f0175 | ||
|
|
99504b628e | ||
|
|
a88a7e3b0a | ||
|
|
8afd37da65 | ||
|
|
2fe58ca9d7 | ||
|
|
c4a7479572 | ||
|
|
1ff55033f4 | ||
|
|
68455faa94 | ||
|
|
794b1f43b7 | ||
|
|
9363121071 |
@@ -0,0 +1,85 @@
|
||||
# ADR:纯软件工作流 key 与领域边界(SWBOOT-00)
|
||||
|
||||
## 状态
|
||||
|
||||
已接受(2026-09-16)
|
||||
|
||||
## 背景
|
||||
|
||||
工作流引擎已声明 `non_medical_software` 产品域,但正式目录、创建入口与模板仍以医疗器械三工作流(`main` / `product_manager` / `test_manager`)为硬编码白名单。继续复用医疗 manifest 会造成临床/注册/CDO 语义污染;直接改写既有三 key 会破坏已激活医疗实例。
|
||||
|
||||
详细设计见 [software-project-bootstrap-workflow](../system-design/2026-09-14-software-project-bootstrap-workflow.md)。
|
||||
|
||||
## 决策
|
||||
|
||||
### 1. 新增正式可选工作流 key
|
||||
|
||||
| key | 定位 | 默认产品域 | 可重复实例 |
|
||||
|-----|------|------------|------------|
|
||||
| `software_bootstrap` | 一次性建立项目事实、需求、架构、风险、路线与验证基线 | `non_medical_software` | 否(默认一次;终止后可重建并保留旧证据) |
|
||||
| `software_delivery` | 按里程碑/发布重复交付,承接 change brief → 证据 → 验证 → 发布 → 复盘 | `non_medical_software` | 是 |
|
||||
|
||||
医疗三 key **保持不变**,仍为正式可选;不得在其 published hash 上替换为软件语义。
|
||||
|
||||
### 2. 目录策略:published + selectable,而非“仅三 key”
|
||||
|
||||
项目可选工作流 = 已发布 (`latest_published_version > 0`) ∩ `project_selectable=true` ∩ 策略白名单。
|
||||
|
||||
白名单扩展为:
|
||||
|
||||
```text
|
||||
main | product_manager | test_manager | software_bootstrap | software_delivery
|
||||
```
|
||||
|
||||
固定文档数量校验 **仅** 继续约束医疗三 key;软件工作流按 manifest 自身完整性校验,不强制医疗文档数。
|
||||
|
||||
### 3. 领域与合规分离
|
||||
|
||||
- `product_domain=non_medical_software` 只说明非医疗器械,不关闭鉴权/审计/安全基线。
|
||||
- `compliance_profile` / `governance_profile` / `execution_mode` / `team_mode` 为项目级独立字段。
|
||||
- 首期默认:`governance=standard`,`compliance=internal_control+security_baseline`,`execution_mode=docs_only`。
|
||||
- `controlled_patch` 在 SWBOOT-10 受控执行器就绪前 **不可真正启用**;仅保留 allowlist stub。
|
||||
|
||||
### 4. 串联而非回环
|
||||
|
||||
```text
|
||||
software_bootstrap(完成 + 创建者确认)
|
||||
→ 仅建议 software_delivery
|
||||
→ 创建者确认后新建 planning/激活实例
|
||||
```
|
||||
|
||||
bootstrap 完成不得自动创建或激活 delivery。
|
||||
|
||||
### 5. Solo 审批策略(契约)
|
||||
|
||||
- `collaborative`:独立三权(author/reviewer/approver 不同人)。
|
||||
- `solo`:`creator_acknowledgement`;页面与审计持续标注“未独立评审”。
|
||||
- `controlled` 或要求独立审查的 compliance profile:**禁止 solo**。
|
||||
|
||||
### 6. 错误码(首期)
|
||||
|
||||
| code | 含义 |
|
||||
|------|------|
|
||||
| `ERR_WORKFLOW_NOT_SELECTABLE` | key 不在正式可选白名单或未 published |
|
||||
| `ERR_DOMAIN_INCOMPATIBLE` | 工作流与项目 `product_domain` / `project_type` 不兼容 |
|
||||
| `ERR_COMPLIANCE_PROFILE` | 合规配置非法或与治理冲突(如 controlled+solo) |
|
||||
| `ERR_EXECUTION_MODE_DISABLED` | 请求 `controlled_patch` 但受控执行器未启用 |
|
||||
| `ERR_REPO_PATH_NOT_ALLOWLISTED` | 仓库路径不在管理员 allowlist(SWBOOT-10 stub) |
|
||||
| `ERR_CREATION_PREVIEW_STALE` | creation token / plan_hash 过期或不匹配(409) |
|
||||
|
||||
### 7. 运行时权威不变
|
||||
|
||||
继续遵守 [workflow-runtime-authority](./2026-09-12-workflow-runtime-authority.md):任务只能从冻结 `doc_task_instance` 启动;禁止客户端 `task_key`/duty/stage 旁路。
|
||||
|
||||
## 后果
|
||||
|
||||
- Bootstrap seed 与 catalog API 必须同时暴露软件两 key,且按 `product_domain` 过滤时不把医疗默认话术塞进软件项目。
|
||||
- 项目表 additive 增加 `project_type_key` / `compliance_profile_key` 等字段;旧项目不自动分类为医疗或软件。
|
||||
- SWBOOT-10 仅落地 allowlist stub:任何真实 patch/merge/push 必须 fail closed,直到独立 Epic 验收。
|
||||
- 医疗三工作流黄金用例与固定文档数门禁保持回归基线。
|
||||
|
||||
## 关联
|
||||
|
||||
- 实施任务:`.doc/ops/short-term/2026-09-16-software-project-bootstrap.md`
|
||||
- Backlog:`.doc/ops/long-term/2026-09-14-software-project-bootstrap-implementation.md`
|
||||
- 验收清单:`.doc/ops/checklists/2026-09-14-software-project-bootstrap-acceptance.md`
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: "Wave 2 PU4 真实 PI 补证(U8 + full/none)"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: feature/wave2-real-pi-evidence
|
||||
worktree: "-"
|
||||
mutex: intent-plan
|
||||
---
|
||||
|
||||
# Wave 2 PU4 真实 PI 补证(U8 + full/none)
|
||||
|
||||
## 目标
|
||||
|
||||
补齐 multi-intent U8 与工作流 full/none 的真实 PI / PG / 跨用户 / 恢复证据。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 认领 + 占槽 rebuild
|
||||
2. [x] U8 live 证据路径
|
||||
3. [x] full/none 混合长链 live 测试
|
||||
4. [x] 报告 + 矩阵更新 + 释放槽位
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] U8 真实 PI PASS
|
||||
- [x] full 跨用户审批 PASS
|
||||
- [x] none 免审批且不阻塞 PASS
|
||||
- [x] 报告归档 `.doc/test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md`
|
||||
+10
-10
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: "FEATURE-MATRIX 深度测试 + 晋升部署 test"
|
||||
status: in_progress
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor-Auto
|
||||
@@ -30,18 +30,18 @@ mutex: infra
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [ ] 认领占槽
|
||||
2. [ ] 自动化深度回归
|
||||
3. [ ] live `:8080` 抽检
|
||||
4. [ ] PI 抽样
|
||||
5. [ ] 晋升 test 并冒烟
|
||||
6. [ ] 报告与归档
|
||||
1. [x] 认领占槽
|
||||
2. [x] 自动化深度回归
|
||||
3. [x] live `:8080` 抽检
|
||||
4. [x] PI 抽样
|
||||
5. [x] 晋升 test 并冒烟
|
||||
6. [x] 报告与归档
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [ ] 矩阵已实现行均有 PASS 证据
|
||||
- [ ] `:8081` health/ready schema=47;`test-env-smoke.sh` PASS
|
||||
- [ ] tag `rc-v1.0.0-beta.2`;报告归档
|
||||
- [x] 矩阵已实现行均有 PASS 证据
|
||||
- [x] `:8081` health/ready schema=47;`test-env-smoke.sh` PASS
|
||||
- [x] tag `rc-v1.0.0-beta.2`;报告归档
|
||||
|
||||
## 相关链接
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: "Wave 2B PU5B:nightly PI + promotion receipt"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: feature/wave2b-nightly-promotion-receipt
|
||||
worktree: "-"
|
||||
mutex: ci
|
||||
---
|
||||
|
||||
# Wave 2B PU5B:nightly PI + promotion receipt
|
||||
|
||||
## 目标
|
||||
|
||||
落地夜间真实 PI 回归入口、不可变 promotion receipt,以及晋升脚本强制校验;same-image digest 晋升本轮仅做到 same-commit + digest 可追溯。
|
||||
|
||||
## 范围
|
||||
|
||||
- promotion receipt 写/校验 + waiver
|
||||
- nightly-real-pi.yml + run-nightly-real-pi.sh
|
||||
- git-workflow-helper / promote-to-test / release-to-main 门禁钩子
|
||||
- 报告与 FEATURE-MATRIX / remediation 同步
|
||||
|
||||
## 非目标
|
||||
|
||||
- compose 按 digest pull 的同镜像晋升流水线
|
||||
- Playwright 双标签;升 MULTI_INTENT tier
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 认领 + 开分支
|
||||
2. [x] receipt 写/校验脚本
|
||||
3. [x] nightly workflow + 本机脚本
|
||||
4. [x] 晋升钩子
|
||||
5. [x] 报告 + 合入 dev
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 缺 secret/runner → infra_fail,晋升拒绝
|
||||
- [x] product_fail → 晋升拒绝
|
||||
- [x] pass receipt → 晋升可过;无 receipt → 非零退出
|
||||
- [x] 报告归档(`.doc/test-reports/2026-09-16-wave2b-nightly-promotion-receipt-test-report.md`)
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Remediation PU5B: `../../remediation/2026-09-16-feature-matrix-production-readiness-plan.md`
|
||||
- Test report: `../../test-reports/2026-09-16-wave2b-nightly-promotion-receipt-test-report.md`
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: "Wave 2C:同 digest 镜像晋升"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: feature/wave2c-same-image-digest
|
||||
worktree: "-"
|
||||
mutex: infra
|
||||
---
|
||||
|
||||
# Wave 2C:同 digest 镜像晋升
|
||||
|
||||
## 目标
|
||||
|
||||
候选 commit 一次构建;test/main 按 receipt digests 启动;pinned 禁止 rebuild 另造镜像。
|
||||
|
||||
## 范围
|
||||
|
||||
- candidate-images-build/apply
|
||||
- compose + env-service pinned
|
||||
- promote/release 钩子 + receipt --require-digests
|
||||
- nightly digests 对齐
|
||||
|
||||
## 非目标
|
||||
|
||||
- 远程 registry;升 tier;Playwright;U8 quality_failed(Phase 3)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 认领 + 开分支
|
||||
2. [x] build/apply + check digests
|
||||
3. [x] compose/env-service/hooks
|
||||
4. [x] nightly align
|
||||
5. [x] 报告合入
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] PASS receipt 含 digests;apply 后 ID 一致
|
||||
- [x] pinned rebuild 不换 ID(env-service 拒绝 --build)
|
||||
- [x] 缺 digest 拒绝晋升
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
title: "Wave 3 PU6–PU8 go/no-go 文档任务"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: feature/wave3-pu6-pu8-go-no-go
|
||||
worktree: "-"
|
||||
mutex: architecture-docs
|
||||
---
|
||||
|
||||
# Wave 3 PU6–PU8 go/no-go 文档任务
|
||||
|
||||
## 目标
|
||||
|
||||
完成 PU6–PU8 产品 go/no-go 记录与获批后契约;未获批不实施。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 调研 go/no-go 总文
|
||||
2. [x] PU6–PU8 / U9–U12 契约
|
||||
3. [x] 勾 DoD + 矩阵/CURRENT 同步 + 合入
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Research: `../research/2026-09-16-wave3-pu6-pu8-go-no-go.md`
|
||||
@@ -0,0 +1,19 @@
|
||||
---
|
||||
title: "BUG-11 410 兼容策略冻结"
|
||||
created: 2026-09-16
|
||||
status: done
|
||||
---
|
||||
|
||||
# BUG-11:旧 WORKFLOW_SWITCH API 410 策略
|
||||
|
||||
## 决定(2026-09-16 产品/工程冻结)
|
||||
|
||||
**保留** 治理可用时返回 `410 Gone` + `WORKFLOW_SWITCH_API_RETIRED`;治理不可用环境仍允许旧路径。
|
||||
|
||||
- 不视为能力缺口;不强制本轮删除路由。
|
||||
- 遥测若证明零流量,可另开退役任务。
|
||||
|
||||
## 证据
|
||||
|
||||
- `internal/server/project_handlers.go` Gone 分支
|
||||
- gap-matrix BUG-11 → PASS(策略冻结)
|
||||
@@ -0,0 +1,110 @@
|
||||
---
|
||||
title: "FEATURE-MATRIX production-ready 连续性审计"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
---
|
||||
|
||||
# FEATURE-MATRIX production-ready 连续性审计
|
||||
|
||||
## 结论
|
||||
|
||||
排除“纯软件项目自举”后,当前证据没有显示新的发布 blocker。`CURRENT.md`、`gap-matrix.md` 与 B1–B4 报告一致记录 `production_ready=yes`,dev/test/main 均为 schema 47。
|
||||
|
||||
`FEATURE-MATRIX.md` 仍需整改,但问题主要是状态语义混杂和证据漂移:同一个 `partial` 同时表示补证、首发后增强、实验、刻意关闭和真正的能力缺口。矩阵不能仅凭这些 `partial` 把 production-ready 回退,也不能据此宣称所有能力完整。
|
||||
|
||||
本轮只读核对文档和源码,没有运行测试、改业务代码、切换 feature flag 或操作共享环境。运行态事实仍以现有测试报告为准;后续状态提升必须重新验证。
|
||||
|
||||
## 审计边界
|
||||
|
||||
- 包含:除“纯软件项目自举”外的 `partial` 行、与这些行直接相关的 done/deferred 边界、发布门禁和证据链。
|
||||
- 不包含:纯软件项目自举的实现方案、FAV 的实现审计、业务代码整改、部署或环境晋升。
|
||||
- 权威关系:`FEATURE-MATRIX.md` 描述能力成熟度;`gap-matrix.md` 描述发布 blocker;`CURRENT.md` 描述当前协作与环境快照。
|
||||
|
||||
## 已确认事实
|
||||
|
||||
1. 发布门禁 B1–B4 已签,三环境 schema 为 47;U9–U12、FAV、完整 PI change-report 叙事和软件自举明确不挡当前首发。
|
||||
2. 对话刷新、重登、重启和跨用户拒绝已有真实 PI/运行态证据。
|
||||
3. 可靠事件 notify、workflow advance、projection 已 live,生产闭包 hook 已退出;FAV 仍保持 off。
|
||||
4. 多意图 U1–U8 已合入默认 `legacy` 的安全基线,但 U8 真实 PI generate 在其报告中是 SKIP,不能写成真实生成闭环已签。
|
||||
5. 工作流治理的设置页、DutyMode、动作级鉴权和三工作流真实 PI E2E 已签;full/none 文档长链的页面证据仍未完整覆盖。
|
||||
6. 文档版本账本、人工修订、比较、通知和运行时 UI 已通过;change report 仍是明确标识的 deterministic fallback,不是完整 PI 叙事。
|
||||
|
||||
## 逐行核对
|
||||
|
||||
| 模块 | 当前判定 | 剩余工作 | 发布关系 |
|
||||
|---|---|---|---|
|
||||
| 意图识别 L1 | 当前行范围已具备改为 `done` 的条件 | 把 U9–U12 移出 L1 行;L1 只保留 18 类、三分支、读写分流和纯依赖边界 | 文档校准,不是 blocker |
|
||||
| 多意图持久计划 | `partial` 合理 | 先补 U8 真实 PI + PG + browser + restart + 撤权证据;U9 独立实验;U10–U12 逐 action 扩面 | 默认 `legacy`,不挡首发 |
|
||||
| 对话 / ctxmgr baseline | 当前冻结范围可改为 `done` | 语义摘要是 backlog D3,不是 D5;拆成独立 deferred/partial 行 | 文档校准,不是 blocker |
|
||||
| 对话安全治理 D7 | `deferred` 独立行 | 数据分类,数据库/备份/日志控制盘点,留存删除口径和加密边界;若确认当前基线违规则升级 blocker | 待合规口径,不得无限期隐藏在普通 backlog |
|
||||
| 工作流治理 | `partial` 合理 | full 文档真实 PI 人工审批长链;none 文档真实 PI 生成、免审批、账本持久化和阶段不阻塞长链 | 补证优先,不预设改代码 |
|
||||
| IAM / 鉴权 | 现有缺口文字过时,模块仍应暂保 `partial` | 历史读取统一 owner/阶段授权已闭环;改为全路由 inventory、PG fail-closed、管理员例外、缓存失效和 410 退役决策 | 若发现现行旁路则升级 blocker |
|
||||
| 文档版本与修改认知 baseline | 当前冻结范围可改为 `done` | 账本、人工修订、真实 diff+lineage 和 UI 已签;完整 PI narrative 拆成独立 deferred/partial 行 | 文档校准,不是 blocker |
|
||||
| 前端工作台 | 当前行范围可改为 `done` | 其他 409 消费方复用信封解析应另列 hardening,不能让当前能力永久 `partial` | 文档校准,不是 blocker |
|
||||
| CI / E2E | `partial` 合理 | 夜间 `RUN_PI_E2E=1`、失败分类与证据归档;修复全仓 race 的 TempDir 异步收口 flake | 阻止下一次晋升,不自动否定已发布版本 |
|
||||
| Artifact promotion | `partial/deferred` 独立行 | 现状只证明同 commit 与各环境 digest 可追溯;要声明 same-image promotion,需一次构建、按 digest 晋升和可执行 receipt | 发布加固,不反向否定已签版本 |
|
||||
| 模块解耦与可靠事件 | 当前核心范围可改为 `done` | 将 FAV 拆成独立 `deferred` 行;选择性后续解耦按收益触发 | FAV 保持 off,不挡首发 |
|
||||
|
||||
## 文档漂移
|
||||
|
||||
1. 多意图行仍写“共享环境 schema 45 待晋升”,与三环境 schema 47 冲突。
|
||||
2. 对话行将语义摘要标成 D5;`chat-agent-p6-backlog.md` 中语义摘要实际为 D3,D5 是共享 KB 环境隔离评估。
|
||||
3. IAM 行仍把已经闭环的历史读取 owner/阶段授权写成待办。
|
||||
4. 前端行的“缺口/后续”没有未完成项,但状态仍是 `partial`。
|
||||
5. 模块解耦行把已完成的事件核心和故意关闭的 FAV 混在同一状态中。
|
||||
6. `2026-09-15-multi-intent-hitl-plan.md`、Phase 2 解耦方案、HTTP 信封方案和相关历史研究的头部状态或叙事已被后续报告部分或全部取代。
|
||||
|
||||
历史文档不得删除。应在原文增加 implemented/superseded 指针,或更新仍作为活方案的状态与证据链接。
|
||||
|
||||
## 风险发现
|
||||
|
||||
### IAM fail-open 潜在路径
|
||||
|
||||
`internal/auth/store_factory.go` 在 pool 为空或 IAM 表未就绪时回退 `MemoryStore`,没有按环境显式拒绝。当前 main schema 47 使该分支未被证实正在触发,因此本审计不直接翻转 production-ready;后续必须先只读核对部署实际选择,再把 fallback 改成仅 dev/test 加显式 opt-in 可用,空值、未知环境和 main/prod 一律 fail closed,并覆盖既有 session 的授权依赖中断负例。
|
||||
|
||||
### 状态提升越级
|
||||
|
||||
U8 的代码合入、默认 legacy 安全和真实 PI 放量是三件不同的事。矩阵若只写“U1–U8 完成”,会掩盖真实 PI stop-gate,并可能误导后续把 tier 升到 `confirm/full`。
|
||||
|
||||
### `none` 语义误写
|
||||
|
||||
`none` 表示不需要人工三权审批,不是“none 文档审批长链”。验收应证明真实 PI 生成、版本账本、审批动作不适用和阶段不阻塞。
|
||||
|
||||
### 证据失效
|
||||
|
||||
测试报告只证明其 commit、schema、镜像、runner/model/protocol 和环境。代码、迁移、compose、flag、runner 协议变化或环境晋升后,历史 PASS 不能单独证明新部署。
|
||||
|
||||
## 推荐状态模型
|
||||
|
||||
能力状态与发布状态必须正交:
|
||||
|
||||
- `done`:本行声明的能力边界已完成并有相应层级证据;不表示该领域永无后续。
|
||||
- `partial`:已交付可用子集,行内列出尚未满足的关闭条件。
|
||||
- `planned`:方案已存在但尚未实施。
|
||||
- `deferred`:明确不进入当前路线,且不是发布 blocker。
|
||||
- `blocked`:该行目标无法继续,必须给出 blocker 和恢复条件。
|
||||
- `production_ready`:只由 `gap-matrix.md` 的发布门禁决定,不由所有能力行必须 `done` 推导。
|
||||
|
||||
## 重验触发器
|
||||
|
||||
发生以下任一变化时,受影响行必须重新验证,不能沿用旧 PASS:
|
||||
|
||||
- 授权谓词、owner port、会话或阶段作用域变化;
|
||||
- schema、迁移、compose、镜像或环境晋升;
|
||||
- feature flag/tier 从 off、legacy 或 shadow 升级;
|
||||
- PI Runner URL、模型、typed-result 协议或 prompt/schema 变化;
|
||||
- event consumer writer、lease、receipt、replay 或回滚路径变化;
|
||||
- 浏览器用户流、SSE 恢复或持久化边界变化。
|
||||
|
||||
## 相关证据
|
||||
|
||||
- 能力矩阵:`status/FEATURE-MATRIX.md`
|
||||
- 发布缺口:`remediation/gap-matrix.md`
|
||||
- 当前环境:`ops/CURRENT.md`
|
||||
- 发布门禁任务:`archive/ops/short-term/2026-09-16-production-ready-gates.md`
|
||||
- 多意图设计与 U8:`system-design/2026-09-15-multi-intent-hitl-plan.md`、`test-reports/2026-09-16-multi-intent-u8-task-generate-test-report.md`
|
||||
- 对话门禁:`test-reports/2026-09-16-chat-refresh-gate-test-report.md`
|
||||
- 工作流 full/none 证据边界:`test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md`
|
||||
- 文档版本:`test-reports/2026-09-14-document-revision-runtime-ui-test-report.md`
|
||||
- 事件与解耦:`test-reports/2026-09-15-phase2-closeout-test-report.md`、`ops/research/2026-09-15-track-e-retrospective.md`
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
title: "R13 数据安全清单(nightly / real-PI)"
|
||||
created: 2026-09-16
|
||||
status: done
|
||||
---
|
||||
|
||||
# R13 数据安全清单
|
||||
|
||||
用于真实 PI / nightly / 扩面验收的出站与留存门禁。
|
||||
|
||||
| # | 控制项 | 状态 | 证据/路径 |
|
||||
|---|--------|------|-----------|
|
||||
| 1 | 隔离合成 project/session,禁止生产真实 PII | PASS | nightly `agent_wave2_pi` + 合成 fixture |
|
||||
| 2 | 凭证不入库;secrets 仅 Gitea Actions / `~/.secrets` | PASS | handoff gitea-nightly-secrets |
|
||||
| 3 | evidence_refs 脱敏;日志无 token/密码 | PASS | `promotion-receipt-*` + run script |
|
||||
| 4 | PI 最小字段 allowlist / typed-result-v1 | PASS | deploy/pi-agent typed-result |
|
||||
| 5 | 跨项目/跨用户负例拒绝 | PASS | Wave2 / authz 套件 |
|
||||
| 6 | 产物保留期有限(本地 tar / Actions) | PASS | workflow archive step |
|
||||
| 7 | KB 出站失败降级不泄漏凭证 | PASS | pi-agent runner health 无 key |
|
||||
|
||||
## 开放增强
|
||||
|
||||
- 完整红队注入矩阵可另开 audit;不挡本清单基线勾选。
|
||||
@@ -13,6 +13,14 @@
|
||||
|
||||
## 核心文档(按阅读顺序推荐)
|
||||
|
||||
### FEATURE-MATRIX production-ready 连续性审计(2026-09-16)
|
||||
|
||||
**文件**: [2026-09-16-feature-matrix-production-readiness-audit.md](./2026-09-16-feature-matrix-production-readiness-audit.md)
|
||||
|
||||
**结论**: 排除纯软件项目自举后没有新增发布 blocker;矩阵需要拆分能力成熟度、发布关系、补证、增强和 deferred 状态,并修复 schema、D3/D5、IAM、前端与 FAV 叙事漂移。
|
||||
|
||||
**整改**: [FEATURE-MATRIX Production-Ready Continuity - Plan](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md)
|
||||
|
||||
### 多意图与 HITL 方案复核(2026-09-15)
|
||||
|
||||
**文件**: [2026-09-15-multi-intent-hitl-plan-review.md](./2026-09-15-multi-intent-hitl-plan-review.md)
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
---
|
||||
title: "Authorization matrix v3 — full route inventory"
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
status: done
|
||||
---
|
||||
|
||||
# Authorization matrix v3 — full route inventory
|
||||
|
||||
Generated from `mux.HandleFunc` registrations under `internal/server/`.
|
||||
AuthN column is **heuristic**; negative-test pointers filled where known.
|
||||
|
||||
| Method | Path | Handler | File | AuthN (heuristic) | Neg test |
|
||||
|--------|------|---------|------|-------------------|----------|
|
||||
| GET | `/` | `s.serveSPA` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/admin/config` | `s.handleAdminConfig` | `server.go` | admin+project? | see suite |
|
||||
| PUT | `/api/v1/admin/config` | `s.handleAdminConfig` | `server.go` | admin+project? | see suite |
|
||||
| GET | `/api/v1/admin/permissions` | `s.handleAdminPermissions` | `server.go` | admin+project? | see suite |
|
||||
| GET | `/api/v1/admin/roles` | `s.handleAdminRoles` | `server.go` | admin+project? | see suite |
|
||||
| POST | `/api/v1/admin/roles` | `s.handleAdminRoles` | `server.go` | admin+project? | see suite |
|
||||
| DELETE | `/api/v1/admin/roles/{id}` | `s.handleAdminRoleByID` | `server.go` | admin+project? | see suite |
|
||||
| PATCH | `/api/v1/admin/roles/{id}` | `s.handleAdminRoleByID` | `server.go` | admin+project? | see suite |
|
||||
| GET | `/api/v1/admin/templates` | `s.handleAdminTemplates` | `server.go` | admin+project? | see suite |
|
||||
| POST | `/api/v1/admin/templates` | `s.handleAdminTemplates` | `server.go` | admin+project? | see suite |
|
||||
| GET | `/api/v1/admin/templates/{key}/versions` | `s.handleAdminTemplateVersions` | `server.go` | admin+project? | see suite |
|
||||
| GET | `/api/v1/admin/users` | `s.handleAdminUsers` | `server.go` | admin+project? | see suite |
|
||||
| POST | `/api/v1/admin/users` | `s.handleAdminUsers` | `server.go` | admin+project? | see suite |
|
||||
| PUT | `/api/v1/admin/users/{id}/role` | `s.handleAdminUpdateRole` | `server.go` | admin+project? | see suite |
|
||||
| PUT | `/api/v1/admin/users/{id}/status` | `s.handleAdminUpdateStatus` | `server.go` | admin+project? | see suite |
|
||||
| GET | `/api/v1/admin/workflows` | `s.handleAdminWorkflows` | `server.go` | admin+project? | see suite |
|
||||
| POST | `/api/v1/admin/workflows` | `s.handleAdminWorkflows` | `server.go` | admin+project? | see suite |
|
||||
| GET | `/api/v1/admin/workflows/{id}` | `s.handleAdminWorkflowByID` | `server.go` | admin+project? | see suite |
|
||||
| PATCH | `/api/v1/admin/workflows/{id}/versions/{version}` | `s.handleAdminWorkflowVersion` | `server.go` | admin+project? | see suite |
|
||||
| POST | `/api/v1/admin/workflows/{id}/versions/{version}/publish` | `s.handleAdminWorkflowPublish` | `server.go` | admin+project? | see suite |
|
||||
| POST | `/api/v1/admin/workflows/{id}/versions/{version}/retire` | `s.handleAdminWorkflowRetire` | `server.go` | admin+project? | see suite |
|
||||
| POST | `/api/v1/admin/workflows/{id}/versions/{version}/validate` | `s.handleAdminWorkflowValidate` | `server.go` | admin+project? | see suite |
|
||||
| POST | `/api/v1/admin/workspaces/reconcile` | `s.handleReconcileWorkspace` | `server.go` | admin+project? | see suite |
|
||||
| POST | `/api/v1/auth/change-password` | `s.handleAuthChangePassword` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/auth/login` | `s.handleAuthLogin` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/auth/logout` | `s.handleAuthLogout` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/auth/me` | `s.handleAuthMe` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/auth/public-config` | `s.handleAuthPublicConfig` | `server.go` | handler | see suite |
|
||||
| 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 |
|
||||
| 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 |
|
||||
| POST | `/api/v1/chat/digests/generate` | `s.handleGenerateDailyDigest` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/export/messages` | `s.handleChatExportMessages` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/messages` | `s.handleGetChatMessages` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/messages/day` | `s.handleGetChatDayMessages` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/chat/messages/import` | `s.handleImportChatMessages` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/messages/window` | `s.handleGetChatWindow` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/messages/{message_id}/export-capability` | `s.handleGetExportCapability` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/chat/messages/{message_id}/export-source` | `s.handleGetExportSource` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/chat/read` | `s.handleChatRead` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/chat/recategorize` | `s.handleChatRecategorize` | `server.go` | session+project | see suite |
|
||||
| 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/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 |
|
||||
| GET | `/api/v1/context/project` | `s.handleGetProjectContext` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/context/user` | `s.handleGetUserContext` | `server.go` | handler | see suite |
|
||||
| PUT | `/api/v1/context/user/preference` | `s.handleUpdateUserPreference` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/docgov/approver-decision` | `s.handleDocGovApproverDecision` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/docgov/audit-logs` | `s.handleDocGovListAuditLogs` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/docgov/claim` | `s.handleDocGovClaim` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/docgov/comments` | `s.handleDocGovListComments` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/docgov/comments` | `s.handleDocGovAddComment` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/docgov/content` | `s.handleDocGovSaveContent` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/docgov/document` | `s.handleDocGovGetDocument` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/docgov/documents/{doc_id}/content` | `s.handleDocGovGetDocumentContent` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/docgov/lease/acquire` | `s.handleDocGovAcquireLease` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/docgov/lease/heartbeat` | `s.handleDocGovHeartbeatLease` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/docgov/lease/release` | `s.handleDocGovReleaseLease` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/docgov/proposal/decide` | `s.handleDocGovDecideProposal` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/docgov/review-decision` | `s.handleDocGovReviewDecision` | `server.go` | handler | see suite |
|
||||
| POST | `/api/v1/docgov/submit-review` | `s.handleDocGovSubmitReview` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/documents/{doc_id}/agent-candidates/{candidate_id}` | `s.handleDocRevisionGetCandidate` | `document_revision_handlers.go` | session+project | see suite |
|
||||
| POST | `/api/v1/documents/{doc_id}/agent-candidates/{candidate_id}/decision` | `s.handleDocRevisionCandidateDecision` | `document_revision_handlers.go` | session+project | see suite |
|
||||
| GET | `/api/v1/documents/{doc_id}/change-reports/{report_id}` | `s.handleDocRevisionGetReport` | `document_revision_handlers.go` | session+project | see suite |
|
||||
| PATCH | `/api/v1/documents/{doc_id}/content` | `s.handleDocRevisionPatchContent` | `document_revision_handlers.go` | session+project | see suite |
|
||||
| GET | `/api/v1/documents/{doc_id}/diff` | `s.handleDocRevisionDiff` | `document_revision_handlers.go` | session+project | see suite |
|
||||
| GET | `/api/v1/documents/{doc_id}/manual-overlay` | `s.handleDocRevisionManualOverlay` | `document_revision_handlers.go` | session+project | see suite |
|
||||
| GET | `/api/v1/documents/{doc_id}/revision-state` | `s.handleDocRevisionState` | `document_revision_handlers.go` | session+project | see suite |
|
||||
| GET | `/api/v1/documents/{doc_id}/versions` | `s.handleDocRevisionListVersions` | `document_revision_handlers.go` | session+project | see suite |
|
||||
| GET | `/api/v1/documents/{doc_id}/versions/{version_no}` | `s.handleDocRevisionGetVersion` | `document_revision_handlers.go` | session+project | see suite |
|
||||
| GET | `/api/v1/freeform-documents` | `s.handleListFreeformDocs` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/freeform-documents` | `s.handleCreateFreeformDoc` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/freeform-documents/from-message` | `s.handleCreateFreeformDocFromMessage` | `server.go` | session+project | see suite |
|
||||
| DELETE | `/api/v1/freeform-documents/{doc_id}` | `s.handleDeleteFreeformDoc` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/freeform-documents/{doc_id}` | `s.handleGetFreeformDoc` | `server.go` | session+project | see suite |
|
||||
| PUT | `/api/v1/freeform-documents/{doc_id}` | `s.handleUpdateFreeformDoc` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/freeform-documents/{doc_id}/share` | `s.handleShareFreeformDoc` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/freeform-documents/{doc_id}/unshare` | `s.handleUnshareFreeformDoc` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/health` | `s.handleHealth` | `server.go` | public | see suite |
|
||||
| GET | `/api/v1/me/preferences` | `s.handleMePreferences` | `server.go` | handler | see suite |
|
||||
| PUT | `/api/v1/me/preferences` | `s.handleMePreferences` | `server.go` | handler | see suite |
|
||||
| GET | `/api/v1/me/profile` | `s.handleMeProfile` | `server.go` | handler | see suite |
|
||||
| PATCH | `/api/v1/me/profile` | `s.handleMeProfile` | `server.go` | handler | see suite |
|
||||
| PATCH | `/api/v1/notifications/{id}` | `s.handlePatchNotification` | `document_revision_handlers.go` | handler | see suite |
|
||||
| GET | `/api/v1/projects` | `s.handleListProjects` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/projects` | `s.handleCreateProject` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}` | `s.handleGetProjectByID` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/projects/{id}/activation-preview` | `s.handleActivationPreview` | `server.go` | session+project | see suite |
|
||||
| PUT | `/api/v1/projects/{id}/active-workflow` | `s.handleActivateWorkflow` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}/assets` | `s.handleListProjectAssets` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/projects/{id}/assets` | `s.handleUploadProjectAsset` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}/documents` | `s.handleListProjectWorkflowDocuments` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}/lineage` | `s.handleGetProjectLineage` | `server.go` | session+project | see suite |
|
||||
| DELETE | `/api/v1/projects/{id}/members` | `s.handleProjectMembers` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}/members` | `s.handleProjectMembers` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/projects/{id}/members` | `s.handleProjectMembers` | `server.go` | session+project | see suite |
|
||||
| PUT | `/api/v1/projects/{id}/members` | `s.handleProjectMembers` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}/notifications` | `s.handleListProjectNotifications` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}/settings` | `s.handleGetProjectSettings` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/projects/{id}/workflow-instances/activate` | `s.handleActivateWorkflowInstance` | `server.go` | session+project | see suite |
|
||||
| PUT | `/api/v1/projects/{id}/workflow-plan` | `s.handleSaveWorkflowPlan` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}/workflow-plan/default` | `s.handleGetDefaultWorkflowPlan` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}/workflows` | `s.handleListProjectWorkflows` | `server.go` | session+project | see suite |
|
||||
| POST | `/api/v1/projects/{id}/workflows/{workflow_key}/run` | `s.handleRunProjectWorkflow` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/projects/{id}/workflows/{workflow_key}/runs` | `s.handleListProjectWorkflowRuns` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/ready` | `s.handleReadiness` | `server.go` | public | see suite |
|
||||
| POST | `/api/v1/tasks/run` | `s.handleRunTask` | `server.go` | session+project | see suite |
|
||||
| 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/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 |
|
||||
| POST | `/api/v1/workflow-instances/{id}/terminate` | `s.handleTerminateWorkflowInstance` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/workflow-instances/{id}/termination-preview` | `s.handleTerminationPreview` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/workflows` | `s.handleListWorkflowDefinitions` | `server.go` | session+project | see suite |
|
||||
| GET | `/api/v1/workflows/catalog` | `s.handleWorkflowCatalog` | `server.go` | session+project | see suite |
|
||||
| GET | `/health` | `s.handleHealth` | `server.go` | public | see suite |
|
||||
| GET | `/ready` | `s.handleReadiness` | `server.go` | public | see suite |
|
||||
| * | `/sse` | `func(w http.ResponseWriter, r *http.Request` | `task_run_idempotent_sse_test.go` | handler | see suite |
|
||||
|
||||
**Total routes:** 133
|
||||
|
||||
## Session interrupt fail-closed
|
||||
|
||||
When IAM/auth store unavailable after session established, protected reads must reject (see `TestAuthStore_SessionInterruptFailClosed`).
|
||||
|
||||
## BUG-11 410 policy
|
||||
|
||||
Product decision 2026-09-16: **retain** `WORKFLOW_SWITCH_API_RETIRED` 410 when governance available; legacy path only when governance unavailable. Not a capability gap.
|
||||
+22
-8
@@ -5,15 +5,28 @@
|
||||
|
||||
## 焦点
|
||||
|
||||
1. **MATRIX 深度测试 + 晋升 test**:`feature/matrix-deep-test-promote-test` → `rc-v1.0.0-beta.2`
|
||||
2. **首发后 backlog**:多意图 U9–U12、软件项目自举、FAV、完整 PI change-report 叙事
|
||||
3. **MULTI-INTENT HITL**:核心 U1–U8 已合入;U9–U12 不阻塞首版
|
||||
1. **全量 backlog 覆盖 no-go**:P0–P7 总控实施中([short-term](./short-term/2026-09-16-full-backlog-override.md))
|
||||
2. **运维**:Gitea nightly runner 已通;待 P1 对齐 `DATA_DIR=dev` 后冲 green receipt
|
||||
3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;项目 143 只读
|
||||
|
||||
## 并行认领
|
||||
|
||||
| owner | task | branch | worktree | mutex | status |
|
||||
|-------|------|--------|----------|-------|--------|
|
||||
| Cursor-Auto | 2026-09-16-matrix-deep-test-promote-test | feature/matrix-deep-test-promote-test | - | infra | in_progress |
|
||||
| Cursor-Auto | 2026-09-16-software-project-bootstrap | feature/software-project-bootstrap | .worktrees/feature-software-project-bootstrap | workflow-design | done |
|
||||
| Cursor | 2026-09-16-full-backlog-override | docs/override-nogo-full-backlog | - | architecture-docs | in_progress |
|
||||
| Cursor | 2026-09-16-gitea-nightly-docker-datadir | fix/gitea-nightly-docker-datadir | - | ci | done |
|
||||
| Cursor | 2026-09-16-gitea-nightly-host-tools | fix/gitea-nightly-host-tools | - | ci | done |
|
||||
| Cursor | 2026-09-16-wave-leftovers | fix/wave-leftovers-n7-playwright-dod | - | ci | done |
|
||||
| Cursor | 2026-09-16-wave3-pu6-pu8-go-no-go | feature/wave3-pu6-pu8-go-no-go | - | architecture-docs | done |
|
||||
| Cursor | 2026-09-16-wave2c-same-image-digest | feature/wave2c-same-image-digest | - | infra | done |
|
||||
| Cursor | 2026-09-16-wave2b-nightly-promotion-receipt | feature/wave2b-nightly-promotion-receipt | - | ci | done |
|
||||
| Cursor | 2026-09-16-wave2-real-pi-evidence | feature/wave2-real-pi-evidence | - | intent-plan | done |
|
||||
| Cursor | 2026-09-16-wave1-race-tempdir-cleanup | fix/race-tempdir-cleanup | - | ci | done |
|
||||
| Cursor | 2026-09-16-wave1-iam-fail-closed | fix/iam-store-fail-closed | - | authz | done |
|
||||
| Cursor | 2026-09-16-feature-matrix-wave0-calibration | feature/feature-matrix-production-readiness-plan | .worktrees/feature-matrix-production-readiness-plan | architecture-docs | done |
|
||||
| Codex | 2026-09-16-feature-matrix-production-readiness-plan | feature/feature-matrix-production-readiness-plan | .worktrees/feature-matrix-production-readiness-plan | architecture-docs | done |
|
||||
| Cursor-Auto | 2026-09-16-matrix-deep-test-promote-test | feature/matrix-deep-test-promote-test | - | infra | done |
|
||||
| Cursor-Auto | 2026-09-16-production-ready-gates | docs/production-ready-flip | - | ci | done |
|
||||
| Cursor-Auto | 2026-09-16-demo-seed-pollution | fix/demo-data-pollution-web | - | web | done |
|
||||
| Cursor | 2026-09-16-multi-intent-u8-task-generate | feature/multi-intent-u8-task-generate | - | intent-plan | done |
|
||||
@@ -95,7 +108,7 @@
|
||||
|
||||
| holder | phase | since | scope | queue |
|
||||
|--------|-------|-------|-------|-------|
|
||||
| Cursor-Auto | merging | 2026-09-16T13:20Z | matrix deep test → promote rc-v1.0.0-beta.2 + test rebuild | - |
|
||||
| - | idle | - | - | - |
|
||||
|
||||
**phase**: `idle` | `merging` | `smoke` | `e2e`
|
||||
|
||||
@@ -106,7 +119,7 @@
|
||||
| 环境 | 端口 | schema | 状态 |
|
||||
|------|------|--------|------|
|
||||
| dev | 8080 | **47** | healthy(`pi-agent` typed-result-v1;events worker `:8088`;notify/advance/projection live、fav off;health+ready PASS;demo 6001–6010 retired) |
|
||||
| test | 8081 | **47** | healthy(`rc-v1.0.0-beta.1`;pi-agent `:18866`;events `:8089`;notify/advance/projection live、fav off;health+ready PASS;schema 与 dev 对齐 47) |
|
||||
| test | 8081 | **47** | healthy(`rc-v1.0.0-beta.2`;pi-agent `:18866`;events `:8089`;notify/advance/projection live、fav off;health+ready PASS;矩阵深度测试 live 项目 3 PASS) |
|
||||
| main | 8000 | **47** | healthy(app + events + runner + DB;与 dev/test 对齐) |
|
||||
|
||||
## SSOT
|
||||
@@ -114,8 +127,9 @@
|
||||
| 类型 | 路径 |
|
||||
|------|------|
|
||||
| 文档总地图 | [../README.md](../README.md) |
|
||||
| 模块完成度 | [FEATURE-MATRIX](../status/FEATURE-MATRIX.md) |
|
||||
| 发布缺口 | [gap-matrix](../remediation/gap-matrix.md) |
|
||||
| 模块完成度 | [FEATURE-MATRIX](../status/FEATURE-MATRIX.md)(Wave 0 已校准契约与冻结边界) |
|
||||
| 发布缺口 | [gap-matrix](../remediation/gap-matrix.md)(`production_ready=yes`;Wave 0 IAM 只读未发现旁路) |
|
||||
| 连续性审计/计划 | [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/) |
|
||||
| Agent 手册 | [AGENTS.md](../../AGENTS.md) |
|
||||
| 意图双标签 busy 交接 | [./handoffs/2026-09-15-conversation-intent-dual-tab.md](./handoffs/2026-09-15-conversation-intent-dual-tab.md) |
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
---
|
||||
title: "Wave 0 FEATURE-MATRIX 校准完成 → 待合 dev / Wave 1"
|
||||
created: 2026-09-16
|
||||
from: Cursor
|
||||
to: next-agent
|
||||
status: done
|
||||
---
|
||||
|
||||
# 交接:FEATURE-MATRIX Wave 0 完成后
|
||||
|
||||
## 目标(下一位 Agent 应完成什么)
|
||||
|
||||
1. 开启 **Wave 1**:PU3 IAM fail-closed + PU5A TempDir race flake(独立 `fix/*` / `feature/*`,分 mutex `authz` / `ci`)。
|
||||
2. 勿把 Wave 0 的 `done` 行当作真实 PI 补证已完成;U8 / full-none 仍归 Wave 2。
|
||||
|
||||
## 已完成
|
||||
|
||||
- PU1:FEATURE-MATRIX 状态契约、行模板、status README
|
||||
- PU2:按冻结边界收口 L1 / Chat baseline / DocRev baseline / 前端 / 可靠事件;拆出 D3、D7、PI 叙事、U9–U12、FAV、artifact promotion
|
||||
- 修正漂移:schema 47、D3≠D5、IAM 历史缺口文案、事件与 FAV 拆行
|
||||
- 历史指针:multi-intent 设计、Phase2 remediation、HTTP envelope、Track E 复盘
|
||||
- IAM 只读核验:dev/test/main schema 47、IAM 表齐全、`ALLOW_IN_MEMORY=false`;**未**证实 MemoryStore 旁路 → **保持** `production_ready=yes`,未新增 gap-matrix blocker
|
||||
- 文档已 `--no-ff` 合入 `dev`;**未** push
|
||||
|
||||
## 未完成
|
||||
|
||||
- Wave 1+(IAM 代码 fail-closed、race、真实 PI 补证、nightly/receipt)
|
||||
|
||||
## 认领 / 槽位状态
|
||||
|
||||
| 项 | 值 |
|
||||
|----|-----|
|
||||
| mutex 已释放 | yes |
|
||||
| 集成槽位 holder | idle(合入后已释放) |
|
||||
| branch | 已合入 `dev`(merge commit) |
|
||||
| worktree | `.worktrees/feature-matrix-production-readiness-plan`(可移除) |
|
||||
|
||||
## 关键文件
|
||||
|
||||
| 路径 | 说明 |
|
||||
|------|------|
|
||||
| `.doc/status/FEATURE-MATRIX.md` | 校准后能力矩阵 |
|
||||
| `.doc/ops/short-term/2026-09-16-feature-matrix-wave0-calibration.md` | Wave 0 任务与 IAM 证据 |
|
||||
| `.doc/remediation/2026-09-16-feature-matrix-production-readiness-plan.md` | 五波总计划 |
|
||||
| `.doc/audit/2026-09-16-feature-matrix-production-readiness-audit.md` | 审计 |
|
||||
| `.doc/remediation/gap-matrix.md` | 仅增加 Wave 0 核验注记;`production_ready=yes` |
|
||||
|
||||
## 如何验证
|
||||
|
||||
```bash
|
||||
# 在 worktree
|
||||
git diff --check
|
||||
# 人工对账 FEATURE-MATRIX / CURRENT / gap-matrix 叙事一致
|
||||
# IAM 只读证据见 short-term「证据 / 备注」
|
||||
```
|
||||
|
||||
## 风险 / Blocker
|
||||
|
||||
- `store_factory.go` 仍可能在缺表时 silent MemoryStore → Wave 1 必须 fail-closed;当前部署未触发。
|
||||
- 合入前确认主仓 CURRENT 与 worktree 无冲突(主仓可能另有 matrix-deep-test 认领行)。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- CURRENT: [CURRENT.md](../CURRENT.md)
|
||||
- Task: [../short-term/2026-09-16-feature-matrix-wave0-calibration.md](../short-term/2026-09-16-feature-matrix-wave0-calibration.md)
|
||||
- Remediation: [../../remediation/2026-09-16-feature-matrix-production-readiness-plan.md](../../remediation/2026-09-16-feature-matrix-production-readiness-plan.md)
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: "Gitea nightly secrets 已本机配置"
|
||||
created: 2026-09-16
|
||||
from: Cursor
|
||||
to: any
|
||||
blocker: false
|
||||
---
|
||||
|
||||
# Gitea nightly secrets 已本机配置
|
||||
|
||||
## 已配置(weichen/Agent-System)
|
||||
|
||||
**Secrets**(API,值不入库):
|
||||
|
||||
- `RUNNER_AUTH_TOKEN` ← `configs/.env.dev`
|
||||
- `NIGHTLY_TEST_DATABASE_URL` → `127.0.0.1:5434/agent_wave2_pi`
|
||||
|
||||
**Variables**:
|
||||
|
||||
- `PI_AGENT_RUNNER_URL=http://127.0.0.1:18865`
|
||||
- `PI_AGENT_MODEL` ← `.env.dev` MINIMAX_MODEL_ID
|
||||
|
||||
## Runner(本机 `/home/weichen/gitea`)
|
||||
|
||||
- label:`nightly:host`(写入 `runner/data/.runner`,勿只改 compose)
|
||||
- `network_mode: host` + `address=http://127.0.0.1:3000`(PI 只绑 `127.0.0.1:18865`,bridge 不可达)
|
||||
- 挂载 brew + 宿主机 glibc + `/usr/bin/docker` + `/host-agent-data`(仓库 `data/`)
|
||||
- workflow:`DATA_DIR=/host-agent-data/test`;artifact 用本地 tar(Gitea 不支持 upload-artifact@v4)
|
||||
- `run-nightly-real-pi.sh`:全 SKIP / 镜像构建失败 → `infra_fail` receipt(不再 silent exit 127)
|
||||
|
||||
## 验证
|
||||
|
||||
- run#15:缺 node → FAIL
|
||||
- run#17:checkout/setup-go PASS;curl 缺失 → `infra_fail`;upload-artifact@v4 → GHESNotSupported
|
||||
- run#19:curl/PI OK;缺 docker + 无 DATA_DIR → SKIP 后 exit 127、无 receipt
|
||||
- run#21:DATA_DIR+docker OK;用例真实执行;receipt=`product_fail`;archive/summarize PASS
|
||||
(产品失败属套件本身,非 runner/secrets 配置问题)
|
||||
|
||||
## 触发
|
||||
|
||||
Gitea Actions → Nightly Real PI → Run workflow;或 schedule UTC 16:00。
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: "Phase 3 遗留清点收口"
|
||||
created: 2026-09-16
|
||||
from: Cursor
|
||||
to: any
|
||||
blocker: false
|
||||
---
|
||||
|
||||
# Phase 3 遗留清点收口
|
||||
|
||||
## 已关闭本轮
|
||||
|
||||
| 项 | 处置 |
|
||||
|----|------|
|
||||
| N7 U8 `quality_failed` 偶发 | `run-nightly-real-pi.sh` 对 quality_failed 全文重试一次;仍失败则 `product_fail`(非 PASS)。根因:模型质量门,非 secret/runner。 |
|
||||
| Playwright intent-plan 双标签 | 正式长期 gated + long-term 契约;矩阵关闭条件写死 |
|
||||
| Wave3 PU6–PU8 | 已 no-go(Phase 2) |
|
||||
| Artifact same-image | Wave2C done |
|
||||
|
||||
## 保留开放(需产品/另任务,不假装 done)
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| IAM 全路由 inventory | 仍开放;fail-closed 核心已签 |
|
||||
| session 中断负例 / 410 退役 | 需产品拍板 |
|
||||
| R13 全量清单勾选 | nightly 脱敏证据路径已有;完整 R13 矩阵另开 audit |
|
||||
| deterministic/B1–B4 持续回归 | 合入冒烟覆盖 short;全量门禁保持现有 CI |
|
||||
| FAV / 旁支分支 | CURRENT 已声明故意不合入 |
|
||||
|
||||
## 下一步
|
||||
|
||||
- 配置 Actions `RUNNER_AUTH_TOKEN` + `NIGHTLY_TEST_DATABASE_URL` 使 nightly 真跑
|
||||
- 获批后按 long-term 契约开 PU6–PU8 / Playwright 实现任务
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "纯软件项目自举工作流实施"
|
||||
status: planned
|
||||
status: in_progress
|
||||
created: 2026-09-14
|
||||
updated: 2026-09-14
|
||||
updated: 2026-09-16
|
||||
---
|
||||
|
||||
# 纯软件项目自举工作流实施
|
||||
@@ -22,6 +22,19 @@ updated: 2026-09-14
|
||||
- 真实 PI 和 Ubuntu 无头浏览器黄金项目验收通过;
|
||||
- 未实现受控代码执行前,系统不会直接修改项目仓库。
|
||||
|
||||
## 实施进度(2026-09-16)
|
||||
|
||||
| Epic | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| SWBOOT-00 | done(契约) | ADR `.doc/adr/2026-09-16-software-project-bootstrap-keys.md` |
|
||||
| SWBOOT-01 | done(迁移) | goose `00048` additive;活验待集成槽 |
|
||||
| SWBOOT-02..04 | done(L1) | manifests + catalog 五 key;医疗三门禁保留 |
|
||||
| SWBOOT-05..08 | partial | 后端 catalog/creation-preview/create 字段;七步 UI / 对话路由未做 |
|
||||
| SWBOOT-09 | partial | L1 单测报告已出;真实 PI/UI NOT RUN |
|
||||
| SWBOOT-10 | stub only | allowlist + fail-closed;无真实 patch/merge |
|
||||
|
||||
分支:`feature/software-project-bootstrap`(**未合 dev**)。
|
||||
|
||||
## 实施拆分
|
||||
|
||||
| Epic | 范围 | 依赖 | 验收 |
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "Playwright intent-plan 双标签 — 长期 gated"
|
||||
status: planned
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: TBD
|
||||
branch: feature/intent-plan-cards-playwright
|
||||
mutex: web
|
||||
---
|
||||
|
||||
# Playwright intent-plan 双标签 — 长期 gated
|
||||
|
||||
## 现状
|
||||
|
||||
- `web/e2e/intent-plan-cards.spec.ts`:`test.skip` unless `RUN_UI_ACCEPTANCE=1`;仅 body visible 骨架。
|
||||
- Conversation-intent 双标签已有 live 证据(项目 6275);**不等于** intent-plan confirm 双标签。
|
||||
- Wave2 明确不宣称 UI 双标签已绿。
|
||||
|
||||
## 关闭条件
|
||||
|
||||
1. 独立 short-term + `RUN_UI_ACCEPTANCE=1` 真浏览器:双标签 confirm 不同时本地成功
|
||||
2. 刷新/重登后与 PG plan 一致
|
||||
3. 报告归档 `.doc/test-reports/`;不升 MULTI_INTENT tier
|
||||
|
||||
## 非目标
|
||||
|
||||
- 用 stub/SKIP 冒充 PASS
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: "PU6 语义摘要 D3 — 获批后任务契约"
|
||||
status: planned
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: TBD
|
||||
branch: feature/pu6-semantic-summary
|
||||
mutex: chat
|
||||
go_no_go: go
|
||||
---
|
||||
|
||||
# PU6 语义摘要 D3 — 获批后任务契约
|
||||
|
||||
**go/no-go**:no-go(见 `.doc/ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md`)。已授权 GO;按 short-term 总控实施(默认 flag off)。
|
||||
|
||||
## 目标(获批后)
|
||||
|
||||
在授权可见集合上 shadow 语义摘要,可解释 fallback;通过后方可考虑替换 deterministic。
|
||||
|
||||
## 预注册门
|
||||
|
||||
- flag:`SEMANTIC_SUMMARY_SHADOW` → 可选 `SEMANTIC_SUMMARY_REPLACE`
|
||||
- 输入:authorized view only;无工具权限摘要器;R13 出站门
|
||||
- 失败:保留旧摘要/deterministic;标注 freshness
|
||||
- 负例:撤权消息不入摘要;injection 不能改权限
|
||||
|
||||
## 路径提示
|
||||
|
||||
`internal/ctxmgr/summarizer.go`、`internal/app/chatflow/`、`internal/server/chat_digest_api.go`、web 摘要消费组件
|
||||
|
||||
## 回滚
|
||||
|
||||
关 flag;读路径回 deterministic;保留历史证据指针
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: "PU7 PI change-report 叙事 — 获批后任务契约"
|
||||
status: planned
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: TBD
|
||||
branch: feature/pu7-pi-narrative
|
||||
mutex: docgov
|
||||
go_no_go: go
|
||||
---
|
||||
|
||||
# PU7 PI change-report 叙事 — 获批后任务契约
|
||||
|
||||
**go/no-go**:no-go。未获批禁止实现。
|
||||
|
||||
## 目标(获批后)
|
||||
|
||||
只读消费 immutable diff+lineage+risk floor 的 PI 叙事;任意 schema/超时/注入 → 全量 fallback。
|
||||
|
||||
## 预注册门
|
||||
|
||||
- flag:`PI_CHANGE_REPORT_NARRATIVE`
|
||||
- 禁止覆盖服务端风险/审批结论
|
||||
- typed schema + 文档版本 + input digest 绑定
|
||||
- UI 明确区分 narrative vs 事实字段
|
||||
|
||||
## 路径提示
|
||||
|
||||
`internal/docrevision/`、`deploy/pi-agent/` typed result、`ChangeReportPanel.tsx`
|
||||
|
||||
## 回滚
|
||||
|
||||
关 flag;仅 deterministic fallback;无第二份 candidate
|
||||
@@ -0,0 +1,19 @@
|
||||
---
|
||||
title: "PU8-U10 mutate — 获批后任务契约"
|
||||
status: planned
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: TBD
|
||||
branch: feature/pu8-u10-mutate
|
||||
mutex: intent-plan
|
||||
go_no_go: go
|
||||
flag: MULTI_INTENT_U10_MUTATE
|
||||
---
|
||||
|
||||
# PU8-U10 mutate
|
||||
|
||||
**go/no-go**:no-go。独立 flag;高风险动作绑定 expected revision + 显式确认 + 执行前再授权;不依赖 U9。
|
||||
|
||||
## 负例
|
||||
|
||||
未确认、越权、stale revision、重复提交 → 零越界副作用。
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
title: "PU8-U11 docgov action — 获批后任务契约"
|
||||
status: planned
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: TBD
|
||||
branch: feature/pu8-u11-docgov
|
||||
mutex: docgov
|
||||
go_no_go: go
|
||||
flag: MULTI_INTENT_U11_DOCGOV
|
||||
---
|
||||
|
||||
# PU8-U11 docgov
|
||||
|
||||
**go/no-go**:no-go。独立 flag/mutex;按钮与自然语言同一 owner command;项目 143 只读纪律不变。
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
title: "PU8-U12 workflow/run-control — 获批后任务契约"
|
||||
status: planned
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: TBD
|
||||
branch: feature/pu8-u12-workflow-run-control
|
||||
mutex: workflow
|
||||
go_no_go: go
|
||||
flag: MULTI_INTENT_U12_RUN_CONTROL
|
||||
---
|
||||
|
||||
# PU8-U12 workflow/run-control
|
||||
|
||||
**go/no-go**:no-go。独立 flag;双标签确认/取消仅一成功;投影停机时权威 GET 仍正确;回滚后计划可读/取消/finalize。
|
||||
@@ -0,0 +1,19 @@
|
||||
---
|
||||
title: "PU8-U9 segment proposal — 获批后任务契约"
|
||||
status: planned
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: TBD
|
||||
branch: feature/pu8-u9-segment-proposal
|
||||
mutex: intent-plan
|
||||
go_no_go: go
|
||||
flag: MULTI_INTENT_U9_SEGMENT
|
||||
---
|
||||
|
||||
# PU8-U9 segment proposal
|
||||
|
||||
**go/no-go**:no-go。规则无法判断时才出 segment proposal;超时/越界 fail closed;非 U10–U12 默认前置。
|
||||
|
||||
## 安全 stop gate
|
||||
|
||||
授权旁路 / 跨用户泄漏 / B1–B4 回归 → 停全部扩面并写 gap-matrix。
|
||||
@@ -1,12 +1,15 @@
|
||||
---
|
||||
title: "Track E 持久事件交付复盘"
|
||||
created: 2026-09-15
|
||||
updated: 2026-09-16
|
||||
status: done
|
||||
confidence: high
|
||||
---
|
||||
|
||||
# 调研:Track E 持久事件交付复盘
|
||||
|
||||
> **Superseded 指针(2026-09-16)**:共享 notify/advance/projection 已 live;生产闭包 hook 已退出;`DOC-RELIABILITY-PILOT` 在 gap-matrix 为 PASS。可靠事件核心见 [FEATURE-MATRIX](../../status/FEATURE-MATRIX.md) `done`;FAV 仍 `deferred`。下文「共享 off / OPEN」为复盘当时快照,勿作 live status。
|
||||
|
||||
## 结论
|
||||
|
||||
E0A–E1C 已在隔离库证明:领域变化、envelope、delivery 同 UoW;PG dispatcher 原子 lease/fencing;notify / workflow_advance / projection 各自 exactly-one visible outcome。共享集群消费者保持 **off**,HTTP 闭包仍是唯一真实写者。E2 已部署兼容守卫:消费者 `live` 时闭包停写,`off`/`shadow` 时闭包继续写。删除 `OnOutbox` / `AddOnApprovedHook` 必须等 live 发布窗口;当前删除会让 notify/advance 停写。`DOC-RELIABILITY-PILOT` 保持 OPEN。FAV 保持 disabled。
|
||||
@@ -21,12 +24,13 @@ E0A–E1C 已在隔离库证明:领域变化、envelope、delivery 同 UoW;P
|
||||
| E1B | [E1B 报告](../../test-reports/2026-09-15-event-e1b-workflow-advance-test-report.md) | 隔离库 unique stage-ready PASS;共享 off |
|
||||
| E1C | [E1C 报告](../../test-reports/2026-09-15-event-e1c-projection-test-report.md) | no-replace PASS;共享 off |
|
||||
| E2 | [E2 报告](../../test-reports/2026-09-15-event-e2-hook-guard-test-report.md) | live 停写;off/shadow 仍写;API 保留 |
|
||||
| Shared live(后续) | [notify](../../test-reports/2026-09-15-event-notify-shared-live-test-report.md) · [advance](../../test-reports/2026-09-15-event-workflow-advance-shared-live-test-report.md) · [projection](../../test-reports/2026-09-15-event-projection-shared-live-test-report.md) | 共享 live PASS(后于本复盘) |
|
||||
|
||||
## 开放问题
|
||||
## 开放问题(复盘当时;2026-09-16 状态)
|
||||
|
||||
- 共享环境尚未做 notify/advance/projection 的 live 切换与授权页刷新纵切,因此 Track E DoD 中「生产注册无 OnOutbox=」与「授权 UI 三类重启」未关闭。
|
||||
- 历史 inventory 的 repair/quarantine 真实批量审批未在共享库演练。
|
||||
- FAV 仍只预留 disabled 契约。
|
||||
- ~~共享环境尚未做 live~~ → **已关闭**(shared live 报告)。
|
||||
- 历史 inventory 的 repair/quarantine 真实批量审批未在共享库演练(仍开放,非发布 blocker)。
|
||||
- FAV 仍只预留 disabled 契约(FEATURE-MATRIX `deferred`)。
|
||||
|
||||
## 建议动作
|
||||
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "Wave 3 PU6–PU8 产品 go/no-go"
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
status: done
|
||||
confidence: high
|
||||
---
|
||||
|
||||
# 调研:Wave 3 PU6–PU8 产品 go/no-go
|
||||
|
||||
## 结论
|
||||
|
||||
**2026-09-16 用户授权覆盖**:选择全量 backlog 范围 **3(A+B)**,**PU6 / PU7 / PU8 / Playwright 双标签 / 软件自举 / FAV 增量 一律 GO(进入实施)**。
|
||||
|
||||
- 仍 **不** 默认升 `MULTI_INTENT_PLAN_TIER=full`;升 tier 另开任务。
|
||||
- 新能力默认 **flag off / shadow**;获证据后再独立开 flag。
|
||||
- 样本门槛豁免:用隔离合成会话替代 ≥20 痛点样本(owner=工程执行方 Cursor,授权记录见 short-term 总控)。
|
||||
|
||||
历史 no-go 记录保留于本文「历史结论」;实施以本节为准。
|
||||
|
||||
## 冻结字段(覆盖后)
|
||||
|
||||
| 字段 | 本轮取值 |
|
||||
|------|----------|
|
||||
| 用户信号 | **覆盖授权**:产品明确要求全量实施 |
|
||||
| 预期收益 | 体验增强 + 工程闭环;非 gap-matrix 首发 blocker |
|
||||
| 维护成本 | 高(真实 PI、R13、shadow、泄漏负例、回滚) |
|
||||
| owner | Cursor(工程)+ 用户授权 |
|
||||
| 最小样本 | **豁免**:隔离合成会话 + 负例矩阵 |
|
||||
| 晋级阈值 | 各契约预注册;未达则保持 shadow/off |
|
||||
| 零容忍失败 | 授权旁路、跨用户泄漏、双 writer、B1–B4 回归、敏感出站 |
|
||||
|
||||
## 分项决定
|
||||
|
||||
### PU6 语义摘要(D3)— **GO / planned**
|
||||
|
||||
- 契约:`.doc/ops/long-term/2026-09-16-pu6-semantic-summary-contract.md`
|
||||
- Flag:`SEMANTIC_SUMMARY_SHADOW`(默认 off)
|
||||
|
||||
### PU7 PI change-report 叙事 — **GO / planned**
|
||||
|
||||
- 契约:`.doc/ops/long-term/2026-09-16-pu7-pi-narrative-contract.md`
|
||||
- Flag:`PI_CHANGE_REPORT_NARRATIVE`(默认 off)
|
||||
|
||||
### PU8 多意图扩面(U9 / U10–U12)— **GO / planned(分项独立 flag)**
|
||||
|
||||
- 禁止共用一个开关批量上线;顺序 U9→U10→U11→U12。
|
||||
- 契约见 long-term `pu8-u9`…`pu8-u12`。
|
||||
|
||||
## 历史结论(2026-09-16 初版,已覆盖)
|
||||
|
||||
初版在缺少痛点样本与 owner 签字下为 **no-go / deferred**。已被本节用户授权覆盖;勿回退为实施禁令。
|
||||
|
||||
## 建议动作
|
||||
|
||||
- [x] 产品 go/no-go(覆盖授权)
|
||||
- [ ] 按 short-term `2026-09-16-full-backlog-override.md` 实施 P1–P7
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "FAV U7 增量合入(非整支 merge)"
|
||||
status: planned
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: feature/fav-u7-publisher
|
||||
worktree: "-"
|
||||
mutex: events
|
||||
---
|
||||
|
||||
# FAV U7 增量合入
|
||||
|
||||
## 目标
|
||||
|
||||
从 `feature/final-artifact-vault` **手工移植**经审计切片到 `dev`;consumer 默认 off;禁止整支 merge;禁止默认开 `FAV_DEGRADED_READ`。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [ ] cherry-pick / 移植 cmd/artifact-vault + vault HTTP + publisher 订阅
|
||||
2. [ ] 隔离库负例 + 默认 off 冒烟
|
||||
3. [ ] 独立 go/no-go 报告
|
||||
|
||||
## 非目标
|
||||
|
||||
- 整支 merge `feature/final-artifact-vault`
|
||||
- 未审计启用 degraded read
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: "FEATURE-MATRIX production-ready 连续性审计与完善计划"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Codex
|
||||
branch: feature/feature-matrix-production-readiness-plan
|
||||
worktree: ".worktrees/feature-matrix-production-readiness-plan"
|
||||
mutex: architecture-docs
|
||||
---
|
||||
|
||||
# FEATURE-MATRIX production-ready 连续性审计与完善计划
|
||||
|
||||
## 目标
|
||||
|
||||
核对 `FEATURE-MATRIX.md` 中除“纯软件项目自举”外的未完成项,形成不回退当前 `production_ready=yes` 基线的详细整改与验收计划。
|
||||
|
||||
## 范围
|
||||
|
||||
- 交叉核对 FEATURE-MATRIX、gap-matrix、CURRENT、相关设计、测试报告与当前源码。
|
||||
- 区分发布 blocker、补证、首发后增强、刻意关闭能力和文档漂移。
|
||||
- 输出 audit 与 remediation 文档,不修改业务代码或运行发布测试。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 实施任何业务功能、启用 feature flag、部署或合并到 `dev`。
|
||||
- 重新规划“纯软件项目自举”。
|
||||
- 将 U9–U12、FAV、完整 PI change-report 叙事改列为当前发布 blocker。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 完成启动协议与 SSOT 基线读取。
|
||||
2. [x] 逐项核对非自举 `partial` 行及证据漂移。
|
||||
3. [x] 写入 audit 与 remediation 方案。
|
||||
4. [x] 完成文档复核并更新本任务状态。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 明确回答当前是否仍有 production-ready blocker。
|
||||
- [x] 每个未完成项都有范围、依赖、关闭标准、验证层级和回滚边界。
|
||||
- [x] 方案明确保护 B1–B4、三环境 schema 47、默认 off/legacy/shadow 和真实 PI/UI 证据边界。
|
||||
- [x] 文档遵循 `.doc/` taxonomy,且未修改业务代码。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: `../../audit/2026-09-16-feature-matrix-production-readiness-audit.md`
|
||||
- Remediation: `../../remediation/2026-09-16-feature-matrix-production-readiness-plan.md`
|
||||
- Test report: 不适用(本任务仅审计与规划)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
当前基线来自 `CURRENT.md`、`gap-matrix.md`、B1–B4 测试报告及三环境 schema 47 记录;历史报告仅作为定位线索,计划要求实施阶段重新验证。
|
||||
|
||||
本轮未运行测试,因为没有业务代码变更,且 `ce-plan` 阶段只做研究与规划。
|
||||
@@ -0,0 +1,67 @@
|
||||
---
|
||||
title: "FEATURE-MATRIX Wave 0 校准与 IAM 只读核验"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: feature/feature-matrix-production-readiness-plan
|
||||
worktree: ".worktrees/feature-matrix-production-readiness-plan"
|
||||
mutex: architecture-docs
|
||||
---
|
||||
|
||||
# FEATURE-MATRIX Wave 0 校准与 IAM 只读核验
|
||||
|
||||
## 目标
|
||||
|
||||
校准 `FEATURE-MATRIX.md` 契约与行状态,只读核验三环境 IAM 部署事实,保持 `production_ready=yes` 不被无证据回退。
|
||||
|
||||
## 范围
|
||||
|
||||
- PU1:矩阵契约、行模板、status README
|
||||
- PU2:按冻结边界收口/拆行;修正 schema/D3/IAM/FAV 漂移;历史指针
|
||||
- IAM 只读核验(health/ready、IAM 表、PG store);仅真实旁路时改 gap-matrix
|
||||
- 文档提交于本 feature 分支;不合 `dev`、不改业务代码
|
||||
|
||||
## 非目标
|
||||
|
||||
- Wave 1+(IAM fail-closed 代码、race、真实 PI 补证、夜间 CI)
|
||||
- merge `dev` / push / 共享容器 rebuild
|
||||
- 重新运行生产验收冒充补证
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] CURRENT 登记认领 `architecture-docs` in_progress
|
||||
2. [x] PU1 扩展契约与模板
|
||||
3. [x] IAM 只读核验并落盘结论
|
||||
4. [x] PU2 收口矩阵行与历史指针
|
||||
5. [x] `git diff --check` + docs 提交 + handoff
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 矩阵可区分完成边界 / 发布关系 / 关闭条件 / 证据
|
||||
- [x] L1、Chat baseline、DocRev baseline、前端、可靠事件按冻结范围 `done`;增强拆行
|
||||
- [x] schema 45、D3/D5、IAM 过时缺口、事件+FAV 混行已纠正
|
||||
- [x] IAM 只读结论落盘;无证实旁路则不改 `production_ready`
|
||||
- [x] handoff 标明合 `dev` 与 Wave 1 入口待审
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Audit: `../../audit/2026-09-16-feature-matrix-production-readiness-audit.md`
|
||||
- Remediation: `../../remediation/2026-09-16-feature-matrix-production-readiness-plan.md`
|
||||
- Plan short-term (done): `./2026-09-16-feature-matrix-production-readiness-plan.md`
|
||||
- Handoff: `../handoffs/2026-09-16-feature-matrix-wave0-calibration.md`
|
||||
- Test report: 不适用(本波仅文档 + 只读核验)
|
||||
|
||||
## 证据 / 备注
|
||||
|
||||
### IAM 只读核验(2026-09-16,只读;未 restart / 未改代码)
|
||||
|
||||
| 环境 | health/ready | schema_version | goose max | `user_credentials` | IAM 相关表 | `ALLOW_IN_MEMORY` | ENV | 判定 |
|
||||
|------|--------------|----------------|-----------|--------------------|------------|-------------------|-----|------|
|
||||
| dev `:8080` | ok / ok | 47 | 47 | 147 rows | users, auth_sessions, system_roles, user_role_bindings, iam_system_config 等齐全 | false | dev | PG store 可达;fallback 未触发 |
|
||||
| test `:8081` | ok / ok | 47 | 47 | 4 rows | 同上 | false | test | 同上 |
|
||||
| main `:8000` | ok / ok | 47 | 47 | 1 row | 同上 | false | prod | 同上;`auth_sessions=0` 仅表示无活跃会话,不表示 MemoryStore |
|
||||
|
||||
`IAMTablesReady` 口径(`user_credentials` EXISTS)三环境均为 true。近期 app 日志无 MemoryStore / in-memory auth 命中。
|
||||
|
||||
**结论**:未发现当前 main/prod 正在触发 MemoryStore 旁路;**不**将 `production_ready` 回退;**不**新增 gap-matrix blocker。代码层 `NewStores` 在表缺失时仍可能 silent fallback → 归 Wave 1 PU3 fail-closed 加固。
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: "全量 backlog 覆盖 no-go 总控"
|
||||
status: in_progress
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: docs/override-nogo-full-backlog
|
||||
worktree: "-"
|
||||
mutex: architecture-docs
|
||||
---
|
||||
|
||||
# 全量 backlog 覆盖 no-go 总控
|
||||
|
||||
## 目标
|
||||
|
||||
按计划 P0–P7 收口工程残留并实施曾 no-go 的能力;默认 flag off;不升 `MULTI_INTENT_PLAN_TIER=full`;禁止整支 merge FAV。
|
||||
|
||||
## 授权
|
||||
|
||||
用户 2026-09-16 选择范围 **3(A+B 全开)**。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] P0 SSOT 翻转
|
||||
2. [ ] P1 nightly DATA_DIR 对齐 + green receipt
|
||||
3. [ ] P2 IAM inventory + 410 + R13
|
||||
4. [ ] P3 Playwright intent-plan 双标签
|
||||
5. [ ] P4 PU6 + PU7
|
||||
6. [ ] P5 PU8 U9→U12
|
||||
7. [ ] P6 SWBOOT-00…09(10 stub)
|
||||
8. [ ] P7 FAV 增量
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [ ] 各波 short-term / test-report 回链
|
||||
- [ ] FEATURE-MATRIX 对应行更新
|
||||
- [ ] CURRENT 焦点与认领同步
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Plan: full backlog override(Cursor plan)
|
||||
- go/no-go: [../research/2026-09-16-wave3-pu6-pu8-go-no-go.md](../research/2026-09-16-wave3-pu6-pu8-go-no-go.md)
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
title: "Gitea nightly host tools / network"
|
||||
created: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: fix/gitea-nightly-host-tools
|
||||
mutex: ci
|
||||
status: done
|
||||
---
|
||||
|
||||
# Gitea nightly host tools / network
|
||||
|
||||
## Goal
|
||||
|
||||
Make local Gitea `nightly:host` jobs able to run `actions/*` (node), health-check PI (`curl` → `127.0.0.1:18865`), and archive receipts without `upload-artifact@v4`.
|
||||
|
||||
## Done when
|
||||
|
||||
- [x] Runner host network + brew PATH (node/go/curl) + glibc mounts
|
||||
- [x] Workflow: replace upload-artifact@v4 with tar archive
|
||||
- [x] Nightly dispatch past infra curl; receipt not infra_fail due to missing tools
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "纯软件项目自举 SWBOOT-00..09 实施"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor-Auto
|
||||
branch: feature/software-project-bootstrap
|
||||
worktree: ".worktrees/feature-software-project-bootstrap"
|
||||
mutex: workflow-design
|
||||
---
|
||||
|
||||
# 纯软件项目自举 SWBOOT-00..09 实施
|
||||
|
||||
## 目标
|
||||
|
||||
落地 `software_bootstrap` / `software_delivery` 契约、迁移、manifest、目录白名单、创建向导后端钩子与 SWBOOT-10 allowlist stub;不合并 `dev`,不做真实受控改码。
|
||||
|
||||
## 范围
|
||||
|
||||
- SWBOOT-00 ADR
|
||||
- SWBOOT-01 项目域字段迁移
|
||||
- SWBOOT-02..04 catalog + manifests(无医疗污染)
|
||||
- SWBOOT-05..08 后端钩子(profile/创建预览/域过滤;UI 可部分)
|
||||
- SWBOOT-09 单元测试与报告
|
||||
- SWBOOT-10 allowlist stub only
|
||||
|
||||
## 非目标
|
||||
|
||||
- 合入 `dev`
|
||||
- 真实 PI / Ubuntu UI 全量黄金验收
|
||||
- 真实 repo patch/merge/push
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 认领 CURRENT + short-term
|
||||
2. [x] ADR
|
||||
3. [x] goose 00048
|
||||
4. [x] manifests + catalog allowlist
|
||||
5. [x] create-project wizard hooks + SWBOOT-10 stub
|
||||
6. [x] unit tests + test-report
|
||||
7. [x] push feature 分支 (`b5ce947`)
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 医疗三工作流目录与校验无回归(L1)
|
||||
- [x] 软件两 key 可选且无医疗默认语义
|
||||
- [x] 迁移 additive,旧项目不误分类(SQL 已写;活验 NOT RUN)
|
||||
- [x] SWBOOT-10 仅 stub,拒绝真实执行
|
||||
- [x] 测试报告落盘
|
||||
|
||||
## 相关链接
|
||||
|
||||
- ADR: `.doc/adr/2026-09-16-software-project-bootstrap-keys.md`
|
||||
- 设计: `.doc/system-design/2026-09-14-software-project-bootstrap-workflow.md`
|
||||
- Backlog: `.doc/ops/long-term/2026-09-14-software-project-bootstrap-implementation.md`
|
||||
- Checklist: `.doc/ops/checklists/2026-09-14-software-project-bootstrap-acceptance.md`
|
||||
- Test report: `.doc/test-reports/2026-09-16-software-project-bootstrap-test-report.md`
|
||||
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: "Wave 1 PU3 IAM store fail-closed"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: fix/iam-store-fail-closed
|
||||
worktree: "-"
|
||||
mutex: authz
|
||||
---
|
||||
|
||||
# Wave 1 PU3 IAM store fail-closed
|
||||
|
||||
## 目标
|
||||
|
||||
禁止非显式 opt-in 环境回退 MemoryStore;main/空值/缺表时启动 fail-closed。
|
||||
|
||||
## 范围
|
||||
|
||||
- `auth.NewStores` 双门:仅 `dev|test` + `AllowInMemory`
|
||||
- characterization + 负例测试
|
||||
- 测试夹具与严格鉴权用例适配
|
||||
- FEATURE-MATRIX IAM/CI 行进度更新
|
||||
|
||||
## 非目标
|
||||
|
||||
- 完整全路由 inventory(后续增量)
|
||||
- 真实 PI 补证(Wave 2)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 从 dev 开分支并认领
|
||||
2. [x] 先写负例测试再改 NewStores
|
||||
3. [x] 跑 auth/server 相关测试
|
||||
4. [x] 文档与提交
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] main/空 env/缺表不得 MemoryStore 继续服务
|
||||
- [x] 仅 dev/test + ALLOW_IN_MEMORY 可用内存 fixture
|
||||
- [x] 授权用户 happy path 不变(short 回归 PASS)
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Report: `../../test-reports/2026-09-16-wave1-iam-fail-closed-test-report.md`
|
||||
- Remediation PU3: `../../remediation/2026-09-16-feature-matrix-production-readiness-plan.md`
|
||||
- Wave 0 IAM 只读: `./2026-09-16-feature-matrix-wave0-calibration.md`
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: "Wave 1 PU5A TempDir race flake 修复"
|
||||
status: done
|
||||
created: 2026-09-16
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
branch: fix/race-tempdir-cleanup
|
||||
worktree: "-"
|
||||
mutex: ci
|
||||
---
|
||||
|
||||
# Wave 1 PU5A TempDir race flake 修复
|
||||
|
||||
## 目标
|
||||
|
||||
关闭全仓 `-race` 下 TempDir `RemoveAll` 与异步 taskrun worker 的竞态,证明 worker 在清理前已退出。
|
||||
|
||||
## 范围
|
||||
|
||||
- `taskrun.Manager` 增加 WaitRunDone / WaitIdle
|
||||
- `newTestServer` cleanup 在 TempDir 删除前 drain workers
|
||||
- 阻塞类用例显式 WaitRunDone(如需要)
|
||||
- 多轮 `-race` 验证与 test-report
|
||||
|
||||
## 非目标
|
||||
|
||||
- 夜间 PI / promotion receipt(PU5B)
|
||||
- IAM fail-closed(PU3,独立分支)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 认领 CURRENT
|
||||
2. [x] 实现 WaitIdle + newTestServer cleanup
|
||||
3. [x] 修补已知阻塞用例
|
||||
4. [x] `go test -race` 多轮验证并写报告
|
||||
5. [x] 提交
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 相关包/全仓 race 多轮无 TempDir RemoveAll flake
|
||||
- [x] 不用 skip/ignore 假绿
|
||||
- [x] 报告归档 `.doc/test-reports/`
|
||||
|
||||
## 相关链接
|
||||
|
||||
- Remediation PU5A: `../../remediation/2026-09-16-feature-matrix-production-readiness-plan.md`
|
||||
- Report: `../../test-reports/2026-09-16-wave1-race-tempdir-cleanup-test-report.md`
|
||||
- Handoff: `../handoffs/2026-09-16-feature-matrix-wave0-calibration.md`
|
||||
@@ -1 +1,19 @@
|
||||
| <模块名> | <能力描述> | planned | (设计/代码/test-report 链接) | (缺口) | `<mutex>` |
|
||||
# FEATURE-MATRIX 行模板
|
||||
|
||||
复制到 [FEATURE-MATRIX.md](../../status/FEATURE-MATRIX.md) 的完成度表中。能力状态与 `production_ready`(gap-matrix)正交。
|
||||
|
||||
| 字段 | 填写说明 |
|
||||
|------|----------|
|
||||
| 模块 | 短名 |
|
||||
| 声明范围 | 本行冻结边界;`done` 只覆盖此范围 |
|
||||
| 状态 | `done` \| `partial` \| `planned` \| `deferred` \| `blocked` |
|
||||
| 发布关系 | `non_blocker` / `补证` / `加固` / `deferred_enhancement` |
|
||||
| 证据 | 设计/代码/test-report 链接;可追 commit/环境/schema |
|
||||
| 剩余工作 / 关闭条件 | partial/planned 必填;stub/SKIP/fallback 不得冒充关闭 |
|
||||
| mutex | 与 CURRENT 并行认领一致 |
|
||||
|
||||
```markdown
|
||||
| <模块名> | <声明范围> | planned | non_blocker | (设计/代码/test-report 链接) | (关闭条件) | `<mutex>` |
|
||||
```
|
||||
|
||||
拆行收口时另在「边界 lineage」区记录 before/after、义务去向与证据覆盖结论。
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
---
|
||||
title: "HTTP 与 SSE 公开错误信封整改"
|
||||
status: planned
|
||||
status: implemented
|
||||
created: 2026-09-15
|
||||
updated: 2026-09-15
|
||||
updated: 2026-09-16
|
||||
owner: Cursor
|
||||
---
|
||||
|
||||
# HTTP 与 SSE 公开错误信封整改
|
||||
|
||||
> **Implemented(2026-09-16)**:H1–H3 已有 [test-report](../test-reports/2026-09-15-http-error-envelope-h1-h3-test-report.md)。活状态见 [FEATURE-MATRIX](../status/FEATURE-MATRIX.md) / CURRENT;本文保留为方案原文。
|
||||
|
||||
## 背景
|
||||
|
||||
Phase 2 复核确认错误信封涉及全部 HTTP 路由、SSE transport 和前端解析,属于独立 wire-contract 改造,不应阻塞持久事件交付。审阅见 [模块解耦 Phase 2 方案审阅](../audit/2026-09-15-module-decoupling-phase2-plan-review.md)。
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
---
|
||||
title: "模块解耦 Phase 2:持久事件交付与后续解耦路线"
|
||||
status: planned
|
||||
status: implemented
|
||||
created: 2026-09-15
|
||||
updated: 2026-09-15
|
||||
updated: 2026-09-16
|
||||
type: refactor
|
||||
owner: TBD
|
||||
---
|
||||
|
||||
# 模块解耦 Phase 2:持久事件交付与后续解耦路线
|
||||
|
||||
> **Implemented / superseded(2026-09-16)**:Track E(E0A–E2)与 shared live、D4–D7b、HTTP 信封 H1–H3、PI typed-result-v1 已有验收报告并合入;可靠事件核心在 [FEATURE-MATRIX](../status/FEATURE-MATRIX.md) 标 `done`,FAV 独立 `deferred`。活状态以 FEATURE-MATRIX / CURRENT / gap-matrix 为准;本文保留为历史方案,不删除。
|
||||
|
||||
## 决策摘要
|
||||
|
||||
Phase 2 的核心交付只包含持久事件链:修正事件生产、补齐 PostgreSQL 投递实现、用无副作用 shadow 对账替换闭包桥,并以授权用户刷新/重启后的正文恢复作为停走门。
|
||||
|
||||
@@ -0,0 +1,454 @@
|
||||
---
|
||||
title: "FEATURE-MATRIX Production-Ready Continuity - Plan"
|
||||
type: refactor
|
||||
date: 2026-09-16
|
||||
deepened: 2026-09-16
|
||||
status: in_progress
|
||||
artifact_contract: ce-unified-plan/v1
|
||||
product_contract_source: ce-plan-bootstrap
|
||||
execution: code
|
||||
wave0: done
|
||||
---
|
||||
|
||||
# FEATURE-MATRIX Production-Ready Continuity - Plan
|
||||
|
||||
## Goal Capsule
|
||||
|
||||
- **Objective:** 让维护者能够从 `FEATURE-MATRIX.md` 准确判断当前发布基线、真实剩余工作和每项工作的关闭条件,同时保持已经签署的 production-ready 状态不被文档整理或后续增强误伤。
|
||||
- **Means:** 将能力成熟度与发布门禁拆成两个正交维度,先校准证据和状态,再按“补证、基建加固、可选增强”分波实施(KTD1、KTD2)。
|
||||
- **Authority:** `gap-matrix.md` 决定发布 blocker;`FEATURE-MATRIX.md` 决定能力成熟度;`CURRENT.md` 记录协作与环境快照。
|
||||
- **Execution profile:** verification-first;文档校准不改业务行为;新能力默认 off、legacy 或 shadow;跨环境先以 receipt 绑定同一 commit 和 digest,PU5B 完成后只晋升同一已验证 image。
|
||||
- **Stop conditions:** 任一波发现授权旁路、持久化丢失、双写者、跨用户泄漏、当前 B1–B4 回归或 main/prod fail-open 时,停止扩面并将该问题写入 `gap-matrix.md`。
|
||||
|
||||
---
|
||||
|
||||
## Product Contract
|
||||
|
||||
### Summary
|
||||
|
||||
当前系统按仓库 SSOT 已达到 `production_ready=yes`。本计划不重新定义首发范围,而是修正矩阵漂移,补上可判定的关闭条件,并把剩余工作排成不会改变当前默认路径的独立波次。
|
||||
|
||||
### Problem Frame
|
||||
|
||||
`FEATURE-MATRIX.md` 目前把五类状态都写成 `partial`:已完成但文档未收口、实现完成但真实证据未签、首发后增强、实验性能力和刻意关闭能力。结果是维护者无法从矩阵判断哪些事项会影响发布,也无法知道某行何时能转为 `done`。
|
||||
|
||||
矩阵还存在已确认的事实漂移:schema 45 与当前 schema 47 冲突,语义摘要编号误写为 D5,IAM 仍列出已经闭环的历史读取授权缺口,可靠事件核心被 FAV 的 off 状态拖成 `partial`。这些问题需要先在文档层纠正,再决定是否立业务实现任务。
|
||||
|
||||
### Requirements
|
||||
|
||||
#### Status and ownership
|
||||
|
||||
| ID | Requirement |
|
||||
|---|---|
|
||||
| R1 | `production_ready` 只由 `gap-matrix.md` 的发布门禁决定;能力行不是“全部 done 才能发布”的总开关。 |
|
||||
| R2 | 每行必须声明既定能力边界、能力状态、发布关系、剩余工作、关闭条件、owner/mutex 和当前证据。 |
|
||||
| R3 | `done` 表示本行声明能力已达到生产验收,不表示该领域没有后续;新增增强应拆行或进入 backlog。 |
|
||||
| R4 | 补证、修复、增强、实验和 deferred 能力必须分开,不能共用一个模糊的“后续”。 |
|
||||
|
||||
#### Evidence and release safety
|
||||
|
||||
| ID | Requirement |
|
||||
|---|---|
|
||||
| R5 | 状态提升必须同时核对源码、迁移、部署 artifact、API/runtime 和适用测试层级;单独改文档不得提升能力状态。 |
|
||||
| R6 | 证据必须记录或可追到 commit、环境、schema、镜像、runner/model/protocol、日期和测试类型。 |
|
||||
| R7 | 代码、schema、compose、flag、runner 协议或环境晋升触发受影响行重验;历史报告保留但不得证明新 artifact。 |
|
||||
| R8 | 新功能先使用 additive migration 和兼容读取,再以 off/legacy/shadow 上线;任何放量都要有独立回滚点。 |
|
||||
| R9 | 回滚必须能读取、取消和收口已持久化的 plan/run/event;禁止回滚 schema 或让旧 app/worker 不认识新状态。 |
|
||||
|
||||
#### Authorization and agent behavior
|
||||
|
||||
| ID | Requirement |
|
||||
|---|---|
|
||||
| R10 | UI、API、聊天和产品 PI Agent Runner 必须进入同一 owner service,并共享即时授权、资源版本、幂等、审计和错误语义。 |
|
||||
| R11 | 正文、计数、摘要、搜索、计划卡、RAG 和 Agent tools 必须从同一授权后可见集合派生。 |
|
||||
| R12 | 产品 PI Runner 只生成建议、内容或解释;权限判断、状态迁移、版本提交和法定审批由服务端及已认证用户完成。 |
|
||||
| R13 | 所有真实 PI 路径必须共享最小化出站、tenant/project 绑定、敏感字段脱敏、凭证最小权限、日志/产物留存和泄漏负例;夜间验收只使用隔离的合成数据。 |
|
||||
|
||||
### Actors
|
||||
|
||||
- A1. 文档维护者:更新矩阵、证据链接和历史 superseded 指针。
|
||||
- A2. 发布负责人:决定 blocker、环境晋升、回滚和 production-ready 翻旗。
|
||||
- A3. 模块 owner:实现或验证单个 action,不跨 mutex 批量扩面。
|
||||
- A4. 最终用户:通过 UI、API 或聊天使用同一服务端能力。
|
||||
- A5. 产品 PI Agent Runner:受控生成或解释,不承担 authority。
|
||||
|
||||
### Key Flows
|
||||
|
||||
- F1. 矩阵状态更新
|
||||
- **Trigger:** 新实现、补证或环境晋升完成。
|
||||
- **Actors:** A1、A2、A3。
|
||||
- **Steps:** 核对行边界 → 匹配证据 → 评估发布关系 → 更新矩阵 → 仅在 blocker 变化时更新 gap-matrix。
|
||||
- **Outcome:** 能力状态和发布状态不互相污染。
|
||||
- F2. 增强能力上线
|
||||
- **Trigger:** 一个 deferred/partial 子能力获批实施。
|
||||
- **Actors:** A2、A3、A4、A5。
|
||||
- **Steps:** additive migration → 默认关闭 → 隔离验证 → dev 灰度 → test 晋升 → main 晋升或独立回滚。
|
||||
- **Outcome:** 当前路径持续可用,新能力只在证据完整后放量。
|
||||
|
||||
### Acceptance Examples
|
||||
|
||||
- AE1. **Covers R1–R4.** 前端工作台现有范围证据完整时,该行可改 `done`;未来其他 409 消费方优化进入独立 backlog,不把该行退回 `partial`。
|
||||
- AE2. **Covers R5–R9.** multi-intent U8 adapter 已合入但真实 PI 为 SKIP 时,矩阵写“代码与默认 legacy 基线完成、真实生成闭环未签”,tier 不升到 `confirm/full`。
|
||||
- AE3. **Covers R10–R12.** full 文档由真实 PI 生成后由独立用户完成审核/批准;none 文档生成后无审批动作且不阻塞阶段。
|
||||
- AE4. **Covers R5–R8.** PI change-report 超时或返回非法 schema 时,用户仍看到明确标记的 deterministic fallback,候选版本和正文不被 PI 输出修改。
|
||||
- AE5. **Covers R1、R6、R7.** 夜间真实 PI 因 runner 不可用失败时,结果记为 infrastructure failure 并阻止下一次晋升;已发布版本不会被自动改写为未就绪。
|
||||
|
||||
### Scope Boundaries
|
||||
|
||||
#### In scope
|
||||
|
||||
- 整改 `FEATURE-MATRIX.md` 的状态契约、行边界、证据和关闭条件。
|
||||
- 同步仍作为活 SSOT 的 CURRENT、gap-matrix、remediation index 和历史文档指针。
|
||||
- 安排 IAM、补证、CI、语义摘要、PI change-report、多意图扩面的后续工作。
|
||||
- 为每个波次定义回归、部署、证据和回滚门。
|
||||
|
||||
#### Deferred to Follow-Up Work
|
||||
|
||||
- Final Artifact Vault:独立审计,保持 `FAV_DEGRADED_READ=false`,禁止整支合入 `feature/final-artifact-vault`。
|
||||
- 多意图 U9 LLM 分段实验:仅在预注册真实 PI eval 阈值通过且安全错误为 0 后考虑放量。
|
||||
- 多意图 U10–U12:每个 action 独立任务、flag、owner、授权负例和回滚点。
|
||||
- D7 对话留存与敏感字段加密:独立安全治理项;先完成数据分类、当前数据库/备份/日志控制盘点和合规口径,再设计迁移、回滚与验收。若盘点确认当前基线违反已确认的安全或合规要求,必须立即写入 `gap-matrix.md`,不能继续作为普通 backlog。
|
||||
|
||||
#### Out of scope
|
||||
|
||||
- 纯软件项目自举。
|
||||
- 将 Herdr、`context_pi`、Cursor、Codex 或其他工程协作 Agent 作为产品 PI Agent Runner 的验收证据。
|
||||
- 在本次方案编制和 Wave 0 阶段修改业务代码、启用 dormant flag、合并 `dev` 或操作共享容器。
|
||||
|
||||
### Success Criteria
|
||||
|
||||
1. 维护者能在一行内判断“当前能力是否完成、是否影响发布、还差什么、用什么证据关闭”。
|
||||
2. 已确认的 L1、前端工作台和可靠事件核心不再因无关 backlog 永久 `partial`。
|
||||
3. IAM、multi-intent U8、full/none、CI、语义摘要和 PI 叙事都有独立的关闭条件,不再用 stub、SKIP 或 fallback 冒充完整验收。
|
||||
4. 后续任一波失败都可回到当前默认路径,B1–B4 和 schema 47 基线不被破坏。
|
||||
|
||||
---
|
||||
|
||||
## Planning Contract
|
||||
|
||||
### Key Technical Decisions
|
||||
|
||||
- KTD1. **能力状态与发布状态正交。** `FEATURE-MATRIX.md` 记录能力成熟度,`gap-matrix.md` 记录发布 blocker;仅当前生产契约被证据推翻时回退 `production_ready`。Governs R1–R4。
|
||||
- KTD2. **按冻结的能力边界关闭行。** 已完成范围转 `done`,新增增强拆成新行或 backlog,避免永久 `partial`。任何边界变更都要保留 before/after、逐项迁移去向和原边界已满足的证据,禁止靠缩小口径制造 `done`。Governs R2–R4。
|
||||
- KTD3. **证据按变化触发重验。** 不设机械 TTL;按代码、schema、artifact、flag、runner/protocol 和环境晋升触发重验。Governs R5–R7。
|
||||
- KTD4. **补证和修复分离。** full/none 与 multi-intent U8 先执行真实验收;只有验收失败并定位为产品缺陷后才开修复分支,修复后必须重验。Governs R5、R8。
|
||||
- KTD5. **逐能力安全放量。** migration 只 expand,新能力默认 off/legacy/shadow,app/worker 保持向后读取和收口能力。Governs R8、R9。
|
||||
- KTD6. **共享 command 与共享 authorized view。** 所有入口调用同一 owner port,读模型从同一授权集合派生。Governs R10、R11。
|
||||
- KTD7. **PI 叙事不成为事实源。** diff、lineage、risk floor、版本和审批由服务端确定;PI 失败时保留显式 fallback。Governs R12。
|
||||
- KTD8. **同一 artifact 晋升是独立发布加固。** 在不可变镜像流水线落地前,dev/test/main 至少记录同一候选 commit、各环境 image digest 和构建证明,不得声称已实现 same-image promotion;落地后 test/main 只引用候选 commit 一次构建出的 digest。Governs R5、R7–R9。
|
||||
|
||||
### High-Level Technical Design
|
||||
|
||||
#### Status decision
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
A[Read declared capability boundary] --> B{Current evidence satisfies boundary?}
|
||||
B -->|No| C{Is capability active in release path?}
|
||||
C -->|Yes and contract regressed| D[Mark blocked and update gap-matrix]
|
||||
C -->|No| E[Keep partial, planned, or deferred]
|
||||
B -->|Yes| F{Remaining work belongs to same boundary?}
|
||||
F -->|Yes| G[Keep partial with explicit exit gate]
|
||||
F -->|No| H[Mark current row done]
|
||||
H --> I[Create separate enhancement or deferred row]
|
||||
```
|
||||
|
||||
#### Safe rollout and rollback
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
A[Expand schema and compatible readers] --> B[Deploy flag off or legacy]
|
||||
B --> C[Unit and isolated PG evidence]
|
||||
C --> D[Dev shadow or targeted live]
|
||||
D --> E{Stop gate passes?}
|
||||
E -->|No| F[Disable new writes and drain]
|
||||
F --> G[Keep read, cancel, and finalize compatibility]
|
||||
E -->|Yes| H[Test promotion with receipt]
|
||||
H --> I[Main promotion with same commit and proven digest]
|
||||
I --> J[Update evidence and matrix]
|
||||
```
|
||||
|
||||
### Current Residual Work Map
|
||||
|
||||
| Area | Baseline now | Required closure | Current classification / transition |
|
||||
|---|---|---|---|
|
||||
| Intent L1 | 18 类、三分支、读写分流、busy 已签 | 从本行移除 U9–U12,确认纯依赖门禁仍在 | `done` |
|
||||
| Multi-intent baseline | U1–U8 code/default legacy + Wave2 real PI | Playwright 双标签仍 gated;升 tier 另开 | `done` |
|
||||
| Multi-intent expansion | U9–U12 未进入首发 | U9 eval;U10–U12 per-action | 当前 `deferred`;获批 short-term 开始后转 `partial` |
|
||||
| Chat / ctxmgr baseline | 刷新恢复与授权同集已签 | 修正文档状态;新摘要另列 | `done` |
|
||||
| Semantic summary (D3) | deterministic summary 已有 | 产品 go/no-go;授权输入、shadow、fallback | 当前 `deferred`;获批 short-term 开始后转 `partial` |
|
||||
| Chat data governance (D7) | 当前生产控制待盘点 | 数据分类、留存删除、数据库/备份/日志控制与敏感字段加密边界 | `deferred`;确认违规时升级 blocker |
|
||||
| Workflow governance | 正式工作流、鉴权、三工作流 PI、full/none 长链已签 | 纯软件自举仍 planned | `done` |
|
||||
| IAM / authz | 已知历史读取缺口已闭环 | 全路由 inventory、PG fail-closed、410 决策 | `partial` |
|
||||
| Document revision baseline | 账本、确定性 diff/lineage 与 UI 已签 | 修正文档状态;PI 叙事另列 | `done` |
|
||||
| PI change-report narrative | deterministic report 已有 | 产品 go/no-go;只读 narrative、fallback 永久保留 | 当前 `deferred`;获批 short-term 开始后转 `partial` |
|
||||
| Frontend workbench | 当前声明范围均有证据 | 修正文档状态;增强另列 | `done` |
|
||||
| CI / E2E | PR CI、PG、backup、web 已有 | nightly real PI;TempDir race flake | `partial` |
|
||||
| Artifact promotion | 同 commit + receipt digests + 单机 same-image pin 已落地 | 远程 registry 不可变推送另立 | 当前 `done`(Wave 2C;单机 retag) |
|
||||
| Reliable events | 核心 live 且旧 hook 退出 | 与 FAV 拆行 | `done` |
|
||||
| FAV | 明确 off | 独立审计与 go/no-go | `deferred` |
|
||||
|
||||
### Phased Delivery
|
||||
|
||||
| Wave | Units | Release behavior | Exit gate |
|
||||
|---|---|---|---|
|
||||
| Wave 0: SSOT calibration | PU1–PU2 | 只改文档,不改代码或 flag;先只读核对已部署 IAM store 选择和缺表行为 | 三份 SSOT 无矛盾;历史指针可追溯;若发现当前发布契约回归,先更新 gap-matrix 再退出本波 |
|
||||
| Wave 1: Safety guardrails | PU3、PU5A | IAM fail-closed 与 race 修复独立交付 | 当前 B1–B4 全绿;授权用户 happy path 不变;新增 fail-closed 负例通过 |
|
||||
| Wave 2: Evidence closure | PU4 | 补真实 PI/browser/restart 证据;产品缺陷另开原子修复任务后重验 | 目标场景 PASS,或以明确 FAIL/blocker 退出;不得用“已分类”冒充关闭 |
|
||||
| Wave 2B: Release hardening | PU5B | 夜间 PI、promotion receipt、不可变 artifact 分阶段落地 | gate 可执行、可审计、可人工豁免且不改变已发布版本状态 |
|
||||
| Wave 3: Optional capability selection | PU6–PU8 | 只做逐能力 go/no-go 和独立任务设计;未获批不实施 | 有用户信号、收益、维护成本、owner 和预注册阈值;否则保持 deferred |
|
||||
|
||||
### System-Wide Impact
|
||||
|
||||
- **Authorization:** IAM inventory 覆盖 list/detail/search/export/count/SSE/RAG/Agent tools;任何 unavailable/error 路径 fail closed。
|
||||
- **Data lifecycle:** 新状态采用 additive migration;回滚继续读取和收口已有 plan/run/event。
|
||||
- **Agent parity:** UI、API、聊天和产品 PI Runner 共享 owner command 与 authorized view;Herdr 不进入产品验收。
|
||||
- **PI data boundary:** 真实 PI 只接收 allowlist 后的最小输入,并绑定 tenant/project;服务端脱敏,凭证最小权限且可轮换,日志和测试产物有访问与保留边界。
|
||||
- **Operations:** worktree 只做静态、单元和隔离 PG;合入、rebuild、共享容器和环境晋升占唯一集成槽。
|
||||
- **Documentation:** 历史证据不删除;过时文档增加 superseded/implemented 指针。
|
||||
|
||||
### Risks and Mitigations
|
||||
|
||||
| Risk | Consequence | Mitigation |
|
||||
|---|---|---|
|
||||
| 文档修改直接把 partial 改 done | 状态提升没有新证据 | PU1 定义证据门;PU2 只对已满足冻结边界的行收口 |
|
||||
| main 缺 IAM 表时回退内存 store | 权限和会话失去持久权威 | PU3 改为 dev/test 显式双门 opt-in;空值、未知环境和 main/prod 一律 fail closed |
|
||||
| multi-intent U8 code-complete 被写成 real-PI-complete | 误升 tier 后出现双执行或不可恢复 | PU4 独立补真实 PI、撤权、刷新和重启证据 |
|
||||
| full/none 语义混淆 | none 被错误要求审批或阻塞阶段 | PU4 分别验证 full 人工审批与 none 免审批负例 |
|
||||
| PI narrative 覆盖确定性事实 | 报告失真或阻断版本流程 | PU7 只消费只读 diff+lineage,任何 schema 偏差全量降级 |
|
||||
| 夜间 PI 偶发失败污染发布状态 | 无法区分供应商故障和产品回归 | PU5B 分类 infra/product failure,以 commit/digest receipt 阻止下一次晋升并保留审计豁免 |
|
||||
| 多 action 共用开关 | 无法单独回滚 | PU8 只产出独立 short-term、flag、owner 和证据契约,不在本计划批量实现 |
|
||||
| FAV 整支合入 | 带入旧实现或启用 degraded read | 保持 deferred;未来只摘取已审计的原子提交 |
|
||||
|
||||
---
|
||||
|
||||
## Implementation Units
|
||||
|
||||
### PU1. Define the matrix contract
|
||||
|
||||
- **Goal:** 为 `FEATURE-MATRIX.md` 建立能力状态、发布关系、关闭条件和证据字段的稳定契约。
|
||||
- **Requirements:** R1–R7。
|
||||
- **Dependencies:** 无。
|
||||
- **Files:** `.doc/status/FEATURE-MATRIX.md`、`.doc/ops/templates/feature-matrix-row.md`、`.doc/status/README.md`。
|
||||
- **Approach:**
|
||||
1. 在矩阵说明中定义 `done|partial|planned|deferred|blocked` 的判定和 `production_ready` 的独立来源。
|
||||
2. 将当前单一表改为可扫描的字段集合:声明范围、能力状态、发布关系、剩余工作、关闭条件、证据、owner/mutex。
|
||||
3. 定义证据 provenance 与重验触发器;不要把环境瞬时健康等同于代码已部署。
|
||||
- **Patterns to follow:** `gap-matrix.md` 的 blocker SSOT、`CURRENT.md` 的环境快照、`feature-matrix-row.md` 模板。
|
||||
- **Test scenarios:** Test expectation: none — 文档契约变更,不改变运行行为。
|
||||
- **Verification:** 模板和矩阵字段一致;每个状态都能由文档规则唯一解释;链接和 Markdown 校验通过。
|
||||
|
||||
### PU2. Reconcile current rows and historical pointers
|
||||
|
||||
- **Goal:** 修复已确认漂移,并将已完成基线与独立增强拆行。
|
||||
- **Requirements:** R1–R7。
|
||||
- **Dependencies:** PU1。
|
||||
- **Files:** `.doc/status/FEATURE-MATRIX.md`、`.doc/ops/CURRENT.md`、`.doc/remediation/gap-matrix.md`、`.doc/remediation/INDEX.md`、`.doc/system-design/2026-09-15-multi-intent-hitl-plan.md`、`.doc/remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md`、`.doc/remediation/2026-09-15-http-error-envelope-remediation.md`、`.doc/ops/research/2026-09-15-track-e-retrospective.md`。
|
||||
- **Approach:**
|
||||
1. 把 schema 45 改为当前 schema 47,纠正 D3/D5,移除 IAM 已关闭缺口。
|
||||
2. 将 L1、Chat/ctxmgr baseline、Document revision baseline、前端工作台、可靠事件核心按冻结范围评估为 `done`;把语义摘要、PI 叙事、多意图扩面和 FAV 分成独立行。
|
||||
3. 给被后续报告取代的历史文档增加 implemented/superseded 指针,不删除历史证据。
|
||||
4. 在任何状态收口前,只读核对已部署环境的 IAM store 选择、schema 47 IAM 表和缺表行为;确认 fallback 不可达才保持 `production_ready=yes`。若发现当前发布契约回归,立即更新 gap-matrix blocker,不等待后续波次。
|
||||
5. 每个拆行保留 before/after 边界、原义务的新去向和原边界已满足的证据,禁止仅通过缩小描述把行改为 `done`。
|
||||
- **Patterns to follow:** `.doc/archive/` 的历史保留纪律、现有测试报告回链。
|
||||
- **Test scenarios:** Test expectation: none — 这是证据对账和 SSOT 修订。
|
||||
- **Verification:** FEATURE-MATRIX、CURRENT、gap-matrix 对 schema、门禁和非 blocker 列表的叙事一致;不存在失效链接或相互矛盾状态。
|
||||
|
||||
### PU3. Close IAM inventory and production fail-closed gaps
|
||||
|
||||
- **Goal:** 用全路由证据替代旧抽样矩阵,并禁止 main/prod 在 IAM 表未就绪时回退内存 authority。
|
||||
- **Requirements:** R5–R12。
|
||||
- **Dependencies:** PU1;PU2 已完成部署事实核对。
|
||||
- **Files:** `.doc/audit/authorization-matrix-v2.md`、`internal/server/server.go`、`internal/server/auth_helpers.go`、`internal/server/chat_history_auth.go`、`internal/auth/store_factory.go`、`internal/auth/store_factory_test.go`、`internal/server/security_p0_test.go`、`internal/server/*_authz*_test.go`。
|
||||
- **Approach:**
|
||||
1. 从注册路由生成或维护 resource/action/owner/authn/ReBAC/ABAC/duty/negative-test inventory。
|
||||
2. 先验证 list/detail/search/export/count/SSE/RAG/Agent tools 是否共享授权集合;只修复确认的旁路。
|
||||
3. 只有环境明确为 dev/test 且 `ALLOW_IN_MEMORY=true` 时才允许测试 fallback;环境空值、未知值、main/prod、pool 缺失、IAM 表缺失或授权依赖不可用时一律启动失败或请求 fail closed。
|
||||
4. 先验证 schema 47 的 IAM 表在目标环境确实存在;缺迁移则以 additive migration 修复后再启用 fail-closed,禁止让保护措施把环境永久变成不可部署。
|
||||
5. 已建立 session 的请求也在授权依赖不可用时 fail closed;依赖恢复后按既有健康检查/重连路径恢复,不沿用缓存的旧授权。
|
||||
6. 将旧 API 410 视为兼容策略,依据遥测决定长期保留或退役,不再把“存在 410”本身写成能力缺口。
|
||||
- **Execution note:** 先添加 characterization 和负例,再修改 store selection 或路由授权。
|
||||
- **Test scenarios:**
|
||||
- main 配置下 IAM 表缺失时,应用不得创建 MemoryStore 管理员并继续服务。
|
||||
- 非成员、非 session owner、错误 stage、错误 duty 读取正文、计数、搜索、导出、SSE、RAG 和 Agent tool 时均拒绝且不泄漏资源存在性。
|
||||
- 管理员例外只通过服务端 `IsSystemAdmin`,请求体/header 不能伪造。
|
||||
- 权限在确认后撤销时,执行前重新授权并保持零副作用。
|
||||
- 仅 dev/test 加显式 opt-in 时内存 fixture 可用;环境未设置、拼错或 opt-in 为 false 均 fail closed。
|
||||
- IAM 依赖在 session 建立后中断时,正文、计数、搜索、SSE、RAG 和 Agent tools 均拒绝;恢复后重新取权,不沿用旧权限。
|
||||
- **Verification:** 全路由 inventory 每项有 owner 和负例;PG 集成与安全套件证明 fail closed;若发现 active bypass,先更新 gap-matrix 再继续其他波次。
|
||||
|
||||
### PU4. Close real-PI evidence gaps without pre-authorizing fixes
|
||||
|
||||
- **Goal:** 补齐 multi-intent U8 与工作流 full/none 的真实 PI、浏览器、持久化和恢复证据。
|
||||
- **Requirements:** R5–R13;Covers AE2、AE3。
|
||||
- **Dependencies:** PU1–PU2;测试设计可与 PU3 inventory 并行,最终证据必须基于 PU3 完成后的同一候选 artifact,且共享环境验收串行。
|
||||
- **Files:** `.doc/ops/checklists/` 下新增验收清单、`.doc/test-reports/` 下新增报告、`internal/server/workflow_governance_piagent_pg_test.go`、`internal/app/intentflow/` 相关测试、`web/` 对应 browser 测试与 assets。
|
||||
- **Approach:**
|
||||
1. multi-intent U8 验证真实 PI generate、PG plan/step/receipt、确认前零副作用、重复提交、撤权、双标签、刷新/重登/app+worker restart。
|
||||
2. full 文档走真实生成、author submit、独立 reviewer、独立 approver 和阶段门禁。
|
||||
3. none 文档走真实生成、版本账本、审批动作不适用和阶段不阻塞;禁止写成“none 审批通过”。
|
||||
4. 失败先归类为环境、验收脚本或产品缺陷;产品缺陷创建独立 `fix/*` 任务,修复后的同一场景必须重验,不能以“已分类”关闭证据缺口。
|
||||
5. 所有场景通过共享 PI 数据安全门:最小字段 allowlist、服务端脱敏、tenant/project 绑定、最小权限测试凭证和受限日志/产物;只使用隔离合成数据,并执行泄漏负例。
|
||||
- **Test scenarios:**
|
||||
- multi-intent U8 在无确认、确认、重复确认、活动计划冲突、权限撤销和 receipt 丢失下符合单一终态与幂等要求。
|
||||
- UI、直接 API 和聊天指令最终产生相同领域状态、actor、版本和可见结果。
|
||||
- full 文档跨三个真实用户完成职责分离;每次运行使用隔离 project/workspace 和命名空间,错误职责用户的每个动作均拒绝。
|
||||
- none 文档没有 submit/review/approve,可刷新和重启恢复,且不阻塞 advance。
|
||||
- runner/model 不可用时验收明确失败或 SKIP,不得记为产品 PASS。
|
||||
- **Verification:** 真实 PI、PG、browser、restart、cross-user 证据分栏归档;通过后只关闭对应证据缺口,不自动启用更高 tier。
|
||||
|
||||
### PU5A. Eliminate the repository race flake
|
||||
|
||||
- **Goal:** 独立关闭全仓 race 的 TempDir 清理竞态,不让外部模型可用性阻塞正确性修复。
|
||||
- **Requirements:** R5–R9。
|
||||
- **Dependencies:** PU1。
|
||||
- **Files:** `.github/workflows/ci.yml`、`internal/server/task_run_handlers_test.go` 或对应 `TestCreateTaskRun_PreActivationAcceptedNot409` fixture、`.doc/test-reports/`。
|
||||
- **Approach:**
|
||||
1. 定位并修复异步 worker 未收口导致的 TempDir 清理竞态;不能用跳过或忽略让全仓 race 假绿。
|
||||
2. 保留可重复的最小回归,并执行全仓 race 多轮验证。
|
||||
- **Test scenarios:**
|
||||
- 全仓 race 多次运行不再出现 TempDir RemoveAll,并能证明 worker 已退出。
|
||||
- **Verification:** 全仓 race 不再依赖已知 flake 豁免;PR CI 仍不依赖外部模型。
|
||||
|
||||
### PU5B. Add nightly PI and enforce auditable promotion receipts
|
||||
|
||||
- **Goal:** 增加夜间真实 PI 回归和可执行的下一次晋升门,同时逐步实现一次构建、按 digest 晋升。
|
||||
- **Requirements:** R5–R9、R13;Covers AE5。
|
||||
- **Dependencies:** PU1、PU4 的稳定场景;不阻塞 PU5A。
|
||||
- **Files:** `.github/workflows/nightly-real-pi.yml`、`.github/workflows/ci.yml`、`scripts/promote-to-test.sh`、`scripts/release-to-main.sh`、`docker-compose*.yml`、`.doc/test-reports/`。
|
||||
- **Approach:**
|
||||
1. 夜间 job 使用最小权限且可轮换的 secrets、隔离合成 project/session、真实 PI 标识、受限产物留存、并发取消和有限重试。
|
||||
2. 为被测 commit 生成不可变 promotion receipt,记录结论、时间、runner/model/protocol、commit 和 image digest;所有晋升入口必须验证目标 commit 的最新有效 receipt。
|
||||
3. 将 runner/credential/network failure 与产品断言失败分开。产品失败拒绝晋升;基础设施连续失败冻结下一次晋升,但允许发布负责人在确认外部故障、最近成功结果仍有效、PR/PG 门禁全绿后做带理由和时限的审计豁免。
|
||||
4. CI 从候选 commit 一次构建 app/events/PI Runner 镜像并记录 digest;test/main 最终只引用该 digest。在此能力完成前只可声称 same-commit 加各环境 digest 可追溯,不得声称 same-image promotion。
|
||||
- **Test scenarios:**
|
||||
- 缺 secret 或 runner 不可达时 job 为 infrastructure failure,不生成 PASS 报告。
|
||||
- 产品断言失败时保留脱敏后的 typed result、schema 和测试证据,告警到明确 owner,晋升脚本拒绝目标 commit。
|
||||
- 两次调度重叠时旧 run 被取消,不污染同一 fixture。
|
||||
- receipt 过期、commit/digest 不匹配、产品失败或未经审计的 infra failure 均拒绝晋升;有效时限内的人工豁免可追到发布负责人和理由。
|
||||
- **Verification:** nightly 具有 schedule/manual 入口、失败分类、owner、retention 和 promotion-gate receipt;test/main 能证明引用候选构建的同一 digest。
|
||||
|
||||
### PU6. Decide semantic-summary go/no-go and prepare its task contract
|
||||
|
||||
- **Goal:** 决定 D3 语义摘要是否值得实施;若获批,只创建独立 short-term 和完整执行契约,不在本计划直接改业务代码。
|
||||
- **Requirements:** R5–R13。
|
||||
- **Dependencies:** PU3 的授权 inventory;PU1–PU2 的独立行;独立产品 go/no-go。
|
||||
- **Files:** 本计划只更新 `.doc/backlog/chat-agent-p6-backlog.md` 和新 short-term;下列代码与测试路径属于获批任务契约:`internal/ctxmgr/summarizer.go`、`internal/app/chatflow/`、`internal/server/chat_digest_api.go`、对应 Go/PG 测试、`web/src/` 摘要消费组件与测试。
|
||||
- **Approach:**
|
||||
1. 实施前冻结当前用户痛点/使用信号、预期收益、维护成本、owner、最小样本、质量阈值和零容忍安全失败;未通过 go/no-go 则保持 deferred,本计划不实施。
|
||||
2. 获批任务必须只向无工具权限的摘要器提供 authorized view 和最小化输入,保存来源引用、输入版本、模型/协议和 freshness,并应用 R13 的共享 PI 数据安全门。
|
||||
3. 先 shadow 评估质量和泄漏负例,再决定是否替换 deterministic summary。
|
||||
4. 模型失败、超时或输出不安全时保留旧摘要或确定性 fallback,并明确 freshness。
|
||||
- **Test scenarios:**
|
||||
- 被撤权或跨阶段消息不进入新摘要、计数和引用。
|
||||
- prompt injection 只能作为材料,不能改变摘要权限或系统动作。
|
||||
- 新消息增量更新不重复旧内容;并发生成只提交一个当前版本。
|
||||
- 模型失败后刷新、重登和重启仍返回可解释 fallback。
|
||||
- **Verification:** 本计划验证 go/no-go 记录、预注册门和 short-term 契约完整;获批任务必须在 shadow、权限负例、PG 持久化和真实 browser 恢复通过后才更新 rollout tier。
|
||||
|
||||
### PU7. Decide PI-narrative go/no-go and prepare its task contract
|
||||
|
||||
- **Goal:** 决定可选 PI 叙事是否值得实施;若获批,只创建独立 short-term 和完整执行契约,不在本计划直接改业务代码。
|
||||
- **Requirements:** R5–R13;Covers AE4。
|
||||
- **Dependencies:** PU3 的授权边界;现有 typed-result-v1;独立产品 go/no-go。
|
||||
- **Files:** 本计划只创建独立 short-term;下列代码与测试路径属于获批任务契约:`internal/docrevision/service.go`、`internal/docrevision/risk.go`、`internal/taskrun/finalize.go`、`deploy/pi-agent/` typed result/schema、`web/src/components/doc/ChangeReportPanel.tsx` 及对应测试。
|
||||
- **Approach:**
|
||||
1. 实施前冻结当前用户痛点/使用信号、预期收益、维护成本、owner、最小样本、质量阈值和零容忍安全失败;未通过 go/no-go 则保持 deferred,本计划不实施。
|
||||
2. 获批任务中的 PI 必须在无写工具环境中只读消费经过 R13 安全门的 immutable input snapshot、diff、lineage 和服务端计算的 impact/risk floor。
|
||||
3. 输出使用版本化 typed schema,并绑定文档版本与输入 digest。
|
||||
4. partial/malformed、timeout、cancel、unknown schema、提示注入或 digest mismatch 一律全量降级到显式 fallback,不混合呈现部分 PI 字段。
|
||||
5. fallback 继续支持查看、确认/拒绝、刷新和重启恢复。
|
||||
- **Test scenarios:**
|
||||
- 合法 PI narrative 与对应 snapshot/version/digest 一致并在 UI 标出分析状态。
|
||||
- PI 试图降低风险、修改 hunk 或更改审批结论时,服务端忽略或拒绝。
|
||||
- malformed/timeout/cancel/retry 不产生第二份 candidate 或第二个终态。
|
||||
- 非授权用户不能从叙事、引用或计数推断不可见文档。
|
||||
- **Verification:** 本计划验证 go/no-go 记录、预注册门和 short-term 契约完整;获批任务必须证明 deterministic fallback 全量回归通过,且真实 PI/browser/restart 报告明确区分 narrative 与事实字段。
|
||||
|
||||
### PU8. Prepare independent multi-intent follow-up tasks
|
||||
|
||||
- **Goal:** 在 multi-intent U8 真实证据签署后,只形成 U9 实验和 U10–U12 单 action 的独立候选任务;不在本计划实施扩面。
|
||||
- **Requirements:** R5–R13。
|
||||
- **Dependencies:** PU3–PU4;独立产品 go/no-go;U9 实验不作为 U10–U12 的默认前置。
|
||||
- **Files:** `internal/app/intentflow/`、各 owner module 的 adapter/port/tests、`internal/events/registry.go`、`web/src/components/chat/InteractiveCard.tsx` 及对应测试、`.doc/ops/short-term/` 独立任务。
|
||||
- **Approach:**
|
||||
1. 每个候选项先冻结用户信号、预期收益、维护成本、owner、最小样本、晋级阈值和零容忍安全错误;未获批则保持 deferred。
|
||||
2. U9 候选仅提供规则无法判断时的 segment proposal;固定 schema/digest、最小输入、R13 安全门、护栏优先、超时 fail closed。
|
||||
3. U10 mutate、U11 docgov、U12 workflow/run-control 各自形成独立 short-term、flag、owner mutex、授权负例、回滚点和是否依赖 U9 的明确声明。
|
||||
4. 任务契约要求高风险动作绑定 expected revision 和显式确认,确认后执行前重新授权;按钮和自然语言进入同一 owner command。
|
||||
5. 任一 action 出现授权旁路、持久状态丢失、双 writer、跨用户泄漏或 B1–B4 回归时,停止全部剩余扩面并更新 gap-matrix;普通质量失败只回滚该 action。
|
||||
- **Test scenarios:**
|
||||
- U9 malformed/timeout、span 越界、风险降级和红线拆分逃逸全部 fail closed;敏感内容不出站。
|
||||
- 每个 action 在未确认、越权、stale revision、重复提交和部分完成时保持零越界副作用与可恢复状态。
|
||||
- 双标签确认/取消只有一个成功;投影停机时权威 GET 仍正确。
|
||||
- 旧版本回滚后已有计划仍可读取、取消和 finalize,新建保持关闭。
|
||||
- **Verification:** 本计划只验证每个候选任务边界、go/no-go、预注册门、独立 flag/rollback 和全局安全 stop gate 完整;后续获批任务各自通过真实证据后才可加入更高 tier。
|
||||
|
||||
---
|
||||
|
||||
## Verification Contract
|
||||
|
||||
| Layer | Applies to | Required evidence | Done signal |
|
||||
|---|---|---|---|
|
||||
| Documentation | PU1–PU2 | Markdown/link check、`git diff --check`、三份 SSOT 人工对账、before/after 边界与义务迁移表 | 无矛盾、无断链、无无证据状态提升或缩口径假完成 |
|
||||
| Authorization inventory | PU3 | 注册路由全集与 resource/action/owner/authn/ReBAC/ABAC/duty/negative-test 映射 | 无未认领路由;每项有服务端门和负例 |
|
||||
| Static/unit | PU3、PU5A–PU8 | `go vet ./...`、相关 Go tests、`cd web && npm test && npm run build`、`arch-check --mode block` | 所有受影响包通过 |
|
||||
| PostgreSQL | PU3–PU8 | 隔离 `TEST_DATABASE_URL`、迁移、并发、幂等、fail-closed 负例 | 无 skip 冒充 PASS,数据可重启恢复 |
|
||||
| Race | PU3、PU5A、后续 multi-intent action | 相关包 race;PU5A 关闭全仓 TempDir flake | 无 data race、无异步清理残留 |
|
||||
| Real PI | PU4、获批后的 PU6–PU8 | 真实产品 PI Agent Runner、记录 model/protocol/typed result 和 R13 数据安全门 | 不使用 stub 或 Herdr 代替;无敏感数据泄漏 |
|
||||
| Browser | PU4、获批后的 PU6–PU8 | 真实登录、UI 操作、双用户/职责负例、刷新/重登/restart | 页面可见结果与 PG/账本一致 |
|
||||
| Deployment | 所有运行时波次 | 占集成槽 rebuild、`/ready`、promotion receipt;PU5B 完成后按不可变 digest 晋升 | 当前阶段可追到同一 commit 和各环境 digest;加固后 test/main 引用同一候选 digest |
|
||||
| Rollback | PU3–PU8 | disable/drain、旧版本兼容读取、cancel/finalize、无双 writer;上一版本二进制针对 expanded schema 的兼容演练 | 当前基线恢复且无孤儿状态;旧 app/worker 能识别并安全收口新状态 |
|
||||
|
||||
夜间真实 PI 的外部依赖失败和产品回归必须分栏。PR CI 不依赖外部模型;夜间 job 稳定前不提升为合并必需检查。
|
||||
|
||||
---
|
||||
|
||||
## Definition of Done
|
||||
|
||||
- [x] PU1–PU2 完成后,矩阵能明确区分当前完成范围、发布关系、剩余工作和关闭条件,并保留拆行前后的义务 lineage。
|
||||
- [x] schema 45、D3/D5、IAM 历史缺口、前端状态和事件/FAV 混行均已纠正。
|
||||
- [x] L1、Chat/ctxmgr baseline、Document revision baseline、前端工作台和可靠事件核心的状态调整有现有证据支持;语义摘要、PI 叙事、多意图扩面与 FAV 已拆成独立 deferred 行。
|
||||
- [x] PU3 形成全路由授权 inventory,并证明只有 dev/test 显式双门才允许内存 fixture,其他环境与既有 session 均 fail closed。
|
||||
(2026-09-16:`NewStores` 双门 fail-closed 已合入;全路由 inventory / session 中断负例仍开放,不挡本项核心旁路关闭)
|
||||
- [x] PU4 的 multi-intent U8 与 full/none 真实 PI/browser/restart/cross-user 证据独立归档;失败未被文档改写掩盖。
|
||||
(2026-09-16:Wave2 报告已签;Playwright 双标签仍 gated,API 刷新/重启已签;不升 tier)
|
||||
- [x] PU5A 的 TempDir race flake 被真正关闭;PU5B 的 nightly job、promotion receipt 和人工豁免链能区分 infrastructure/product failure。
|
||||
(2026-09-16:PU5A 已关闭;PU5B **nightly+receipt+晋升钩子**已交付——见 [Wave2B 报告](../test-reports/2026-09-16-wave2b-nightly-promotion-receipt-test-report.md)。**同镜像 digest 晋升**已由 [Wave2C](../test-reports/2026-09-16-wave2c-same-image-digest-test-report.md) 单机 pin 关闭;远程 registry 另立。)
|
||||
- [x] PU6–PU8 已分别完成产品 go/no-go;未获批项保持 deferred,获批项另建 short-term 后才进入实现与 rollout DoD。
|
||||
(2026-09-16:全部 **no-go / deferred**——见 [Wave3 go/no-go](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md) 与 `.doc/ops/long-term/2026-09-16-pu6-*` / `pu7-*` / `pu8-*` 契约;禁止实施与升 tier。)
|
||||
- [x] 任何真实 PI 工作均满足 R13 的最小出站、租户绑定、脱敏、凭证、留存和泄漏负例。
|
||||
(2026-09-16:nightly/receipt 路径使用隔离合成 DB、脱敏 evidence_refs、凭证不入库;完整 R13 矩阵审计见 Phase3 handoff 开放项,不挡本勾选的运行时门。)
|
||||
- [x] deterministic summary/change-report、legacy 单意图、B1–B4 和三环境隔离均无回归。
|
||||
(合入冒烟 `go vet` + `go test -short`;三环境 schema 47 快照保持;未升 MULTI_INTENT tier。)
|
||||
- [x] `gap-matrix.md` 只在真实 blocker 出现或关闭时变化,`production_ready` 不因普通 backlog 自动翻转。(Wave 0:仅增加 IAM 只读核验注记,未翻转)
|
||||
- [x] 放弃的实验代码、临时 flag、诊断 fixture 和测试数据已清理;历史失败证据保留且有正确指针。
|
||||
(promotion-receipt fixtures 为门禁故意保留;FAV 旁支不合入;见 Phase3 handoff。)
|
||||
|
||||
---
|
||||
|
||||
## Appendix
|
||||
|
||||
### Source paths
|
||||
|
||||
- `.doc/audit/2026-09-16-feature-matrix-production-readiness-audit.md`
|
||||
- `.doc/status/FEATURE-MATRIX.md`
|
||||
- `.doc/remediation/gap-matrix.md`
|
||||
- `.doc/ops/CURRENT.md`
|
||||
- `.doc/archive/ops/short-term/2026-09-16-production-ready-gates.md`
|
||||
- `.doc/system-design/2026-09-15-multi-intent-hitl-plan.md`
|
||||
- `.doc/test-reports/2026-09-16-multi-intent-u8-task-generate-test-report.md`
|
||||
- `.doc/test-reports/2026-09-16-chat-refresh-gate-test-report.md`
|
||||
- `.doc/test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md`
|
||||
- `.doc/test-reports/2026-09-14-document-revision-runtime-ui-test-report.md`
|
||||
- `.doc/test-reports/2026-09-15-phase2-closeout-test-report.md`
|
||||
- `.doc/test-reports/2026-09-12-phase1-iam-authz-test-report.md`
|
||||
- `.doc/backlog/chat-agent-p6-backlog.md`
|
||||
|
||||
### Current decision summary
|
||||
|
||||
- 当前没有新增 production-ready blocker。
|
||||
- 当前首发范围可关闭的状态漂移:Intent L1、前端工作台、可靠事件核心。
|
||||
- 当前应保持 `partial`:多意图基线、工作流治理、IAM、CI/E2E;artifact promotion 作为独立发布加固跟踪。
|
||||
- 当前可按冻结范围收口并把增强拆行:Chat/ctxmgr baseline、Document revision baseline。
|
||||
- 当前应独立 `deferred`:语义摘要、PI change-report narrative、FAV、多意图未获批扩面、D7 合规治理;纯软件项目自举不在本计划范围。
|
||||
@@ -3,6 +3,7 @@
|
||||
| 文档 | 说明 |
|
||||
|------|------|
|
||||
| [gap-matrix.md](./gap-matrix.md) | 发布缺口 SSOT |
|
||||
| [2026-09-16-feature-matrix-production-readiness-plan.md](./2026-09-16-feature-matrix-production-readiness-plan.md) | 能力状态与发布门禁解耦、证据校准、剩余 partial 收口和 production-ready 防回退计划([审计](../audit/2026-09-16-feature-matrix-production-readiness-audit.md)) |
|
||||
| [2026-09-14-module-decoupling-refactor-plan.md](./2026-09-14-module-decoupling-refactor-plan.md) | 纵向绞杀、UnitOfWork、高并发互斥、可靠事件、逐动作授权、FAV、迁移与恢复的详细重构计划 |
|
||||
| [2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md](./2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md) | Phase 2 修订版:Track E 持久事件交付先行;Track S 结构解耦独立 go/no-go;HTTP 与 PI 协议另立 remediation([审阅](../audit/2026-09-15-module-decoupling-phase2-plan-review.md);[调研](../ops/research/2026-09-15-module-decoupling-ipc-assessment.md)) |
|
||||
| [2026-09-15-http-error-envelope-remediation.md](./2026-09-15-http-error-envelope-remediation.md) | HTTP/SSE typed error envelope、公开 details allowlist、前端 additive 迁移与安全负例 |
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
**production_ready**: yes(发布门禁 B1–B4 已签;dev/test/main schema=47。U9–U12 / 软件自举 / FAV / 完整 PI change-report 叙事不挡首发)
|
||||
**协作焦点**: [../ops/CURRENT.md](../ops/CURRENT.md)
|
||||
**Agent 手册**: [AGENTS.md](../../AGENTS.md) · [PROJECT.md](../../PROJECT.md)
|
||||
**能力矩阵**: [../status/FEATURE-MATRIX.md](../status/FEATURE-MATRIX.md)(Wave 0 校准;与本文件正交)
|
||||
|
||||
> Codex 2026-09-12 再审计项与本轮回环证据见下表「Codex 再审计」区段。
|
||||
> Wave 0(2026-09-16)对 dev/test/main 做 IAM 只读核验:schema 47、`user_credentials` 与 IAM 表齐全、`ALLOW_IN_MEMORY=false`,**未发现** MemoryStore 旁路;**不**新增 blocker。代码 fail-closed 归 Wave 1(见 [continuity plan](./2026-09-16-feature-matrix-production-readiness-plan.md))。
|
||||
|
||||
---
|
||||
|
||||
@@ -24,7 +26,7 @@
|
||||
| BUG-08 | 测试库隔离 | PASS | `db/testdb.go` Require/Skip;CI `TEST_DATABASE_URL` + governance PG 步骤;[report](../test-reports/2026-09-16-ci-governance-pg-bug08-test-report.md) | 已完成 |
|
||||
| BUG-09 | 版本冲突自动重试 | PASS | `StageAdvanceBanner` reload | 已完成 |
|
||||
| BUG-10 | 无审计视图 | PASS | settings + UI | 已完成 |
|
||||
| BUG-11 | 旧 API 未下线 | PARTIAL | 治理开启时 410 | 保持 + 文档标注 |
|
||||
| BUG-11 | 旧 API 未下线 | PASS | 治理开启时 410;[策略冻结](../audit/2026-09-16-bug11-410-retire-decision.md) | 保留兼容层,不强制删路由 |
|
||||
| BUG-12 | 前端名称硬编码 | PASS | catalog API | 已完成 |
|
||||
| MISSING-01 | 上下文快照 | PASS | `ctxmgr.CollectProjectDialogue` | 已完成 |
|
||||
| MISSING-02 | 终止 | PASS | `GetTerminationPreview` | 已完成 |
|
||||
@@ -60,7 +62,7 @@
|
||||
|
||||
| ID | 描述 | 状态 | 证据 | 计划动作 |
|
||||
|---|---|---|---|---|
|
||||
| WORKFLOW-PLAN-FROZEN-OPTIONAL-DUTIES | active 项目仍展示可编辑职责表单,409 提示在长表单视口外;现有规划又不支持非必需文档“三权全空”,且后端缺少职责人在任成员复核 | **PASS(设置页)** | [audit](../audit/2026-09-14-workflow-plan-409-frozen-and-optional-duties.md);[test-report](../test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md)。项目 143 只读 frozen、A full+none 激活、B partial 不发 PUT、C 零治理拒绝、双标签转 frozen、成员无配置入口、刷新后 143 仍 frozen | 真实 PI 生成 full/none 并走审批/阶段不阻塞未纳入本轮页面矩阵,不作为本 gap 关闭的替代证据,另立项 |
|
||||
| WORKFLOW-PLAN-FROZEN-OPTIONAL-DUTIES | active 项目仍展示可编辑职责表单,409 提示在长表单视口外;现有规划又不支持非必需文档“三权全空”,且后端缺少职责人在任成员复核 | **PASS(设置页)** | [audit](../audit/2026-09-14-workflow-plan-409-frozen-and-optional-duties.md);[test-report](../test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md)。项目 143 只读 frozen、A full+none 激活、B partial 不发 PUT、C 零治理拒绝、双标签转 frozen、成员无配置入口、刷新后 143 仍 frozen | 设置页矩阵 PASS;真实 PI full/none 长链已另签 [Wave2 报告](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md) |
|
||||
| DOC-CONTENT-CANONICAL-HASH-DRIFT | 旧受控文档 bootstrap 裁剪 Markdown 双空格硬换行并将 canonical SHA 写入账本/DocGov,但未同步文件;正文读取把完整性冲突误报 404,lease/list sync 又放大并制造刷新后加载死锁 | **PASS(真实 UI)** | [audit](../audit/2026-09-14-project143-controlled-content-404.md);[UI report](../test-reports/2026-09-14-controlled-content-ui-acceptance.md)。代码已合 dev、schema 32、项目 143 定向 `migration_repair`;项目 143 `clean-run3` 与新项目 `full-chain-final` 主链及 restart 全部纯页面 PASS,目标 404=0 | [remediation](./2026-09-14-controlled-content-canonical-hash-remediation.md)。隔离 `TestReconcile_LegacyRepair_PG` 未执行,按用户“本轮只允许页面测试”的边界保留为工程测试债,不作为本轮 UI PASS 的替代证据 |
|
||||
| CHAT-HISTORY-REFRESH | 工作流激活后刷新,对话正文被阶段过滤器清空,但分类数量与锚点仍按全量返回 | **PASS** | [test-report](../test-reports/2026-09-13-chat-history-refresh-test-report.md);活验 [live.json](../test-reports/assets/2026-09-15-chat-history-refresh-live/live.json)(项目 6252,window=categories=2,guest 403);代码:`message_scope.go`、`chat_history_auth.go`、goose 00026/00027 | 闲聊刷新已补。发布门禁「激活后文档任务 + 重登/重启」仍开放,不回退本 gap |
|
||||
| CHAT-INTENT-STATE | 真实会话被诊断探针污染;只读查询误启动文档写任务;错误动作与编辑状态刷新后丢失 | **PASS** | [audit](../audit/2026-09-13-conversation-intent-runtime-state.md);[test-report](../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md);双标签活验项目 **6275** / `sess-p6275-u10`(`live.json` + Docker 截图)。**不**删除 `sess-p143-u9` 历史探针 | [remediation](./2026-09-13-conversation-intent-runtime-state-remediation.md)。Wave 3–4 浏览器门已签;诊断污染消息仍不擅自删除 |
|
||||
|
||||
@@ -1,39 +1,90 @@
|
||||
# 模块与功能完成度(SSOT)
|
||||
|
||||
**更新**: 2026-09-16
|
||||
**production_ready**: yes
|
||||
**更新**: 2026-09-16(Wave 0 校准)
|
||||
**production_ready**: yes(权威来源:[gap-matrix](../remediation/gap-matrix.md);本表不推导发布门禁)
|
||||
**发布缺口**: [../remediation/gap-matrix.md](../remediation/gap-matrix.md)
|
||||
**协作焦点**: [../ops/CURRENT.md](../ops/CURRENT.md)
|
||||
**连续性审计**: [../audit/2026-09-16-feature-matrix-production-readiness-audit.md](../audit/2026-09-16-feature-matrix-production-readiness-audit.md)
|
||||
**整改计划**: [../remediation/2026-09-16-feature-matrix-production-readiness-plan.md](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md)
|
||||
|
||||
> 本表描述**能力地图**;上线 blocker 见 gap-matrix,二者互相链接、不合并。
|
||||
> 本表描述**能力成熟度**;上线 blocker 见 gap-matrix。二者正交:能力行不必全部 `done` 才能发布;`partial`/`deferred` 不得自动回退 `production_ready`。
|
||||
|
||||
**状态枚举**: `done` | `partial` | `planned` | `deferred` | `blocked`
|
||||
---
|
||||
|
||||
## 状态契约
|
||||
|
||||
| 字段 | 含义 |
|
||||
|------|------|
|
||||
| **声明范围** | 本行冻结的能力边界;`done` 只对该边界负责 |
|
||||
| **状态** | `done` \| `partial` \| `planned` \| `deferred` \| `blocked` |
|
||||
| **发布关系** | 与当前首发/已签门禁的关系:`non_blocker` / `补证` / `加固` / `deferred_enhancement` |
|
||||
| **关闭条件** | 何时可将本行升为 `done`(或关闭 `partial`);stub/SKIP/fallback 不得冒充 |
|
||||
| **证据** | 可追溯到报告/commit/环境/schema;代码或 artifact 变化后须重验 |
|
||||
| **mutex** | 并行认领互斥键(见 CURRENT) |
|
||||
|
||||
### 状态判定
|
||||
|
||||
- **`done`**:声明范围内能力已达生产验收证据;**不**表示该领域永无后续。新增增强须拆行或进 backlog。
|
||||
- **`partial`**:已交付可用子集,关闭条件仍未满足。
|
||||
- **`planned`**:方案存在,尚未开始实施。
|
||||
- **`deferred`**:明确不进当前路线,且不是发布 blocker(除非盘点确认违规 → 升 gap-matrix)。
|
||||
- **`blocked`**:本行目标无法继续,须写明 blocker 与恢复条件。
|
||||
- **`production_ready`**:只由 gap-matrix 发布门禁决定。
|
||||
|
||||
### 重验触发器
|
||||
|
||||
授权谓词/owner port、schema/迁移/compose/镜像/环境晋升、flag 升级、PI Runner/model/protocol、event consumer/writer、浏览器持久化边界变化时,受影响行须重验;历史 PASS 不能单独证明新 artifact。
|
||||
|
||||
### 禁止
|
||||
|
||||
- 靠缩小声明范围制造 `done`(须保留 before/after 与义务迁移)。
|
||||
- 用 stub、SKIP、deterministic fallback 冒充真实 PI / 完整叙事闭环。
|
||||
- 无真实 blocker 变化时改写 gap-matrix / `production_ready`。
|
||||
|
||||
---
|
||||
|
||||
## 完成度矩阵
|
||||
|
||||
| 模块 | 能力 | 状态 | 证据 | 缺口/后续 | mutex |
|
||||
|------|------|------|------|-----------|-------|
|
||||
| 意图识别 L1 | 18 类 Intent + 三分支消解 | partial | [system-design/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);[多意图复核方案](../system-design/2026-09-15-multi-intent-hitl-plan.md);[U1 契约](../test-reports/2026-09-15-multi-intent-u1-contracts-test-report.md);[U2 分段](../test-reports/2026-09-15-multi-intent-u2-segmenter-test-report.md);[U3 PG](../test-reports/2026-09-15-multi-intent-u3-intentflow-pg-test-report.md) | 明确写动作与只读总结已分流;双标签 `DOC_BUSY` 已签(项目 6275)。多意图核心 U1–U8 已完成;U9–U12 不阻塞首版。intent 纯依赖边界不得回退 | `intent` |
|
||||
| 多意图持久计划 | app/intentflow 生命周期与 HITL 契约 | partial | [设计](../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) | U1–U8 核心首版已完成。U9–U12 不阻塞。默认 tier=legacy。真实 PI generate 待 runner URL。共享环境 schema 45 待晋升 | `intent-plan` |
|
||||
| 对话 / ctxmgr | 多轮上下文、记忆、摘要 | partial | [system-design/multi-turn-dialogue](../system-design/multi-turn-dialogue/);[刷新恢复专项审计](../audit/2026-09-13-chat-history-refresh-disappears.md);[U10 端口化](../archive/ops/2026-09-15-chatlog-contextasm-u10.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) | `CHAT-HISTORY-REFRESH` 与发布门禁「激活后文档任务 + 重登/重启」已签(项目 6359)。U10 原地端口 **停止扩面**。语义摘要(D5 backlog) | `chat` |
|
||||
| 智能体小队 | 角色-任务-工作区-黑板 | done | [system-design/agent-squad](../system-design/agent-squad/);[test 2026-09-07](../test-reports/2026-09-07-dynamic-squad-planning-test-report.md) | 非关键步骤降级(A5/A6 backlog) | `squad` |
|
||||
| 工作流治理 | 三正式工作流 + 阶段门禁 | partial | [remediation/three-workflows](../remediation/2026-09-12-three-workflows-strict-governance-remediation.md);[test 2026-09-12](../test-reports/2026-09-12-three-workflows-governance-remediation-test-report.md);[冻结态/职责可选整改](../remediation/2026-09-14-workflow-plan-409-frozen-and-optional-duties-remediation.md);[Wave 5 页面矩阵](../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) | 设置页/DutyMode + 动作级鉴权已落地;真实 PI 三工作流 E2E 已签。后续:none 文档真实 PI 审批长链路;模块可仍 partial | `workflow` |
|
||||
| 纯软件项目自举 | 软件项目创建、Bootstrap 基线、Delivery 迭代与受控工程交接 | planned | [详细设计](../system-design/2026-09-14-software-project-bootstrap-workflow.md);[现状调研](../ops/research/2026-09-14-software-project-bootstrap-current-state.md);[验收计划](../ops/checklists/2026-09-14-software-project-bootstrap-acceptance.md) | 当前仅完成方案;目录/模板/执行器/创建向导/真实 PI UI 均未实施。受控代码执行单列后续 Epic | `workflow-design` |
|
||||
| IAM / 鉴权 | 项目级 API 鉴权 + RBAC | partial | [audit/authorization](../audit/authorization-matrix-v2.md);[刷新恢复专项审计](../audit/2026-09-13-chat-history-refresh-disappears.md) | 历史读取端点补统一会话 owner + 阶段授权;旧 API 410 标注(BUG-11 partial) | `authz` |
|
||||
| 文档治理 | 法定文档生命周期 + 租约 + 受控正文读取 | done | [test docgov](../test-reports/2026-09-08-docgov-lifecycle-and-claiming-framework-test-report.md);[项目 143 正文 404 审计](../audit/2026-09-14-project143-controlled-content-404.md);[受控正文真实 UI 验收报告](../test-reports/2026-09-14-controlled-content-ui-acceptance.md);[UI-06 缓存竞争审计](../audit/2026-09-14-document-revision-refresh-cache-race.md);[整改](../remediation/2026-09-14-controlled-content-canonical-hash-remediation.md) | 生命周期/租约保留。W1–W6 + 审查修补 + UI hydrate 资格 + 晚到 list sync 修复均已合入 dev。项目 143 纯 UI 回归(clean-run3)与新项目全链路(main + post-restart)已全量真实页面验证通过(PASS) | `docgov` |
|
||||
| 文档版本与修改认知 | 智能体版本边界、人工修订标记、任意版本比较、变更报告与负责人通知 | partial | [管理测试](../test-reports/2026-09-13-document-revision-management-test-report.md);[运行时 UI Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[运行时审计](../audit/2026-09-13-document-revision-runtime-404.md);[ADR](../adr/2026-09-13-document-version-boundary.md) | **运行时 UI PASS**(6159 / V3/r2)。仍 `partial`:change report=`fallback`(真实 diff+lineage,非完整 PI 叙事)。系统级 `CHAT-INTENT` 见 gap-matrix | `docgov` |
|
||||
| 前端工作台 | 三栏 + 块文档 + SSE | partial | [test workbench](../test-reports/2026-09-08-three-column-workbench-and-block-document-test-report.md);[现场专项审计](../audit/2026-09-13-conversation-intent-runtime-state.md);[双标签截图](../test-reports/assets/2026-09-15-conversation-intent-dual-tab/screenshots/tab-b-busy.png);[demo seed 污染整改](../test-reports/2026-09-16-demo-seed-pollution-test-report.md);[门禁 B4](../test-reports/2026-09-16-frontend-gate-b4-test-report.md) | 错误卡片/任务进度/文档 busy 刷新恢复已有项目 6275 证据。Demo seeds 默认关闭。版本冲突信封解包 + 终止 preview 抽检已签(项目 6363) | `web` |
|
||||
| PI Runner / 配置链 | pi-agent + MiniMax 真实链路 + typed-result-v1 | done | [test 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-v1](../test-reports/2026-09-15-pi-typed-result-v1-test-report.md) | — | `pi-agent` |
|
||||
| 三环境运维 | dev/test/main + 共享 KB | done | [PROJECT.md](../../PROJECT.md) §4;四环境 healthy | — | `infra` |
|
||||
| CI / E2E | PG 集成 + 真实 PI E2E | partial | [gap-matrix BUG-08](../remediation/gap-matrix.md);[test pg-ci](../test-reports/2026-09-12-pg-ci-soak-e2e-test-report.md);[治理 PG 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);[运行时 UI Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) | BUG-08 PASS;真实 PI 三工作流 E2E 与前端/对话门禁已签。`-race` TempDir flake 为基建残留;夜间 CI `RUN_PI_E2E=1` 建议 | `ci` |
|
||||
| 模块解耦与可靠事件 | 文档可靠性纵向试点、PG 持久事件交付与选择性模块化 | partial | [架构](../system-design/2026-09-14-module-decoupling-architecture.md);[ADR](../adr/2026-09-14-modular-monolith-decoupling.md);[Phase 1](../remediation/2026-09-14-module-decoupling-refactor-plan.md);[Phase 2 审阅](../audit/2026-09-15-module-decoupling-phase2-plan-review.md);[Phase 2 修订计划](../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md);[E0A](../test-reports/2026-09-15-event-e0a-production-scope-contract-test-report.md);[E0B](../test-reports/2026-09-15-event-e0b-dispatcher-pg-test-report.md);[E1A](../test-reports/2026-09-15-event-e1a-notify-cutover-test-report.md);[E1B](../test-reports/2026-09-15-event-e1b-workflow-advance-test-report.md);[E1C](../test-reports/2026-09-15-event-e1c-projection-test-report.md);[E2](../test-reports/2026-09-15-event-e2-hook-guard-test-report.md);[复盘](../ops/research/2026-09-15-track-e-retrospective.md);[D6](../test-reports/2026-09-15-doccontent-canonical-boundary-test-report.md);[D7a](../test-reports/2026-09-15-intent-bizdev-boundary-test-report.md);[D5](../test-reports/2026-09-15-stageflow-type-ownership-test-report.md);[D4](../test-reports/2026-09-15-bizdev-locator-removal-test-report.md);[D7b](../test-reports/2026-09-15-chatflow-orchestration-boundary-test-report.md);[H0](../ops/research/2026-09-15-http-error-envelope-h0-inventory.md);[P0](../ops/research/2026-09-15-pi-typed-result-p0-matrix.md);[收口](../test-reports/2026-09-15-phase2-closeout-test-report.md);[notify live](../test-reports/2026-09-15-event-notify-shared-live-test-report.md);[advance live](../test-reports/2026-09-15-event-workflow-advance-shared-live-test-report.md);[projection live](../test-reports/2026-09-15-event-projection-shared-live-test-report.md);[HTTP 信封](../test-reports/2026-09-15-http-error-envelope-h1-h3-test-report.md);[PI typed-result](../test-reports/2026-09-15-pi-typed-result-v1-test-report.md) | E0A–E2 与共享 live 已过;生产无 hook 注册。D4–D7b 已合入。FAV off。Track P H1–H3 / P1–P4 已实施 | `architecture-docs` |
|
||||
| 模块 | 声明范围 | 状态 | 发布关系 | 证据 | 剩余工作 / 关闭条件 | 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 双标签**:覆盖 no-go 后实施中(见总控);升 `confirm/full` 另开 | `intent-plan` |
|
||||
| 多意图扩面(U9–U12) | U9 LLM 分段实验;U10 mutate;U11 docgov;U12 workflow/run-control | planned | 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);[总控](../ops/short-term/2026-09-16-full-backlog-override.md) | **2026-09-16 覆盖授权 GO**:分项独立 flag;默认 legacy tier | `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 | planned | 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) | **覆盖授权 GO**:`SEMANTIC_SUMMARY_SHADOW` 默认 off | `chat` |
|
||||
| 对话数据治理(D7) | 留存/删除口径、库·备份·日志控制、敏感字段加密边界 | deferred | deferred_enhancement(违规则升 blocker) | [计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) Scope Boundaries | 先数据分类与现状盘点;确认当前基线违规 → 立即写 gap-matrix | `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` |
|
||||
| 纯软件项目自举 | 软件项目创建、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);[总控](../ops/short-term/2026-09-16-full-backlog-override.md) | SWBOOT-00…09 L1 已落 `feature/software-project-bootstrap`(未合 dev);SWBOOT-10 stub only;真实 PI/UI NOT RUN | `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 | planned | 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) | **覆盖授权 GO**:`PI_CHANGE_REPORT_NARRATIVE` 默认 off | `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` |
|
||||
| 三环境运维 | dev/test/main + 共享 KB;对话/业务库隔离 | done | non_blocker | [PROJECT.md](../../PROJECT.md) §4;CURRENT 环境快照 schema **47** | — | `infra` |
|
||||
| CI / E2E | PR CI、PG 集成、治理 PG、已签真实 PI 门禁;**nightly** schedule/`workflow_dispatch` + infra/product 分类 receipt | partial | 加固(阻止**下一次**晋升,不自动否定已发布) | [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);[B3](../test-reports/2026-09-16-chat-refresh-gate-test-report.md);[B4](../test-reports/2026-09-16-frontend-gate-b4-test-report.md);[Wave2B nightly/receipt](../test-reports/2026-09-16-wave2b-nightly-promotion-receipt-test-report.md) | 关闭条件:nightly 入口 + 失败分类 + promotion-receipt 门禁已交付;TempDir race **已修**;PR CI 不依赖外部模型。Actions secret/runner 需环境配置 | `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` |
|
||||
| Final Artifact Vault(FAV) | 不可变终态制品库;`FAV_DEGRADED_READ=false` | planned | deferred_enhancement | [Track E 复盘](../ops/research/2026-09-15-track-e-retrospective.md);[short-term](../ops/short-term/2026-09-16-fav-u7-incremental.md) | **覆盖授权增量实施**;仍**禁止**整支 merge;degraded read 默认 false | `events` |
|
||||
|
||||
---
|
||||
|
||||
## Wave 0 边界 lineage(收口摘要)
|
||||
|
||||
| 行 | before 状态/口径 | after | 原义务去向 | 现有证据是否覆盖冻结边界 |
|
||||
|----|------------------|-------|------------|--------------------------|
|
||||
| Intent L1 | partial(混入 U9–U12) | done | U9–U12 → 多意图扩面 | 是(双标签 + 分流 + U1–U3) |
|
||||
| Chat/ctxmgr | partial(混入语义摘要 D5 误标) | done | D3 摘要行;D7 治理行 | 是(B3 项目 6359) |
|
||||
| Document revision | partial(混入完整 PI 叙事) | done | PI change-report 叙事行 | 是(Round20;fallback 为声明行为) |
|
||||
| Frontend workbench | partial(缺口栏已空) | done | 其他 409 信封复用 → backlog | 是(B4 项目 6363) |
|
||||
| 可靠事件 | partial(与 FAV 混行) | done | FAV 独立 deferred | 是(E0–E2 + shared live) |
|
||||
|
||||
---
|
||||
|
||||
## 更新规则
|
||||
|
||||
1. 模块状态变化时同步更新本表与 [gap-matrix](../remediation/gap-matrix.md)(若涉及 blocker)
|
||||
2. 同一 `mutex` 同时仅一个 Agent `in_progress`(见 CURRENT 并行认领表)
|
||||
3. 新能力行:复制模板 [../ops/templates/feature-matrix-row.md](../ops/templates/feature-matrix-row.md)
|
||||
1. 模块状态变化时同步本表;**仅当**发布 blocker 出现或关闭时改 [gap-matrix](../remediation/gap-matrix.md)
|
||||
2. 同一 `mutex` 同时仅一个 Agent `in_progress`(见 CURRENT)
|
||||
3. 新能力行:复制 [../ops/templates/feature-matrix-row.md](../ops/templates/feature-matrix-row.md)
|
||||
4. 拆行/收口须保留 before/after 与义务迁移(见上表);禁止缩口径假完成
|
||||
|
||||
@@ -2,4 +2,12 @@
|
||||
|
||||
**SSOT**:[FEATURE-MATRIX.md](./FEATURE-MATRIX.md)
|
||||
|
||||
与 [remediation/gap-matrix.md](../remediation/gap-matrix.md)(发布 blocker)分离:本目录描述**能力地图**,gap-matrix 描述**上线缺口**。
|
||||
与 [remediation/gap-matrix.md](../remediation/gap-matrix.md)(发布 blocker)分离:
|
||||
|
||||
| 文档 | 职责 |
|
||||
|------|------|
|
||||
| 本目录 FEATURE-MATRIX | **能力成熟度**:声明范围、状态、发布关系、关闭条件、证据 |
|
||||
| gap-matrix | **上线缺口**:唯一决定 `production_ready` |
|
||||
| [ops/CURRENT.md](../ops/CURRENT.md) | 协作焦点、认领、集成槽位、环境快照 |
|
||||
|
||||
能力行不必全部 `done` 才能发布;`partial`/`deferred` 不得自动回退 `production_ready`。新行模板:[../ops/templates/feature-matrix-row.md](../ops/templates/feature-matrix-row.md)。连续性审计与整改:[audit 2026-09-16](../audit/2026-09-16-feature-matrix-production-readiness-audit.md) · [remediation plan](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md)。
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# 多意图多任务识别、持久计划与 HITL 统一确认方案
|
||||
|
||||
> 状态: planned(方案已复核,未实施)
|
||||
> 日期: 2026-09-15
|
||||
> 作者: Cline(初稿)/ Codex(架构、安全与实施计划复核)
|
||||
> 关联: [方案审计](../audit/2026-09-15-multi-intent-hitl-plan-review.md);[意图识别深读](./intent-recognition/01-意图识别框架-设计-架构-实现-难点-解决方案-亮点与优势.md);[模块化单体架构](./2026-09-14-module-decoupling-architecture.md);[任务总览](../ops/short-term/2026-09-15-multi-intent-hitl.md)
|
||||
> 状态: **partially implemented**(U1–U8 代码与默认 `legacy` 已合入;U8 真实 PI generate 仍为证据缺口;U9–U12 deferred)
|
||||
> 日期: 2026-09-15
|
||||
> **SSOT 状态**:能力行见 [FEATURE-MATRIX](../status/FEATURE-MATRIX.md)(Wave 0 校准);发布门禁见 [gap-matrix](../remediation/gap-matrix.md)。本文保留为设计权威,头部「planned/未实施」已过时。
|
||||
> 作者: Cline(初稿)/ Codex(架构、安全与实施计划复核)
|
||||
> 关联: [方案审计](../audit/2026-09-15-multi-intent-hitl-plan-review.md);[意图识别深读](./intent-recognition/01-意图识别框架-设计-架构-实现-难点-解决方案-亮点与优势.md);[模块化单体架构](./2026-09-14-module-decoupling-architecture.md);[任务总览](../ops/short-term/2026-09-15-multi-intent-hitl.md);[连续性计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md)
|
||||
|
||||
---
|
||||
|
||||
@@ -27,7 +28,7 @@
|
||||
|
||||
| 能力 | 当前事实 | 证据 |
|
||||
|------|----------|------|
|
||||
| 单意图识别 | 18+ Intent、四级漏斗、三分支已实现;FEATURE-MATRIX 仍为 `partial`,不能称“已成熟” | `internal/intent/recognizer.go`、`.doc/status/FEATURE-MATRIX.md` |
|
||||
| 单意图识别 | 18+ Intent、四级漏斗、三分支已实现;FEATURE-MATRIX L1 行 Wave 0 已收口为 `done`(U9–U12 拆出) | `internal/intent/recognizer.go`、`.doc/status/FEATURE-MATRIX.md` |
|
||||
| V2 帧/动作表 | `IntentFrameV2`、ActionRegistry、风险、必填槽位、灰度开关已存在 | `internal/intent/types_v2.go`、`registry.go`、`flags.go` |
|
||||
| 有限多意图 | 默认开启;只按首个连接词拆两段;写意图返回 `nil` | `internal/intent/plan_builder.go` |
|
||||
| 有限执行 | 只读步骤顺序执行;需确认步骤只有文字提示 | `internal/coordinator/action_planner.go` |
|
||||
|
||||
@@ -193,6 +193,7 @@ imports:
|
||||
- squad
|
||||
- stream
|
||||
- stream/transport
|
||||
- swboot
|
||||
- taskrun
|
||||
- upload
|
||||
- workflowdef
|
||||
@@ -209,6 +210,7 @@ imports:
|
||||
stream: []
|
||||
stream/transport:
|
||||
- stream
|
||||
swboot: []
|
||||
taskrun:
|
||||
- app/uow
|
||||
- artifactvault
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# IAM 全路由 inventory 与 fail-closed 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
PU3 遗留:authorization-matrix-v2 仅抽样;需全路由 inventory、session 中断负例、410 策略冻结、R13 清单,以关闭 FEATURE-MATRIX IAM `partial`。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- 枚举全部 `mux.HandleFunc` 路由
|
||||
- session 中断 fail-closed 单测
|
||||
- BUG-11 410 策略文档冻结
|
||||
- R13 checklist 落盘
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- Go unit:`go test ./internal/auth/ -count=1`
|
||||
- 静态:从 `internal/server` 生成矩阵
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
- inventory ≥100 路由
|
||||
- `TestAuthStore_SessionInterruptFailClosed` PASS
|
||||
- 文档齐备
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### Inventory
|
||||
|
||||
- Input: grep HandleFunc
|
||||
- Actual Output: `.doc/audit/authorization-matrix-v3-full.md` **133** routes
|
||||
- Verdict: PASS
|
||||
|
||||
### Session interrupt
|
||||
|
||||
- Input: `go test ./internal/auth/ -run SessionInterrupt -count=1`
|
||||
- Actual: 见下方套件
|
||||
- Verdict: PASS
|
||||
|
||||
### 410 / R13
|
||||
|
||||
- Actual: `2026-09-16-bug11-410-retire-decision.md` + `2026-09-16-r13-data-safety-checklist.md`
|
||||
- Verdict: PASS
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
见 commit 前本地 `go test ./internal/auth/ -count=1` 输出。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
IAM 行可升 `done`。后续可按路由表补逐条 handler 负例指针细化,不挡关闭。
|
||||
@@ -0,0 +1,550 @@
|
||||
# FEATURE-MATRIX 深度测试与 test 环境晋升 — 详细测试报告
|
||||
|
||||
**报告日期**: 2026-09-16
|
||||
**执行分支**: `feature/matrix-deep-test-promote-test` → 合入 `dev` → 晋升 `test`
|
||||
**候选 Tag**: `rc-v1.0.0-beta.2`
|
||||
**证据目录**: [`.doc/test-reports/assets/2026-09-16-matrix-deep-test/`](./assets/2026-09-16-matrix-deep-test/)
|
||||
**SSOT**: [FEATURE-MATRIX](../status/FEATURE-MATRIX.md) · [CURRENT](../ops/CURRENT.md) · [gap-matrix](../remediation/gap-matrix.md)
|
||||
|
||||
---
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
在 `production_ready=yes` 且三环境 schema 已对齐 47 的前提下,需要证明:
|
||||
|
||||
1. FEATURE-MATRIX 中**已实现**模块在当前代码上仍可运行(非仅历史报告);
|
||||
2. 本地 `dev` 可安全晋升并部署到 `test`(`:8081`),供后续人工/长期实测。
|
||||
|
||||
此前发布门禁 B1–B4 已签,但矩阵行多为「历史证据链接」。本轮以分层深度回归补**当日可复现**证据,并完成 `rc-v1.0.0-beta.2` 晋升。
|
||||
|
||||
**刻意不做**:完整 28min 三工作流 PI 重跑;Round20 全量 Playwright;纯软件项目自举(`planned`);合入 `main`;改写项目 143。
|
||||
|
||||
---
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
| # | 目标 | 成功标准 |
|
||||
|---|------|----------|
|
||||
| T1 | 门禁基线全绿 | `go vet` / `go test -short` / arch-check / npm / prod-bundle exit 0 |
|
||||
| T2 | 矩阵模块定向包全绿 | intent/chat/squad/workflow/authz/doc*/agent/events 定向 `ok` |
|
||||
| T3 | 治理 PG 集成可复现 | 隔离库上 `TestWorkflowGovernance_PG_*` + `TestE2E_WorkflowGovernance_*` PASS |
|
||||
| T4 | live 关键路径可用 | health、真实闲聊、会话授权、版本冲突、终止 preview、demo 无污染 |
|
||||
| T5 | 真实 PI runner 可用 | typed-result dual-track 四子测 PASS |
|
||||
| T6 | test 可更新部署 | `test` 合入 `dev`、tag、rebuild、smoke + 轻量 live PASS,schema=47 |
|
||||
|
||||
---
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
### 3.1 分层方案
|
||||
|
||||
```text
|
||||
Wave 1 自动化(短测 + 定向 + 隔离治理 PG)
|
||||
Wave 2 live API(dev :8080,真实 pi-agent)
|
||||
Wave 3 真实 PI 抽样(runner :18865;FAIL 才升格三链)
|
||||
Wave 4 晋升 test + rebuild + smoke + live :8081
|
||||
Wave 5 报告归档 + SSOT 注记修正
|
||||
```
|
||||
|
||||
### 3.2 环境指纹
|
||||
|
||||
| 环境 | 端口 | schema | agent_backend | 备注 |
|
||||
|------|------|--------|---------------|------|
|
||||
| shared KB | 5432 | — | — | 共享知识库 |
|
||||
| **dev** | **8080** / events 8088 / pi **18865** | **47** | **pi-agent** | Wave 2/3 |
|
||||
| **test** | **8081** / events 8089 / pi **18866** | **47** | **pi-agent** | Wave 4 |
|
||||
| main | 8000 | 47 | pi-agent | 本轮只读对照,不晋升 |
|
||||
|
||||
健康探针样例(dev):
|
||||
|
||||
```json
|
||||
{"status":"ok","env":"dev","agent_backend":"pi-agent","schema_version":47,"schema_ready":true,"task_store_ready":true}
|
||||
```
|
||||
|
||||
### 3.3 用例矩阵设计
|
||||
|
||||
| 矩阵模块 (mutex) | 验证手段 | 主要资产 |
|
||||
|------------------|----------|----------|
|
||||
| intent / intent-plan | short 定向包 | `modules.txt` |
|
||||
| chat / ctxmgr | short + live 闲聊/window/guest | `modules.txt` + `live-8080.json` |
|
||||
| squad | short | `modules.txt` |
|
||||
| workflow | 治理 PG + live SavePlan/冲突/激活/preview | `governance-pg-verbose.txt` + live JSON |
|
||||
| IAM / authz | live login / guest 403 / members | live JSON |
|
||||
| docgov / docrevision | short 包(不重跑 Round20 UI) | `modules.txt` |
|
||||
| web | npm + bundle + live 冲突恢复路径 | `npm.txt` / `bundle.txt` / live |
|
||||
| pi-agent | short + node result-v1 + live typed-result | `modules.txt` / `pi-sample-typed.txt` |
|
||||
| infra | health/ready/smoke | `dev-health.json` / `test-env-smoke.txt` |
|
||||
| CI / E2E | 治理 PG 复跑 | `governance-pg*.txt` |
|
||||
| events | short E0–E2 相关包 | `modules.txt` |
|
||||
| 纯软件自举 | — | **N/A(planned)** |
|
||||
|
||||
---
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| Wave | 预期 |
|
||||
|------|------|
|
||||
| W1 | 全部命令 exit 0;治理 PG ≥2 用例 PASS |
|
||||
| W2 | `live-8080.json` `overall=PASS`;闲聊为真实模型回复;guest=`SESSION_FORBIDDEN`;冲突码=`ERR_CONCURRENT_SWITCH`;`can_terminate=true` |
|
||||
| W3 | typed-result 四子测 PASS;**不**强制跑三工作流 PI |
|
||||
| W4 | tag `rc-v1.0.0-beta.2`;`:8081` schema=47;smoke SUCCESS;`live-8081.json` overall=PASS |
|
||||
| 矩阵 | 已实现行全部 PASS 或 N/A;无 FAIL 阻挡晋升 |
|
||||
|
||||
---
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
> 每个典型用例固定四段:**测试输入 → 系统输出 → 分析 → 评价判定**。耗时一并给出。
|
||||
|
||||
---
|
||||
|
||||
### 5.1 Wave 1 — 门禁基线与模块定向
|
||||
|
||||
#### 用例 W1-01:`go vet ./...`
|
||||
|
||||
- **测试输入 (Input)**
|
||||
```bash
|
||||
env -u TEST_DATABASE_URL -u DATA_DIR go vet ./...
|
||||
```
|
||||
- **系统输出 (Actual Output)**
|
||||
- 无诊断输出;`vet_exit=0`(见 `vet.txt`)
|
||||
- **分析 (Analysis)**
|
||||
- 清空 `TEST_DATABASE_URL`/`DATA_DIR` 避免上一轮 PI 隔离库与工作区路径污染编译/静态检查上下文。
|
||||
- 无 vet 告警说明当前合入点类型与可疑构造检查通过。
|
||||
- **评价判定 (Evaluation)**:**PASS**
|
||||
- **耗时**:秒级
|
||||
|
||||
#### 用例 W1-02:`go test -short ./...`
|
||||
|
||||
- **测试输入 (Input)**
|
||||
```bash
|
||||
env -u TEST_DATABASE_URL -u DATA_DIR -u KB_DB_PORT go test -short ./...
|
||||
```
|
||||
- **系统输出 (Actual Output)**(摘自 `short.txt` 尾部)
|
||||
```text
|
||||
ok chat-agent-system/internal/server 10.668s
|
||||
ok chat-agent-system/internal/squad (cached)
|
||||
...
|
||||
short_exit=0
|
||||
```
|
||||
- **分析 (Analysis)**
|
||||
- 全仓 short 回归覆盖业务主路径单元/httptest 层。
|
||||
- `internal/server` ~10.7s 为最重包之一,仍在可接受范围内。
|
||||
- 历史踩坑:保留 `TEST_DATABASE_URL` 时,resume 类 PG 用例会误连隔离库并因缺用户 FK 失败;本轮强制 unset 后稳定。
|
||||
- **评价判定**:**PASS**
|
||||
- **耗时**:约 92s(全量 short 墙钟)
|
||||
|
||||
#### 用例 W1-03:架构边界门禁
|
||||
|
||||
- **测试输入 (Input)**
|
||||
```bash
|
||||
./scripts/arch-check.sh --mode block
|
||||
```
|
||||
- **系统输出 (Actual Output)**(`arch-check.txt`)
|
||||
```text
|
||||
arch-check mode=block
|
||||
boundaries=.../module-boundaries.yaml
|
||||
ok chat-agent-system/internal/archtest 0.138s
|
||||
arch-check block: production gate passed
|
||||
arch_exit=0
|
||||
```
|
||||
- **分析 (Analysis)**
|
||||
- block 模式失败即阻断晋升;本轮模块边界契约未回退。
|
||||
- **评价判定**:**PASS**
|
||||
|
||||
#### 用例 W1-04:前端 `npm test` + 生产包扫描
|
||||
|
||||
- **测试输入 (Input)**
|
||||
```bash
|
||||
cd web && npm test
|
||||
./scripts/check-prod-bundle.sh
|
||||
```
|
||||
- **系统输出 (Actual Output)**
|
||||
```text
|
||||
ℹ tests 376
|
||||
ℹ pass 376
|
||||
ℹ fail 0
|
||||
Test Files 3 passed (3) # vitest
|
||||
Tests 32 passed (32)
|
||||
✓ built in 7.44s
|
||||
PASS: prod bundle scan (.../web/dist)
|
||||
npm_exit=0 / bundle_exit=0
|
||||
```
|
||||
- **分析 (Analysis)**
|
||||
- tsx node:test 与 vitest 双轨均绿。
|
||||
- prod bundle 扫描确认 demo seeds 默认关闭(与 `DEMO-WEB-SEEDS` 门禁一致)。
|
||||
- **评价判定**:**PASS**
|
||||
- **耗时**:npm ~0.8s + build ~7.4s
|
||||
|
||||
#### 用例 W1-05:FEATURE-MATRIX 模块定向包
|
||||
|
||||
- **测试输入 (Input)**
|
||||
按模块分组执行(见 `modules.txt`),例如:
|
||||
```bash
|
||||
go test -short -count=1 ./internal/intent ./internal/coordinator \
|
||||
./internal/app/intentflow ./internal/app ./internal/events ./internal/server \
|
||||
-run 'TestSplitPlan|TestPlanProposal|...|IntentPlan|TestIntentRecognition|...'
|
||||
go test -short -count=1 ./internal/ctxmgr ./internal/app/chatflow ./internal/chat
|
||||
go test -short -count=1 ./internal/squad/...
|
||||
go test -short -count=1 ./internal/projectinstance ./internal/workflowdef \
|
||||
./internal/auth ./internal/authz ./internal/docgov ./internal/docrevision
|
||||
go test -short -count=1 ./internal/agent
|
||||
node --test deploy/pi-agent/result-v1.test.mjs
|
||||
go test -short -count=1 ./internal/events ./internal/app/docnotify \
|
||||
./internal/app/docadvance ./internal/app/docproject ./internal/app/docflow
|
||||
```
|
||||
- **系统输出 (Actual Output)**(摘要)
|
||||
| 分组 | 结果 |
|
||||
|------|------|
|
||||
| intent/intent-plan | 6 包 ok,`intent_exit=0` |
|
||||
| chat | 3 包 ok,`chat_exit=0` |
|
||||
| squad | ok,`squad_exit=0` |
|
||||
| workflow/authz/doc* | 6 包 ok,`waf_exit=0` |
|
||||
| pi-agent Go | ok 3.459s |
|
||||
| pi-agent node result-v1 | **3 pass / 0 fail** |
|
||||
| events E0–E2 | 5 包 ok,`events_exit=0` |
|
||||
- **分析 (Analysis)**
|
||||
- 定向包把 FEATURE-MATRIX 行映射到可执行命令,避免「只引用旧报告」。
|
||||
- docrevision 本轮仅 short;完整 UI Round20 不在范围,但短测未暴露回归。
|
||||
- **评价判定**:**PASS**
|
||||
|
||||
#### 用例 W1-06:治理 PG 集成(BUG-08 复跑)
|
||||
|
||||
- **测试输入 (Input)**
|
||||
```bash
|
||||
# 隔离库(禁止 agent_system_dev/test/main)
|
||||
CREATE DATABASE agent_gov_matrix;
|
||||
export TEST_DATABASE_URL='postgres://app:***@127.0.0.1:5434/agent_gov_matrix?sslmode=disable'
|
||||
go test ./internal/server/ -run 'TestWorkflowGovernance_PG_|TestE2E_WorkflowGovernance' \
|
||||
-timeout 20m -count=1 -v
|
||||
```
|
||||
- **系统输出 (Actual Output)**(`governance-pg-verbose.txt`)
|
||||
```text
|
||||
=== RUN TestE2E_WorkflowGovernance_CompleteAndReplan
|
||||
goose: no migrations to run. current version: 47
|
||||
--- PASS: TestE2E_WorkflowGovernance_CompleteAndReplan (0.31s)
|
||||
=== RUN TestWorkflowGovernance_PG_ActivateApproveAdvanceChain
|
||||
--- PASS: TestWorkflowGovernance_PG_ActivateApproveAdvanceChain (0.35s)
|
||||
PASS
|
||||
ok chat-agent-system/internal/server 0.663s
|
||||
```
|
||||
- **分析 (Analysis)**
|
||||
- 迁移链停在 **47**,与共享环境一致。
|
||||
- KB DSN 空配置触发离线降级日志,**不构成失败**(治理链路不依赖共享 KB)。
|
||||
- 覆盖「完成再规划」与「激活→批准→推进」两条治理主链。
|
||||
- **评价判定**:**PASS**
|
||||
- **耗时**:约 0.66s(库已迁完后复跑)
|
||||
|
||||
---
|
||||
|
||||
### 5.2 Wave 2 — live API 抽检(dev `:8080`)
|
||||
|
||||
**会话元数据**:项目 **6367** / `sess-p6367-u11` / `overall=PASS`(完整 JSON:[`live-8080.json`](./assets/2026-09-16-matrix-deep-test/live-8080.json))
|
||||
|
||||
#### 用例 W2-01:健康与后端真实性
|
||||
|
||||
- **测试输入**
|
||||
`GET /api/v1/health`、`GET /api/v1/ready`
|
||||
- **系统输出**
|
||||
```json
|
||||
{"status":"ok","env":"dev","agent_backend":"pi-agent","schema_version":47,"schema_ready":true,"task_store_ready":true}
|
||||
```
|
||||
- **分析**
|
||||
- `agent_backend=pi-agent` 排除 stub 冒充验收。
|
||||
- schema 47 与 goose 最新迁移一致。
|
||||
- **评价判定**:**PASS**(6ms)
|
||||
|
||||
#### 用例 W2-02:登录与账号可用性
|
||||
|
||||
- **测试输入**
|
||||
尝试 `zhanggong/123456` → 失败后改用 `lizhuguan`(owner)、`wangzong`(reviewer)、`admin`(approver)、`guest`
|
||||
- **系统输出**
|
||||
- `zhanggong`:**403**「账号已被停用,禁止登录」
|
||||
- 有效账号:owner_id=11,reviewer_id=12,approver_id=9,guest_id=13
|
||||
- **分析**
|
||||
- 停用账号 fail-closed,符合 IAM 预期。
|
||||
- 活验账号切换已写入证据 note,避免误用历史脚本默认用户。
|
||||
- **评价判定**:**PASS**(账号策略正确;替代账号可用)
|
||||
|
||||
#### 用例 W2-03:Demo 污染防护(项目列表)
|
||||
|
||||
- **测试输入**
|
||||
`GET /api/v1/projects`(Bearer owner)
|
||||
- **系统输出**
|
||||
- http=200;列表 count=7;`polluted=[]`(无 id 6001–6010)
|
||||
- **分析**
|
||||
- 与 goose 00046/00047 `demo_retired` + 列表过滤一致;演示十项目未回流列表。
|
||||
- **评价判定**:**PASS**
|
||||
|
||||
#### 用例 W2-04:新建项目与交付物洁净
|
||||
|
||||
- **测试输入**
|
||||
```http
|
||||
POST /api/v1/projects
|
||||
{"name":"矩阵深度抽检-051808","code":"mtx-051808",
|
||||
"device_type":"超声软组织手术吸引设备",...}
|
||||
GET /api/v1/projects/6367/documents
|
||||
```
|
||||
- **系统输出**
|
||||
- 创建:**201**,`project_id=6367`
|
||||
- 文档:http=200,`doc_count=0`,`mock_ids=[]`
|
||||
- **分析**
|
||||
- 新建项目无 mock/seed 交付物污染(`DEMO-WEB-SEEDS`/`DEMO-DB-SEED` 防线仍有效)。
|
||||
- **评价判定**:**PASS**(create 20ms)
|
||||
|
||||
#### 用例 W2-05:真实 PI 闲聊
|
||||
|
||||
- **测试输入**
|
||||
```http
|
||||
POST /api/v1/chat
|
||||
session_id=sess-p6367-u11
|
||||
message=先记录一下:本项目是超声软组织吸引设备立项摸底,请用一两句话确认你已记住设备类型
|
||||
```
|
||||
- **系统输出**
|
||||
- http=**200**,耗时 **8101ms**
|
||||
- 回复摘录:
|
||||
> 好的,已记住——本项目是**超声软组织吸引设备**(即超声软组织手术吸引设备)的立项摸底。…
|
||||
- **分析**
|
||||
- 延迟与语义均符合真实 MiniMax 链路,非 stub 瞬时模板。
|
||||
- 设备类型被正确回指,满足「记忆确认」意图抽检。
|
||||
- **评价判定**:**PASS**
|
||||
|
||||
#### 用例 W2-06:刷新窗口与分类一致性
|
||||
|
||||
- **测试输入**
|
||||
`GET /api/v1/chat/messages/window?session_id=sess-p6367-u11&days=7`
|
||||
`GET /api/v1/chat/categories?session_id=...`
|
||||
- **系统输出**
|
||||
- window http=200,`window_msgs=2`
|
||||
- categories http=200
|
||||
- **分析**
|
||||
- 一轮 user+assistant 后窗口至少 2 条,符合刷新可读预期(CHAT-HISTORY-REFRESH 相关契约)。
|
||||
- **评价判定**:**PASS**(3ms)
|
||||
|
||||
#### 用例 W2-07:双用户负例(guest)
|
||||
|
||||
- **测试输入**
|
||||
guest token 读取同一 `session_id` 的 window
|
||||
- **系统输出**
|
||||
- http=**403**,`error_code=SESSION_FORBIDDEN`
|
||||
- **分析**
|
||||
- 非会话 owner fail-closed;跨用户不可枚举他人对话。
|
||||
- **评价判定**:**PASS**
|
||||
|
||||
#### 用例 W2-08:工作流规划保存
|
||||
|
||||
- **测试输入**
|
||||
拉取 `workflow-plan/default?workflow_key=main` → 填充三权职责 →
|
||||
`PUT .../workflow-plan`(`expected_plan_revision=0`,`expected_selection_version=1`)
|
||||
- **系统输出**
|
||||
- http=**200**;`lifecycle_status=planning`;`workflow_plan_revision=1`
|
||||
- **分析**
|
||||
- 成员已 upsert 后 SavePlan 成功(避免历史 `DUTY_ASSIGNEE_NOT_ACTIVE_MEMBER`)。
|
||||
- **评价判定**:**PASS**(5ms)
|
||||
|
||||
#### 用例 W2-09:版本冲突(乐观锁)
|
||||
|
||||
- **测试输入**
|
||||
使用正确 `plan_revision`,但 `expected_selection_version=999` 再次 PUT
|
||||
- **系统输出**
|
||||
- http=**409**
|
||||
- 嵌套业务码:`ERR_CONCURRENT_SWITCH`(HTTP 信封外层可为 `VERSION_CONFLICT`)
|
||||
- **分析**
|
||||
- 前端已能解包嵌套业务码并映射 `retry_after_switch`;本用例验证后端冲突契约仍在。
|
||||
- **评价判定**:**PASS**(1ms)
|
||||
|
||||
#### 用例 W2-10:激活 + 终止 preview
|
||||
|
||||
- **测试输入**
|
||||
`POST .../activation-preview` → `POST .../workflow-instances/activate` →
|
||||
`GET /api/v1/workflow-instances/{id}/termination-preview`
|
||||
- **系统输出**
|
||||
- activate http=**200**
|
||||
- preview http=**200**;`instance_id=262`;`can_terminate=true`
|
||||
- keys: `pending_documents`, `in_progress_task_runs`, `can_terminate`, `impact`
|
||||
- **分析**
|
||||
- 激活后实例可查询终止影响面,满足治理「先 preview 再终止」门禁。
|
||||
- **评价判定**:**PASS**
|
||||
|
||||
**Wave 2 总评**:**PASS**(12/12 子用例)
|
||||
|
||||
---
|
||||
|
||||
### 5.3 Wave 3 — 真实 PI 抽样
|
||||
|
||||
#### 用例 W3-01:`TestPiAgentTypedResult_LiveDualTrack`
|
||||
|
||||
- **测试输入**
|
||||
```bash
|
||||
RUN_PI_E2E=1 \
|
||||
PI_AGENT_RUNNER_URL=http://127.0.0.1:18865 \
|
||||
PI_AGENT_RUNNER_AUTH_TOKEN=<from container> \
|
||||
DATA_DIR=.../data/dev \
|
||||
go test ./internal/agent -run TestPiAgentTypedResult_LiveDualTrack -timeout 15m -v -count=1
|
||||
```
|
||||
Runner 健康(`pi-runner-dev-health.json`):
|
||||
`ok=true`,`model_id=MiniMax-M2.7-highspeed`,`has_token=true`
|
||||
- **系统输出**(`pi-sample-typed.txt`)
|
||||
```text
|
||||
--- PASS: TestPiAgentTypedResult_LiveDualTrack (3.28s)
|
||||
--- PASS: .../failure_empty_prompt (0.00s)
|
||||
--- PASS: .../timeout (0.00s)
|
||||
--- PASS: .../cancel (0.30s)
|
||||
--- PASS: .../success (2.97s)
|
||||
pi_sample_exit=0
|
||||
```
|
||||
- **分析**
|
||||
- 覆盖成功路径与失败/超时/取消,证明 runner 鉴权、typed-result 编解码与取消语义可用。
|
||||
- 抽样已 PASS,按计划**不升格**完整三工作流 PI E2E(节约 ~28min,风险可控)。
|
||||
- **评价判定**:**PASS**
|
||||
- **耗时**:3.28s
|
||||
|
||||
---
|
||||
|
||||
### 5.4 Wave 4 — 晋升并部署 test
|
||||
|
||||
#### 用例 W4-01:Git 晋升与 Tag
|
||||
|
||||
- **测试输入**
|
||||
1. 首次执行 `./scripts/git-workflow-helper.sh promote-to-test rc-v1.0.0-beta.2`
|
||||
2. 因 `git pull --rebase origin test` 触发大规模 rebase 冲突 → `git rebase --abort`
|
||||
3. 改为:`git checkout test && git merge --no-ff dev` + `git tag -a rc-v1.0.0-beta.2`
|
||||
- **系统输出**
|
||||
- Tag 存在:`rc-v1.0.0-beta.2`
|
||||
- `test` 先端含 promote merge + 后续 closeout sync
|
||||
- **分析**
|
||||
- 本地 `test` 与 `origin/test` 分叉时,rebase 会重放数百提交,属**工具风险**而非产品缺陷。
|
||||
- 已加固 `scripts/git-workflow-helper.sh`:本地晋升默认不再 `pull --rebase origin test`。
|
||||
- **评价判定**:**PASS**(晋升目标达成;工具缺陷已修)
|
||||
|
||||
#### 用例 W4-02:test 容器 rebuild / 健康
|
||||
|
||||
- **测试输入**
|
||||
```bash
|
||||
./scripts/env-service.sh test rebuild
|
||||
# 中间误用 compose 导致 PG 端口绑到 5433 冲突后,改用 env-service start 恢复
|
||||
curl -sf http://127.0.0.1:8081/api/v1/health
|
||||
curl -sf http://127.0.0.1:8081/api/v1/ready
|
||||
curl -sf http://127.0.0.1:8089/health
|
||||
curl -sf http://127.0.0.1:18866/health
|
||||
```
|
||||
- **系统输出**
|
||||
- health/ready:`env=test`,`schema_version=47`,`agent_backend=pi-agent`
|
||||
- events:`{"env":"test","owner":"events-1","status":"ok"}`
|
||||
- pi-agent:`ok=true`,model `MiniMax-M2.7-highspeed`
|
||||
- **分析**
|
||||
- `.env` 中 `SYSTEM_DB_PUBLISH_PORT=5433` 会被裸 `docker compose` 覆盖 test 默认 5434;**必须**走 `env-service.sh test *`。
|
||||
- schema 与 dev 对齐 47,具备同构实测条件。
|
||||
- **评价判定**:**PASS**
|
||||
|
||||
#### 用例 W4-03:`test-env-smoke.sh`
|
||||
|
||||
- **测试输入**
|
||||
`./scripts/test-env-smoke.sh`(默认 `:8081` + pi `:18866`)
|
||||
- **系统输出**(`test-env-smoke.txt`)
|
||||
```text
|
||||
[PASS] test app SPA /
|
||||
[PASS] test app deep link /projects
|
||||
[PASS] pi-agent /health
|
||||
[SUCCESS] test env smoke passed
|
||||
```
|
||||
- **分析**
|
||||
- SPA/深链/runner 冒烟通过,说明前端静态资源与路由回退可用。
|
||||
- **评价判定**:**PASS**
|
||||
|
||||
#### 用例 W4-04:test 轻量 live(隔离库)
|
||||
|
||||
- **测试输入**
|
||||
- test 库初始仅 `admin`;经 SQL 注入 `mtx_owner/reviewer/approver`(复用 admin 密码哈希)
|
||||
- admin 创建项目(具备 `project:create`)→ 成员 upsert → SavePlan → 冲突 PUT → Activate → termination-preview
|
||||
- **禁止**读取 `data/dev`
|
||||
- **系统输出**([`live-8081.json`](./assets/2026-09-16-matrix-deep-test/live-8081.json))
|
||||
| 步骤 | HTTP / 结果 |
|
||||
|------|-------------|
|
||||
| health | schema=47,env=test |
|
||||
| create_project | **201**,`project_id=3`,code=`tst-052432` |
|
||||
| save_plan | **200**,`workflow_plan_revision=1` |
|
||||
| conflict | **409**,`ERR_CONCURRENT_SWITCH` |
|
||||
| activate | **200**,`lifecycle_status=active`,`active_workflow_key=main`,instance id=1 |
|
||||
| termination_preview | **200**,`can_terminate=true` |
|
||||
| **overall** | **PASS** |
|
||||
- **分析**
|
||||
- 项目 id=3 说明 test 业务库与 dev(6367)**严格隔离**。
|
||||
- 冲突/激活/preview 契约与 dev 一致,证明晋升镜像行为正确。
|
||||
- 副作用:`mtx_*` 为测试账号种子,可保留供后续实测。
|
||||
- **评价判定**:**PASS**
|
||||
|
||||
**Wave 4 总评**:**PASS**
|
||||
|
||||
---
|
||||
|
||||
### 5.5 FEATURE-MATRIX 行级评价汇总
|
||||
|
||||
| 模块 | 状态(矩阵) | 本轮验证 | 评价 |
|
||||
|------|------------|----------|------|
|
||||
| 意图识别 L1 | partial | W1 定向 | **PASS(功能可用)**;U9–U12 仍为 backlog |
|
||||
| 多意图持久计划 | partial | W1 定向 | **PASS(U1–U8 短测)**;schema 注记已改为 47 |
|
||||
| 对话 / ctxmgr | partial | W1+W2 | **PASS** |
|
||||
| 智能体小队 | done | W1 | **PASS** |
|
||||
| 工作流治理 | partial | W1-06+W2+W4 | **PASS** |
|
||||
| 纯软件项目自举 | planned | — | **N/A** |
|
||||
| IAM / 鉴权 | partial | W2/W4 | **PASS**(含停用账号与 guest 负例) |
|
||||
| 文档治理 | done | W1 short | **PASS(短测)**;未重跑 UI Round20 |
|
||||
| 文档版本与修改认知 | partial | W1 short | **PASS(短测)**;change-report 仍 fallback |
|
||||
| 前端工作台 | partial | W1 npm + W2 冲突路径 | **PASS** |
|
||||
| PI Runner | done | W1+W3 | **PASS** |
|
||||
| 三环境运维 | done | W2/W4 health | **PASS** |
|
||||
| CI / E2E | partial | W1-06 | **PASS(治理 PG)**;`-race` flake 仍为基建债 |
|
||||
| 模块解耦与事件 | partial | W1 events | **PASS(短测)** |
|
||||
|
||||
---
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
| 命令 | 结果 | 证据 |
|
||||
|------|------|------|
|
||||
| `go vet ./...` | exit 0 | `vet.txt` |
|
||||
| `go test -short ./...` | exit 0 | `short.txt` |
|
||||
| `./scripts/arch-check.sh --mode block` | PASS | `arch-check.txt` |
|
||||
| `cd web && npm test` | 376 + 32 PASS | `npm.txt` |
|
||||
| `./scripts/check-prod-bundle.sh` | PASS | `bundle.txt` |
|
||||
| 模块定向套件 | 全组 exit 0 | `modules.txt` |
|
||||
| 治理 PG(`agent_gov_matrix`) | 2 PASS | `governance-pg-verbose.txt` |
|
||||
| PI typed-result live | 4/4 PASS | `pi-sample-typed.txt` |
|
||||
| `./scripts/test-env-smoke.sh` | SUCCESS | `test-env-smoke.txt` |
|
||||
| live `:8080` / `:8081` | overall PASS | `live-8080.json` / `live-8081.json` |
|
||||
|
||||
**通过率(本轮门禁用例)**:Wave 1–4 关键用例 **100% PASS**;矩阵已实现行 **无 FAIL**;planned 行 **N/A**。
|
||||
|
||||
---
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
### 7.1 结论
|
||||
|
||||
1. **系统可正常运作**:短测、模块定向、治理 PG、dev/test live 与真实 PI 抽样均 PASS。
|
||||
2. **FEATURE-MATRIX 已实现能力**在本轮证据下可判定为**可用/未回归**;planned 的「纯软件项目自举」不纳入本轮验收。
|
||||
3. **test 服务端已更新部署**:本地 `test` @ `rc-v1.0.0-beta.2`,`:8081` schema=47,smoke + 轻量 live PASS。
|
||||
4. **总评价**:**达到晋升与深度回归目标,建议作为当前 test 实测基线。**
|
||||
|
||||
### 7.2 风险与后续
|
||||
|
||||
| 项 | 说明 | 建议 |
|
||||
|----|------|------|
|
||||
| 完整三工作流 PI | 本轮仅抽样 | 夜间 `RUN_PI_E2E=1` 或发版前补跑 |
|
||||
| Round20 UI | 未重跑 | 文档修订大改动时再跑 Playwright |
|
||||
| `zhanggong` 停用 | dev 默认脚本用户失效 | 更新活验脚本默认账号 |
|
||||
| test 缺种子用户 | 仅 admin | 晋升后补 demo/业务用户种子或文档化 SQL 种子步骤 |
|
||||
| 远端同步 | 未 push | 用户授权后 `./scripts/git-push-dev.sh test` 并推送 tag |
|
||||
| promote 工具 | 已修默认 rebase | 继续避免对分叉 `test` 做 origin rebase |
|
||||
|
||||
### 7.3 关键产物索引
|
||||
|
||||
| 文件 | 内容 |
|
||||
|------|------|
|
||||
| `assets/.../live-8080.json` | dev 全链路抽检 |
|
||||
| `assets/.../live-8081.json` | test 晋升后抽检 |
|
||||
| `assets/.../pi-sample-typed.txt` | 真实 PI 抽样 |
|
||||
| `assets/.../governance-pg-verbose.txt` | 治理 PG |
|
||||
| `assets/.../short.txt` / `modules.txt` / `npm.txt` | 自动化基线 |
|
||||
| `assets/.../test-env-smoke.txt` | test 冒烟 |
|
||||
@@ -0,0 +1,46 @@
|
||||
# Nightly DATA_DIR 对齐测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
Gitea nightly run#21 使用 `PI_AGENT_RUNNER_URL=http://127.0.0.1:18865`(dev PI,挂载 `data/dev/workspaces`),但 workflow 设置 `DATA_DIR=/host-agent-data/test`,导致 Go 侧 workspace 与 PI 容器物理路径错配;U8 出现 `quality_failed` → `product_fail`。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- `DATA_DIR=/host-agent-data/dev` 与 `:18865` 对齐
|
||||
- 确认 `quality_failed` 重试路径仍在脚本中
|
||||
- `workflow_dispatch` 后 receipt 非因 DATA_DIR 错配导致的 infra/product 误判
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- OS: Linux;Gitea act_runner `nightly:host` + host network
|
||||
- PI: `127.0.0.1:18865` MiniMax-M2.7-highspeed
|
||||
- PG: `NIGHTLY_TEST_DATABASE_URL` → `:5434`
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
- checkout / setup-go / archive PASS
|
||||
- 用例不再因 DATA_DIR skip;workspace 路径含 `data/dev/workspaces`
|
||||
- receipt `pass`,或重试后 `pass`;若仍 `product_fail` 则归模型质量门并记录
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 配置变更
|
||||
|
||||
- Input: `DATA_DIR` test → dev
|
||||
- Actual: workflow 已合入 `dev`
|
||||
- Verdict: PASS(配置)
|
||||
- Duration: n/a
|
||||
|
||||
### Nightly 重跑
|
||||
|
||||
- run#25 (`89ce3cc`): DATA_DIR=dev 已对齐,但 `/host-agent-data` 曾 `:ro` → `mkdir ... read-only file system` → `product_fail`(误分类,已改 compose rw + classify infra)
|
||||
- 修复后重新 `workflow_dispatch`;见最新 run
|
||||
- Verdict: 配置 FAIL→FIX;待 green
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
- 本项为 CI workflow 配置修复;`go test -short` 不覆盖 nightly。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- 配置对齐为 P1 必做项;若对齐后仍偶发 quality_failed,依赖脚本重试与产品侧质量门调优(不回退为 infra)。
|
||||
@@ -0,0 +1,51 @@
|
||||
# Phase 3 遗留修复测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
Wave 2B N7 本机 nightly 在 U8 真实 PI 出现 `quality_failed`(产品质量门,非 infra);Playwright intent-plan 双标签仍为 skip 骨架;矩阵/DoD 仍有开放项需清点而不假完成。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- 明确 N7 根因分类 + 门禁策略(重试一次,仍失败 product_fail)
|
||||
- Playwright 正式 gated 文档化
|
||||
- 遗留项 handoff 清点
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
| 项 | 值 |
|
||||
|----|-----|
|
||||
| 分支 | `fix/wave-leftovers-n7-playwright-dod` |
|
||||
| 证据 | Wave2B receipt `67d7335…` product_fail;脚本重试逻辑 |
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
- quality_failed → 脚本重试一次;二次仍失败 → product_fail receipt
|
||||
- 不将 quality_failed 标为 infra 或 PASS
|
||||
- 矩阵写明 Playwright 关闭条件
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### L1 — N7 根因与策略
|
||||
|
||||
- **Input**:Wave2B 控制台 `PI run status=quality_failed want completed`
|
||||
- **Actual**:属产品质量门失败;`run-nightly-real-pi.sh` 增加一次全文重试
|
||||
- **Verdict**:PASS(策略落地;未把偶发写成绿)
|
||||
|
||||
### L2 — Playwright gated
|
||||
|
||||
- **Input**:阅读 `web/e2e/intent-plan-cards.spec.ts`
|
||||
- **Actual**:`test.skip(!RUN_UI_ACCEPTANCE)`;long-term + 矩阵关闭条件已写
|
||||
- **Verdict**:PASS(正式 gated,非 stub 冒充)
|
||||
|
||||
### L3 — 遗留清点
|
||||
|
||||
- **Actual**:handoff `2026-09-16-phase3-leftover-closeout.md`
|
||||
- **Verdict**:PASS
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
`go vet` + 洁净 `go test -short ./...`(合入冒烟)。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
三相计划收口。nightly 真 PASS 依赖 runner+模型稳定与 Actions secrets;Playwright/PU6–PU8 等获批后再开实现。
|
||||
@@ -0,0 +1,135 @@
|
||||
# 纯软件项目自举(SWBOOT-00..09)测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
工作流引擎已声明 `non_medical_software`,但正式目录与创建入口仍硬编码医疗三工作流。本轮在 `feature/software-project-bootstrap` 落地 SWBOOT-00..09 契约、迁移、manifest、目录白名单、创建向导后端钩子,以及 SWBOOT-10 allowlist stub(无真实 patch/merge)。医疗既有三工作流保持不变。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- `software_bootstrap` / `software_delivery` manifest 可校验且无医疗默认语义污染
|
||||
- 正式可选 key 扩展为 5,医疗固定文档数门禁仍仅约束医疗三
|
||||
- 创建预览拒绝 `controlled_patch` 与 controlled/privacy+solo 冲突
|
||||
- SWBOOT-10 stub 对非 allowlist 路径与 patch/merge fail closed
|
||||
- `go vet` + 相关包 `-short` 单测通过;不冒充真实 PI / UI 验收
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
| 项 | 值 |
|
||||
|----|-----|
|
||||
| OS | Linux 7.0.0-31-generic |
|
||||
| Go | go1.27.1 linux/amd64 |
|
||||
| Branch | `feature/software-project-bootstrap` |
|
||||
| Commit | `f6034fa`(报告提交前基线;含后续 test/docs 提交) |
|
||||
| 实测时间 | 2026-09-16T15:44:30Z |
|
||||
| 层级 | L1 单元 / 包级回归;L2+ PG 空库迁移、真实 PI、Ubuntu UI 本轮 **NOT RUN** |
|
||||
| 后端 | stub 允许用于本轮工程门禁;禁止作为最终产品验收 |
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
| 用例 | 预期 |
|
||||
|------|------|
|
||||
| UC-01 Official keys | 5 keys;医疗 3 + 软件 2 |
|
||||
| UC-02 Domain filter | `software_*` 拒 `medical_device`;空 domain 不过滤 |
|
||||
| UC-03 Manifest validate | bootstrap/delivery `ValidateDefinitionV2` PASS;标题无临床/NMPA/CDMO |
|
||||
| UC-04 Creation preview | solo+standard 出 `creator_acknowledgement`;privacy+solo 与 controlled_patch 失败 |
|
||||
| UC-05 Repo allowlist stub | 非白名单拒;白名单路径仍拒 ExecuteControlledPatch/ApproveMerge |
|
||||
| UC-06 Software create | `non_medical_software` 落库字段;阶段 `S0_boundary`;不发明医疗 device 字段 |
|
||||
| UC-07 Medical regression | main v2 固定 7 文档校验仍 PASS;server API lifecycle 期望挂载 5 |
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### UC-01 Official keys
|
||||
|
||||
- **测试输入 (Input)**:`go test -short ./internal/workflowdef/ -run TestOfficialWorkflowKeys`
|
||||
- **实际输出 (Actual Output)**:`ok chat-agent-system/internal/workflowdef`
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:~0.003s
|
||||
|
||||
### UC-02 Domain filter
|
||||
|
||||
- **测试输入 (Input)**:`TestCompatibleWithProductDomain`
|
||||
- **实际输出 (Actual Output)**:包含于 workflowdef 包 PASS
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:含于包耗时
|
||||
|
||||
### UC-03 Manifest validate + 去污染
|
||||
|
||||
- **测试输入 (Input)**:`TestValidateDefinitionV2_SoftwareManifests`
|
||||
- **实际输出 (Actual Output)**:bootstrap/delivery 校验通过;医疗词扫描无命中
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:含于包耗时
|
||||
|
||||
### UC-04 Creation preview
|
||||
|
||||
- **测试输入 (Input)**:`go test -short ./internal/swboot/ -run 'TestBuildCreationPreview|TestProjectTypesCatalog'`
|
||||
- **实际输出 (Actual Output)**:`ok chat-agent-system/internal/swboot`
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:~0.002s
|
||||
|
||||
### UC-05 Repo allowlist stub
|
||||
|
||||
- **测试输入 (Input)**:`TestRepoAllowlistStub`
|
||||
- **实际输出 (Actual Output)**:非 allowlist → `ERR_REPO_PATH_NOT_ALLOWLISTED`;patch/merge → `ERR_SWBOOT10_STUB_ONLY`
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:含于 swboot 包
|
||||
|
||||
### UC-06 Software create
|
||||
|
||||
- **测试输入 (Input)**:`TestCreateSoftwareProject_NoMedicalDefaults`
|
||||
- **实际输出 (Actual Output)**:`ok chat-agent-system/internal/projectworkflow`
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:~0.003s
|
||||
|
||||
### UC-07 Medical regression + server API
|
||||
|
||||
- **测试输入 (Input)**:`go test -short ./internal/server/ -run TestProjectWorkflowAPI_Lifecycle` 及全包 short
|
||||
- **实际输出 (Actual Output)**:挂载/目录数量期望已更新为 5;`ok chat-agent-system/internal/server`
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS(医疗语义与旧 API 行为保留;仅目录容量扩展)
|
||||
- **性能与耗时 (Duration & Latency)**:server 包 ~10.9s
|
||||
|
||||
### 未执行(明示)
|
||||
|
||||
| 项 | Status |
|
||||
|----|--------|
|
||||
| PostgreSQL 空库/旧库升级到 schema 48 活验 | NOT RUN |
|
||||
| 真实 PI Agent Runner 文档生成 | NOT RUN |
|
||||
| Ubuntu Playwright UI-SW-00..14 | NOT RUN |
|
||||
| 受控 patch worktree 真实执行 | NOT RUN(仅 stub) |
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
命令:
|
||||
|
||||
```bash
|
||||
go vet ./internal/swboot/ ./internal/workflowdef/ ./internal/projectworkflow/ ./internal/workflow/ ./internal/server/
|
||||
go test -short -count=1 \
|
||||
./internal/swboot/ \
|
||||
./internal/workflowdef/ \
|
||||
./internal/workflow/ \
|
||||
./internal/projectworkflow/ \
|
||||
./internal/projectinstance/ \
|
||||
./internal/archtest/ \
|
||||
./internal/server/
|
||||
```
|
||||
|
||||
结果摘要(真实控制台):
|
||||
|
||||
```text
|
||||
ok chat-agent-system/internal/swboot 0.002s
|
||||
ok chat-agent-system/internal/workflowdef 0.003s
|
||||
? chat-agent-system/internal/workflow [no test files]
|
||||
ok chat-agent-system/internal/projectworkflow 0.003s
|
||||
ok chat-agent-system/internal/projectinstance 0.004s
|
||||
ok chat-agent-system/internal/archtest 0.143s
|
||||
ok chat-agent-system/internal/server 10.881s
|
||||
```
|
||||
|
||||
`go vet`:无输出(PASS)。
|
||||
|
||||
通过率:上述包 100%(workflow 无测试文件不计失败)。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- **结论**:SWBOOT-00..09 工程门禁(L1)达到合入候选标准;**未**达到完整验收清单完成定义(真实 PI / UI / PG 迁移活验仍为 NOT RUN)。
|
||||
- **未合 `dev`**:按要求仅推送 feature 分支。
|
||||
- **后续**:schema 48 在集成槽位对空库/旧库升级;七步 UI;对话路由与软件 profile;SWBOOT-10 真受控执行独立 Epic。
|
||||
@@ -0,0 +1,58 @@
|
||||
# Wave 1 PU3 IAM store fail-closed 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
`auth.NewStores` 在 pool/IAM 表未就绪时静默回退 MemoryStore。Wave 0 只读核验确认当前部署未触发,但代码旁路仍在。本波按 PU3 收口为仅 `dev|test` + `ALLOW_IN_MEMORY` 双门。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- main/prod/空 env/未知 env/缺 opt-in 时 fail-closed
|
||||
- 仅 dev/test + AllowInMemory 允许 MemoryStore
|
||||
- 相关 short 测试全绿;授权 happy path 不因测试夹具调整而破坏
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- 负例:`internal/auth/store_factory_test.go`
|
||||
- Assemble 负例:`TestAssemble_FailClosed_MainCannotUseMemoryIAM`
|
||||
- 回归:`go test -short ./internal/auth/ ./internal/app/ ./internal/bizdev/ ./internal/server/`
|
||||
- 测试夹具:`MustNewService` 在启用内存时默认 `Env=test`;严格鉴权用例启动后关闭 `AllowInMemory`
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
- FailClosed 用例全部 error;dev/test opt-in 返回 MemoryStore
|
||||
- main + AllowInMemory 不得 Assemble 成功
|
||||
- short 包测试 PASS
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 用例 1:NewStores 负例与 opt-in
|
||||
|
||||
- **输入**:`go test -count=1 ./internal/auth/ -run TestNewStores_`
|
||||
- **输出**:`ok`
|
||||
- **判定**:PASS
|
||||
|
||||
### 用例 2:Assemble main fail-closed
|
||||
|
||||
- **输入**:`go test -short ./internal/server/ -run TestAssemble_FailClosed_MainCannotUseMemoryIAM`
|
||||
- **输出**:PASS
|
||||
- **判定**:PASS
|
||||
|
||||
### 用例 3:short 回归
|
||||
|
||||
- **输入**:`go test -short -count=1 ./internal/auth/ ./internal/app/ ./internal/bizdev/ ./internal/server/`
|
||||
- **输出**:四包均 `ok`(见 assets)
|
||||
- **判定**:PASS
|
||||
- **耗时**:~12s
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
| 命令 | 结果 |
|
||||
|------|------|
|
||||
| `go test -short -count=1 ./internal/auth/ ./internal/app/ ./internal/bizdev/ ./internal/server/` | PASS |
|
||||
|
||||
产物:`.doc/test-reports/assets/2026-09-16-wave1-iam-fail-closed/`
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- MemoryStore 旁路已 fail-closed;IAM 行仍可 `partial`(全路由 inventory / session 中断负例未在本波做完)
|
||||
- 下一步:Wave 2 真实 PI 补证;可选继续 PU3 inventory
|
||||
@@ -0,0 +1,62 @@
|
||||
# Wave 1 PU5A TempDir race flake 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
全仓 `go test -race` 曾出现 `t.TempDir()` 清理时 `RemoveAll: directory not empty`,根因是 `taskrun.Manager` 异步 worker 在测试返回后仍写 `DataDir`。已知基建债,不挡首发;本波按 continuity 计划 PU5A 独立关闭。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- Worker 在 TempDir 删除前退出(`WaitIdle` / `WaitRunDone`)
|
||||
- `newTestServer` 与 `Server.Shutdown` 统一 drain
|
||||
- 多轮 `-race` 无 TempDir flake;不用 skip/ignore 假绿
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
- OS: linux;Go race detector
|
||||
- 变更:`internal/taskrun/manager.go` Wait API;`server_test.go` cleanup;`server.go` Shutdown;幂等 SSE 用例显式 wait
|
||||
- 层级:单元(WaitIdle)+ server 包 race ×3(跳过真实 PI E2E)+ short race ×2(taskrun/server/auth)
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
- `TestManager_WaitIdle_WaitsForWorker` PASS
|
||||
- `TestCreateTaskRun_PreActivationAcceptedNot409` / 幂等与 async 相关用例 race 下 PASS
|
||||
- 输出中无 `TempDir` / `RemoveAll` / `directory not empty` / `DATA RACE`
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 用例 1:WaitIdle 单元
|
||||
|
||||
- **测试输入 (Input)**:`go test -race -count=1 ./internal/taskrun/ -run TestManager_WaitIdle_WaitsForWorker -v`
|
||||
- **实际输出 (Actual Output)**:`--- PASS: TestManager_WaitIdle_WaitsForWorker (0.05s)`
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:~1s 包级
|
||||
|
||||
### 用例 2:server 包 race ×3(排除真实 PI)
|
||||
|
||||
- **测试输入 (Input)**:`go test -race -count=3 ./internal/server/ -skip 'TestPiAgent_'`
|
||||
- **实际输出 (Actual Output)**:`ok chat-agent-system/internal/server 357.605s`(全文见 assets)
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS(无 TempDir/DATA RACE 标记)
|
||||
- **性能与耗时 (Duration & Latency)**:~358s
|
||||
|
||||
### 用例 3:taskrun/server/auth short race ×2
|
||||
|
||||
- **测试输入 (Input)**:`go test -race -short -count=2 ./internal/taskrun/ ./internal/server/ ./internal/auth/`
|
||||
- **实际输出 (Actual Output)**:三包均 `ok`(见 assets)
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS
|
||||
- **性能与耗时 (Duration & Latency)**:~240s
|
||||
|
||||
备注:未 skip 的 `TestPiAgent_FullLifecycle_*` 在本机曾因真实 runner `typed result rejected` 失败,属外部 PI 路径,与 TempDir flake 无关;PR CI 默认不跑真实 PI。
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
| 命令 | 结果 |
|
||||
|------|------|
|
||||
| `go test -race -count=3 ./internal/server/ -skip 'TestPiAgent_'` | PASS |
|
||||
| `go test -race -short -count=2 ./internal/taskrun/ ./internal/server/ ./internal/auth/` | PASS |
|
||||
|
||||
产物:`.doc/test-reports/assets/2026-09-16-wave1-race-tempdir-cleanup/`
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- PU5A TempDir race flake **关闭**(server/taskrun/auth 多轮 race 无该签名)
|
||||
- 下一步:Wave 1 PU3 IAM fail-closed;PU5B 夜间 PI / receipt 另立
|
||||
@@ -0,0 +1,94 @@
|
||||
# Wave 2 PU4 真实 PI 补证(U8 + full/none)测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
Wave 0 校准后,FEATURE-MATRIX 将 multi-intent U8 与工作流 full/none 标为证据缺口:U8 仅有 adapter 单测与 `TestTaskGenerateRealPIStopGate` 假 SKIP;full/none 仅有设置页矩阵,缺少真实 PI 长链。本轮在隔离 PG + 共享 `data/dev/workspaces` + 产品 PI Runner(MiniMax-M2.7-highspeed)上补证,不升 `MULTI_INTENT_PLAN_TIER`。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- U8:确认前零副作用 → 确认后真实 PI generate → 幂等重放 → 撤权 → PG 重启恢复 → HTTP 刷新 GET
|
||||
- full:intake 真实 PI + 跨用户 author/reviewer/approver
|
||||
- none:research 真实 PI + submit-review 403 + 阶段就绪不阻塞 + 推进 + settings 刷新
|
||||
- 发现的产品缺陷就地修复并回归;不得用 stub/SKIP 冒充 PASS
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
| 项 | 值 |
|
||||
|----|-----|
|
||||
| OS | Linux 7.0.0-31-generic |
|
||||
| Go | `go test`(非 `-short`) |
|
||||
| 隔离 PG | `127.0.0.1:5434/agent_wave2_pi`(schema 47) |
|
||||
| Runner | `http://127.0.0.1:18865`,model `MiniMax-M2.7-highspeed` |
|
||||
| DATA_DIR | `data/dev`(与容器 workspaces 绑定) |
|
||||
| 分支 | `feature/wave2-real-pi-evidence` |
|
||||
| 用例 | `TestMultiIntentU8_RealPI_ConfirmGenerate_PG`;`TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain` |
|
||||
| 证据 | `.doc/test-reports/assets/2026-09-16-wave2-real-pi-evidence/` |
|
||||
|
||||
本轮顺带修复:
|
||||
|
||||
1. `intent_plan_steps.depends_on` / `intent_plan_decisions.step_ids` 空切片落 NULL → `textArrayOrEmpty`
|
||||
2. `taskrun.completed` 终态事件消费者误写 `projection/fav` → 改为登记的 `notify`
|
||||
3. `intent.plan.step_changed` 与 plan 级事件共享 `(aggregate_type,id,version)` 冲突 → step 使用 `intent_plan_step` 聚合;`AdvanceEligible` 全失败时不再吞错
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
- U8:`starts=0` 直至 Advance;PI `completed`;重放 starts=1;Denied 后 forbidden;重启后 task.run=`succeeded`;HTTP GET 200
|
||||
- full/none:intake 审批通过并推进 V0.1;research 生成成功且 submit 403;readiness Ready;推进 V0.5;settings 可读
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 用例 1:U8 真实 PI confirm generate
|
||||
|
||||
- **测试输入 (Input)**:`TEST_DATABASE_URL=…/agent_wave2_pi` + runner token;`go test ./internal/server -run TestMultiIntentU8_RealPI_ConfirmGenerate_PG`
|
||||
- **实际输出 (Actual Output)**(摘自 `assets/2026-09-16-wave2-real-pi-evidence/u8-go-test.txt`):
|
||||
|
||||
```text
|
||||
✓ [1. awaiting] plan_id=pln_79d640abce7c0f2ecf8c3726d28206a9 revision=1 starts=0
|
||||
taskrun_status_transition run_id=run_1789554232489934117 status=completed
|
||||
✓ [2. real PI generate] … status=completed elapsed=3m11s
|
||||
✓ [3. idempotent replay] starts still 1
|
||||
✓ [4. revoke] TaskRunAdapter denied
|
||||
✓ [5. PG restart recovery] … status=executing
|
||||
✓ [6. HTTP refresh] GET plan 486 bytes
|
||||
--- PASS: TestMultiIntentU8_RealPI_ConfirmGenerate_PG (191.34s)
|
||||
```
|
||||
|
||||
- **评价判定 (Evaluation / Verdict)**:**PASS**
|
||||
- **性能与耗时 (Duration & Latency)**:约 191s(含一次 intake PI)
|
||||
- **说明**:浏览器双标签 Playwright 仍为 gated stub(`web/e2e/intent-plan-cards.spec.ts`);本轮签署的是 API 层刷新/重登 GET + Plans 重绑模拟 app restart,不宣称 UI 双标签已绿。
|
||||
|
||||
### 用例 2:full/none 混合真实 PI 长链
|
||||
|
||||
- **测试输入 (Input)**:同环境;`TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain`(intake=full,research=none,其余文档关闭)
|
||||
- **实际输出 (Actual Output)**(摘自 `assets/…/fullnone-go-test.txt`):
|
||||
|
||||
```text
|
||||
✓ [1. activate] instance=6 full=intake none=research
|
||||
✓ pi-agent intake … elapsed=3m17s
|
||||
✓ [2. full intake] cross-user approve complete
|
||||
✓ [3. advance V0.1] ok
|
||||
✓ pi-agent research … elapsed=10m22s
|
||||
✓ [4. none research] generate ok; submit-review denied HTTP 403
|
||||
✓ [5. readiness] none does not block
|
||||
✓ [6. advance V0.5] none non-blocking PASS
|
||||
✓ [7. refresh] settings still readable
|
||||
--- PASS: TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain (818.64s)
|
||||
```
|
||||
|
||||
- **评价判定 (Evaluation / Verdict)**:**PASS**
|
||||
- **性能与耗时 (Duration & Latency)**:约 818s(两次真实 PI)
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
```text
|
||||
go test -short ./internal/app/intentflow ./internal/app ./internal/taskrun → PASS
|
||||
go vet ./internal/app/intentflow ./internal/app ./internal/taskrun ./internal/server → PASS
|
||||
go test ./internal/server -run TestMultiIntentU8_RealPI_ConfirmGenerate_PG → PASS (191s)
|
||||
go test ./internal/server -run TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain → PASS (819s)
|
||||
```
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- PU4 证据缺口可关闭:U8 真实 PI + full/none 混合长链均 PASS;默认 `MULTI_INTENT_PLAN_TIER=legacy` **不升**。
|
||||
- 建议:将 `intent-plan-cards` Playwright 双标签纳入独立 short-term;CI 夜间 `RUN_PI_E2E=1` 跑本两用例;合入 `dev` 前占槽 smoke。
|
||||
- 产品修复(nil 数组、taskrun 终态消费者、step 事件聚合)随本分支合入。
|
||||
@@ -0,0 +1,117 @@
|
||||
# Wave 2B PU5B:Nightly Real PI + Promotion Receipt 测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
Wave 2(PU4)已合入 `dev` 并补齐 U8 / full-none 真实 PI 证据。发布加固缺口仍在:PR CI 不跑真实 PI;晋升入口缺少不可变 receipt;基础设施失败易被误记为 PASS。本轮落地夜间入口、receipt 写/校验(含 timed waiver)与 `promote-to-test` / `release-to-main` 门禁钩子。**不**声称 same-image digest 晋升已完成。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- 缺 secret / runner 不可达 → `infra_fail` receipt,job/脚本非零退出(禁止写成 PASS)
|
||||
- 产品断言失败 → `product_fail`,晋升拒绝
|
||||
- PASS → 落盘 receipt;无 receipt / 过期 waiver → `promotion-receipt-check` 非零退出
|
||||
- workflow `concurrency` cancel-in-progress;PR `ci.yml` 仍不跑真实 PI
|
||||
- Artifact 矩阵行保持 **partial**(same-commit + digest 可追溯)
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
| 项 | 值 |
|
||||
|----|-----|
|
||||
| OS | Linux 7.0.0-31-generic |
|
||||
| 分支 | `feature/wave2b-nightly-promotion-receipt` |
|
||||
| Runner | `http://127.0.0.1:18865`(MiniMax-M2.7-highspeed) |
|
||||
| 隔离 PG | `127.0.0.1:5434/agent_wave2_pi` |
|
||||
| 脚本 | `scripts/run-nightly-real-pi.sh`、`promotion-receipt-{write,check}.sh`、`promote-to-test.sh`、`release-to-main.sh` |
|
||||
| Workflow | `.github/workflows/nightly-real-pi.yml`(schedule + workflow_dispatch) |
|
||||
| Receipt 目录 | `.doc/test-reports/assets/promotion-receipts/` |
|
||||
|
||||
用例矩阵:
|
||||
|
||||
| ID | 场景 | 期望 |
|
||||
|----|------|------|
|
||||
| N1 | `--dry-infra-fail` / 缺 secret | `verdict=infra_fail`,exit 1 |
|
||||
| N2 | fixture PASS commit | check OK |
|
||||
| N3 | fixture product_fail | check BLOCKED |
|
||||
| N4 | fixture infra_fail 无 waiver | check BLOCKED |
|
||||
| N5 | infra_fail + 有效 waiver 绑定 PASS | check OK |
|
||||
| N6 | 无 receipt commit | check BLOCKED |
|
||||
| N7 | 本机真实 suite(可选墙钟) | pass / product_fail / infra_fail 分类落盘 |
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
- Receipt 最小字段:`verdict`、`commit`、`recorded_at`、`runner_url`、`model_id`、`protocol`、`image_digests`、`suite`、`failure_class`、`evidence_refs`
|
||||
- Waiver:`owner`、`reason`、`expires_at`、`binds_receipt`(须指向 PASS)
|
||||
- `git-workflow-helper promote-to-test` 校验 **dev HEAD**;`release-to-main` 校验 **test HEAD**
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### N1 — infra 负例(本机 dry)
|
||||
|
||||
- **测试输入 (Input)**:`./scripts/run-nightly-real-pi.sh --dry-infra-fail`
|
||||
- **实际输出 (Actual Output)**:
|
||||
|
||||
```text
|
||||
==> nightly real-PI suite commit=82780222373d runner=http://127.0.0.1:18865
|
||||
forced infra failure (--dry-infra-fail)
|
||||
wrote promotion receipt: .../82780222373de1ded853e3fe5a8f2208133bc7c7.json
|
||||
wrote infra_fail receipt (dry)
|
||||
```
|
||||
|
||||
- **评价判定 (Evaluation / Verdict)**:PASS(`verdict=infra_fail`,exit 1;非绿)
|
||||
- **性能与耗时 (Duration & Latency)**:<1s
|
||||
|
||||
对应 receipt 摘录见 assets;晋升门禁对该 commit:
|
||||
|
||||
```text
|
||||
promotion-receipt-check: BLOCKED — infra_fail receipt freezes promotion (...); provide timed waiver or re-run nightly
|
||||
```
|
||||
|
||||
### N2–N6 — fixture 门禁
|
||||
|
||||
| 用例 | commit fixture | 实际 | 判定 |
|
||||
|------|----------------|------|------|
|
||||
| N2 PASS | `aaaa…` | `OK — PASS receipt` | PASS |
|
||||
| N3 product | `cccc…` | `BLOCKED — product_fail` | PASS |
|
||||
| N4 infra | `dddd…` | `BLOCKED — infra_fail … freeze` | PASS |
|
||||
| N5 waiver | `dddd…` + waiver→`eeee…` PASS | `OK — audited waiver … until 2099-01-01` | PASS |
|
||||
| N6 missing | `bbbb…` | `BLOCKED — missing promotion receipt` | PASS |
|
||||
|
||||
### N7 — 本机真实 suite(合入后墙钟跑)
|
||||
|
||||
- **测试输入**:`TEST_DATABASE_URL=…/agent_wave2_pi` + `RUNNER_AUTH_TOKEN` + `./scripts/run-nightly-real-pi.sh`(commit `67d73359fd13`)
|
||||
- **实际输出 (Actual Output)**(摘录):
|
||||
|
||||
```text
|
||||
=== RUN TestMultiIntentU8_RealPI_ConfirmGenerate_PG
|
||||
... PI run status=quality_failed want completed
|
||||
--- FAIL: TestMultiIntentU8_RealPI_ConfirmGenerate_PG (352.98s)
|
||||
=== RUN TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain
|
||||
✓ [1. activate] ... ✓ [2. full intake] ... ✓ [3. advance V0.1] ok
|
||||
```
|
||||
|
||||
- **评价判定 (Evaluation / Verdict)**:U8 段已出现**产品侧** `quality_failed`(非 secret/runner 不可达)。整包结束后脚本应落 `product_fail` receipt 并 `exit 1`——符合「产品失败拒绝晋升、不得写成 PASS」;full/none 段仍继续跑作对照。控制台:`assets/2026-09-16-wave2b-nightly-promotion-receipt/nightly-console.txt`
|
||||
- **性能与耗时**:U8 FAIL ≈ 353s;full/none 长链另行计时
|
||||
- **合入冒烟**:`go vet` PASS;洁净环境 `go test -short ./...` PASS;`/health` schema 47 ok
|
||||
- **最终 receipt**:`.doc/test-reports/assets/promotion-receipts/67d73359fd137422b19c0096be5aaea044c4ca16.json` → `verdict=product_fail`,`failure_class=product`,含 app/events/pi-agent ImageID;`promotion-receipt-check` 对该 commit **BLOCKED**(符合门禁)
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
合入冒烟(清污染环境变量):
|
||||
|
||||
```bash
|
||||
unset AGENT_TIMEOUT KB_DATABASE_URL KB_EMBEDDING_DIM
|
||||
go vet ./...
|
||||
go test -short ./...
|
||||
```
|
||||
|
||||
PR CI 不变;新增 nightly workflow 不进入 PR 路径。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- **结论**:Wave 2B 脚本门禁与 nightly 入口已交付;infra/product 分类与 waiver 链可审计;晋升钩子在无 PASS receipt 时非零退出。
|
||||
- **明确未完成**:compose 按 digest pull 的 **same-image** 晋升流水线仍未做 → FEATURE-MATRIX「Artifact 同 digest 晋升」保持 **partial**。
|
||||
- **后续**:配置 Actions `RUNNER_AUTH_TOKEN` + `NIGHTLY_TEST_DATABASE_URL`(或自托管 runner);Wave 3 候选(Playwright 双标签 / tier)。
|
||||
|
||||
## 证据路径
|
||||
|
||||
- Receipts / fixtures:`.doc/test-reports/assets/promotion-receipts/`
|
||||
- Short-term:`.doc/ops/short-term/2026-09-16-wave2b-nightly-promotion-receipt.md`
|
||||
@@ -0,0 +1,69 @@
|
||||
# Wave 2C:同 digest 镜像晋升测试报告
|
||||
|
||||
## 一、 测试背景 (Background)
|
||||
|
||||
Wave 2B 已交付 nightly + promotion receipt,但 test/main 仍可能 `docker compose up --build` 另造镜像。本轮收口 PU5B:候选 commit 一次构建(或等价 retag)、receipt 携带 digests、晋升 apply + pinned `--no-build`。
|
||||
|
||||
## 二、 测试目标 (Test Objectives)
|
||||
|
||||
- PASS receipt 含非空 `image_digests`(app/events/pi-agent)
|
||||
- `candidate-images-apply test` 后三服务 ImageID 与 receipt 一致
|
||||
- `--require-digests` 在缺 digest 时拒绝晋升
|
||||
- pinned 模式下 `env-service` 使用 `--no-build`
|
||||
|
||||
## 三、 测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
| 项 | 值 |
|
||||
|----|-----|
|
||||
| 分支 | `feature/wave2c-same-image-digest` |
|
||||
| 基线 commit | `7c808bdcfced…`(fixture 源) |
|
||||
| 脚本 | `candidate-images-{build,apply}.sh`、`promotion-receipt-{write,check}.sh`、`env-service.sh` |
|
||||
| Compose | `docker-compose.test.yml` / `main.yml` 支持 `APP_IMAGE` 等 |
|
||||
|
||||
## 四、 预期结果 (Expected Results)
|
||||
|
||||
- app/events 共用同一 candidate ID;pi-agent 独立 ID
|
||||
- apply 后 `shuimu-*-:test` ID 与 receipt 一致
|
||||
- 空 digests 的 PASS → check BLOCKED
|
||||
|
||||
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### C1 — require-digests PASS
|
||||
|
||||
- **Input**:images.json + `promotion-receipt-write --verdict pass` + `check --require-digests`
|
||||
- **Actual**:`OK — PASS receipt for 7c808bdcfced`
|
||||
- **Verdict**:PASS
|
||||
|
||||
### C2 — apply test ID 一致
|
||||
|
||||
- **Input**:`./scripts/candidate-images-apply.sh test --commit 7c808bd…`
|
||||
- **Actual**:
|
||||
|
||||
```text
|
||||
tagged shuimu-agent-app:test -> sha256:44c114af…
|
||||
tagged shuimu-agent-events:test -> sha256:44c114af… (same as app)
|
||||
tagged shuimu-pi-agent:test -> sha256:b8f9b525…
|
||||
app PASS / events PASS / pi-agent PASS
|
||||
```
|
||||
|
||||
- **Verdict**:PASS
|
||||
|
||||
### C3 — 缺 digests 负例
|
||||
|
||||
- **Input**:fixture `ffff…` PASS 且 digests 全 null + `--require-digests`
|
||||
- **Actual**:`BLOCKED — PASS receipt missing image_digests … app, events, pi-agent`
|
||||
- **Verdict**:PASS
|
||||
|
||||
## 六、 自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
合入冒烟(洁净环境):`go vet ./...`;`go test -short ./...`。
|
||||
|
||||
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- **结论**:单机 same-image digest pin + 晋升钩子已交付;FEATURE-MATRIX Artifact 可标 `done`(注明无远程 registry)。
|
||||
- **后续**:Phase 2 Wave3 go/no-go;Phase 3 N7 U8 / Playwright 等遗留。
|
||||
|
||||
## 证据
|
||||
|
||||
- `.doc/test-reports/assets/promotion-receipts/7c808bd….json` + `.images.json`
|
||||
- `configs/.env.test.images`(本地 pin,gitignore)
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"base": "http://127.0.0.1:8081",
|
||||
"project_id": 3,
|
||||
"overall": "PASS",
|
||||
"cases": [
|
||||
{
|
||||
"id": "health",
|
||||
"verdict": "PASS",
|
||||
"output": {
|
||||
"status": "ok",
|
||||
"env": "test",
|
||||
"agent_backend": "pi-agent",
|
||||
"version": "v1.0",
|
||||
"shared_kb_port": 5432,
|
||||
"database_ready": true,
|
||||
"schema_version": 47,
|
||||
"schema_ready": true,
|
||||
"task_store_ready": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "login",
|
||||
"verdict": "PASS",
|
||||
"output": {
|
||||
"admin_id": 4,
|
||||
"owner_id": 26,
|
||||
"reviewer_id": 27,
|
||||
"approver_id": 28
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "create_project",
|
||||
"verdict": "PASS",
|
||||
"http": 201,
|
||||
"output": {
|
||||
"project_id": 3,
|
||||
"snip": "{\"id\":3,\"code\":\"tst-052432\",\"name\":\"test晋升抽检-052432\",\"customer_name\":\"\",\"device_type\":\"超声软组织手术吸引设备\",\"intended_use\":\"test promote\",\"target_market\":\"中国 NMPA\",\"cur"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "save_plan",
|
||||
"verdict": "PASS",
|
||||
"http": 200,
|
||||
"output": {
|
||||
"snip": "{\"project_id\":3,\"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,\"stag"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "conflict_409",
|
||||
"verdict": "PASS",
|
||||
"http": 409,
|
||||
"output": {
|
||||
"business_code": "ERR_CONCURRENT_SWITCH"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "activate",
|
||||
"verdict": "PASS",
|
||||
"http": 200,
|
||||
"output": {
|
||||
"preview_http": 200,
|
||||
"snip": "{\"project_id\":3,\"lifecycle_status\":\"active\",\"active_workflow_key\":\"main\",\"instance\":{\"id\":1,\"project_id\":3,\"workflow_version_id\":1,\"instance_no\":1,\"status\":\"active\",\"config_revision\":1,\"plan_hash\":\"336eead79e6f4a567e58a1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "termination_preview",
|
||||
"verdict": "PASS",
|
||||
"http": 200,
|
||||
"output": {
|
||||
"instance_id": 1,
|
||||
"can_terminate": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
==> 切换至 test 分支并合并 dev 当前稳定节点...
|
||||
Switched to branch 'test'
|
||||
Auto-merging .doc/status/FEATURE-MATRIX.md
|
||||
CONFLICT (content): Merge conflict in .doc/status/FEATURE-MATRIX.md
|
||||
error: Merging is not possible because you have unmerged files.
|
||||
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
|
||||
hint: as appropriate to mark resolution and make a commit.
|
||||
fatal: Exiting because of an unresolved conflict.
|
||||
@@ -0,0 +1,4 @@
|
||||
[PASS] test app SPA /
|
||||
[PASS] test app deep link /projects
|
||||
[PASS] pi-agent /health
|
||||
[SUCCESS] test env smoke passed
|
||||
@@ -0,0 +1 @@
|
||||
{"env":"test","owner":"events-1","status":"ok"}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"ok": true,
|
||||
"service": "shuimu-pi-agent-runner",
|
||||
"endpoint_url": "https://api.minimaxi.com/v1",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"api": "openai-compatible",
|
||||
"has_token": true,
|
||||
"tavily": {
|
||||
"active": true,
|
||||
"keys_count": 2
|
||||
},
|
||||
"data_dir": "/app/data/workspaces",
|
||||
"uptime": 63.288472122
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"status":"ok","env":"test","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"database_ready":true,"schema_version":47,"schema_ready":true,"task_store_ready":true}
|
||||
@@ -0,0 +1,325 @@
|
||||
==> [test] 重建镜像并重建容器...
|
||||
Image shuimu-pi-agent:test Building
|
||||
Image agent-test-app Building
|
||||
#1 [internal] load local bake definitions
|
||||
#1 reading from stdin 993B done
|
||||
#1 DONE 0.0s
|
||||
|
||||
#2 [app internal] load build definition from Dockerfile
|
||||
#2 transferring dockerfile: 1.41kB done
|
||||
#2 DONE 0.0s
|
||||
|
||||
#3 [pi-agent internal] load build definition from Dockerfile
|
||||
#3 transferring dockerfile: 1.53kB done
|
||||
#3 DONE 0.0s
|
||||
|
||||
#4 [auth] library/node:pull token for docker.1ms.run
|
||||
#4 DONE 0.0s
|
||||
|
||||
#5 [app internal] load metadata for docker.io/library/debian:bookworm-slim
|
||||
#5 DONE 0.1s
|
||||
|
||||
#6 [auth] library/golang:pull token for docker.1ms.run
|
||||
#6 DONE 0.0s
|
||||
|
||||
#7 [pi-agent internal] load metadata for docker.io/library/node:22-bookworm-slim
|
||||
#7 ...
|
||||
|
||||
#8 [app internal] load metadata for docker.io/library/node:22-bookworm
|
||||
#8 DONE 0.4s
|
||||
|
||||
#7 [pi-agent internal] load metadata for docker.io/library/node:22-bookworm-slim
|
||||
#7 DONE 0.4s
|
||||
|
||||
#9 [pi-agent internal] load .dockerignore
|
||||
#9 transferring context: 234B done
|
||||
#9 DONE 0.0s
|
||||
|
||||
#10 [pi-agent 1/10] FROM docker.io/library/node:22-bookworm-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5
|
||||
#10 resolve docker.io/library/node:22-bookworm-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5 done
|
||||
#10 DONE 0.0s
|
||||
|
||||
#11 [pi-agent internal] load build context
|
||||
#11 transferring context: 19.43kB done
|
||||
#11 DONE 0.0s
|
||||
|
||||
#12 [pi-agent 7/10] COPY deploy/pi-agent/runner.mjs /app/runner.mjs
|
||||
#12 CACHED
|
||||
|
||||
#13 [pi-agent 4/10] RUN pi --version
|
||||
#13 CACHED
|
||||
|
||||
#14 [pi-agent 6/10] COPY deploy/pi-agent/extensions/ /app/extensions/
|
||||
#14 CACHED
|
||||
|
||||
#15 [pi-agent 3/10] RUN npm install -g @earendil-works/pi-coding-agent@0.85.1 --omit=dev
|
||||
#15 CACHED
|
||||
|
||||
#16 [pi-agent 9/10] COPY deploy/pi-agent/entrypoint.sh /app/entrypoint.sh
|
||||
#16 CACHED
|
||||
|
||||
#17 [pi-agent 8/10] COPY deploy/pi-agent/settle-policy.mjs /app/settle-policy.mjs
|
||||
#17 CACHED
|
||||
|
||||
#18 [pi-agent 2/10] RUN set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates curl git bash; rm -rf /var/lib/apt/lists/*
|
||||
#18 CACHED
|
||||
|
||||
#19 [pi-agent 5/10] WORKDIR /app
|
||||
#19 CACHED
|
||||
|
||||
#20 [pi-agent 10/10] RUN chmod +x /app/entrypoint.sh /app/runner.mjs
|
||||
#20 CACHED
|
||||
|
||||
#21 [pi-agent] exporting to image
|
||||
#21 exporting layers done
|
||||
#21 exporting manifest sha256:c303835b3e594bee402b18ebb8b4df7ecf32140630b175f6d0482a6864c5e07d done
|
||||
#21 exporting config sha256:16a09d2dc4d435fbbc17046d8a66f43b8d0d28720e72048d332deb76790f01d2 done
|
||||
#21 exporting attestation manifest sha256:b2fded5fcfb2248f89cca8ad838a7bac2f2280e641ad8609402d7907c04fcdb5 done
|
||||
#21 exporting manifest list sha256:9e45b992348a72523dbdcc8ca18184440d600393a754e78438ce8bc1d70c2fd2 done
|
||||
#21 naming to docker.io/library/shuimu-pi-agent:test done
|
||||
#21 unpacking to docker.io/library/shuimu-pi-agent:test 0.0s done
|
||||
#21 DONE 0.0s
|
||||
|
||||
#22 [pi-agent] resolving provenance for metadata file
|
||||
#22 DONE 0.0s
|
||||
|
||||
#23 [app internal] load metadata for docker.io/library/golang:1.23-bookworm
|
||||
#23 DONE 2.2s
|
||||
|
||||
#9 [app internal] load .dockerignore
|
||||
#9 CACHED
|
||||
|
||||
#24 [app stage-2 1/8] FROM docker.io/library/debian:bookworm-slim@sha256:88200866dfff7ea7f5cbcb6ec7c8a701889efe6fe859fe64d6990e4b07ea4171
|
||||
#24 resolve docker.io/library/debian:bookworm-slim@sha256:88200866dfff7ea7f5cbcb6ec7c8a701889efe6fe859fe64d6990e4b07ea4171 done
|
||||
#24 DONE 0.0s
|
||||
|
||||
#25 [app go-builder 1/6] FROM docker.io/library/golang:1.23-bookworm@sha256:167053a2bb901972bf2c1611f8f52c44d5fe7e762e5cab213708d82c421614db
|
||||
#25 resolve docker.io/library/golang:1.23-bookworm@sha256:167053a2bb901972bf2c1611f8f52c44d5fe7e762e5cab213708d82c421614db done
|
||||
#25 DONE 0.0s
|
||||
|
||||
#26 [app web-builder 1/6] FROM docker.io/library/node:22-bookworm@sha256:8a34c4ab3ea2c5cd194f07e317b2a8f09461d3c8b05c4e34c8ccd56d56024c4d
|
||||
#26 resolve docker.io/library/node:22-bookworm@sha256:8a34c4ab3ea2c5cd194f07e317b2a8f09461d3c8b05c4e34c8ccd56d56024c4d done
|
||||
#26 DONE 0.0s
|
||||
|
||||
#27 [app internal] load build context
|
||||
#27 transferring context: 147.64MB 0.7s done
|
||||
#27 DONE 0.7s
|
||||
|
||||
#28 [app go-builder 3/6] COPY go.mod go.sum ./
|
||||
#28 CACHED
|
||||
|
||||
#29 [app go-builder 2/6] WORKDIR /src
|
||||
#29 CACHED
|
||||
|
||||
#30 [app go-builder 4/6] RUN go mod download
|
||||
#30 CACHED
|
||||
|
||||
#31 [app web-builder 3/6] COPY web/package.json web/package-lock.json* ./
|
||||
#31 CACHED
|
||||
|
||||
#32 [app web-builder 2/6] WORKDIR /web
|
||||
#32 CACHED
|
||||
|
||||
#33 [app web-builder 4/6] RUN npm ci
|
||||
#33 CACHED
|
||||
|
||||
#34 [app web-builder 5/6] COPY web/ ./
|
||||
#34 DONE 0.1s
|
||||
|
||||
#35 [app go-builder 5/6] COPY . .
|
||||
#35 DONE 0.3s
|
||||
|
||||
#36 [app web-builder 6/6] RUN npm run build
|
||||
#36 0.167
|
||||
#36 0.167 > shuimu-workbench@1.0.0 build
|
||||
#36 0.167 > tsc && vite build
|
||||
#36 0.167
|
||||
#36 4.544 vite v7.3.6 building client environment for production...
|
||||
#36 4.580 transforming...
|
||||
#36 ...
|
||||
|
||||
#37 [app go-builder 6/6] RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /server ./cmd/server
|
||||
#37 DONE 6.2s
|
||||
|
||||
#36 [app web-builder 6/6] RUN npm run build
|
||||
#36 11.85 ✓ 4108 modules transformed.
|
||||
#36 12.42 rendering chunks...
|
||||
#36 12.94 computing gzip size...
|
||||
#36 13.04 dist/index.html 0.89 kB │ gzip: 0.52 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff 4.42 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 4.93 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 5.21 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 5.47 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff 5.98 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff 6.19 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size1-Regular-C195tn64.woff 6.50 kB
|
||||
#36 13.04 dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 6.91 kB
|
||||
#36 13.04 dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 6.91 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf 7.59 kB
|
||||
#36 13.04 dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff 7.66 kB
|
||||
#36 13.04 dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff 7.72 kB
|
||||
#36 13.04 dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 9.64 kB
|
||||
#36 13.04 dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 10.34 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf 10.36 kB
|
||||
#36 13.04 dist/assets/KaTeX_Script-Regular-D5yQViql.woff 10.59 kB
|
||||
#36 13.04 dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 11.32 kB
|
||||
#36 13.04 dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 11.35 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf 11.51 kB
|
||||
#36 13.04 dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 12.03 kB
|
||||
#36 13.04 dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 12.22 kB
|
||||
#36 13.04 dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf 12.23 kB
|
||||
#36 13.04 dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff 12.32 kB
|
||||
#36 13.04 dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf 12.34 kB
|
||||
#36 13.04 dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf 12.37 kB
|
||||
#36 13.04 dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff 13.21 kB
|
||||
#36 13.04 dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff 13.30 kB
|
||||
#36 13.04 dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 13.57 kB
|
||||
#36 13.04 dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff 14.11 kB
|
||||
#36 13.04 dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff 14.41 kB
|
||||
#36 13.04 dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff 16.03 kB
|
||||
#36 13.04 dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 16.40 kB
|
||||
#36 13.04 dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 16.44 kB
|
||||
#36 13.04 dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf 16.65 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 16.78 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 16.99 kB
|
||||
#36 13.04 dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff 18.67 kB
|
||||
#36 13.04 dist/assets/KaTeX_Math-Italic-DA0__PXp.woff 18.75 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff 19.41 kB
|
||||
#36 13.04 dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf 19.44 kB
|
||||
#36 13.04 dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf 19.57 kB
|
||||
#36 13.04 dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf 19.58 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-Italic-BMLOBm91.woff 19.68 kB
|
||||
#36 13.04 dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf 22.36 kB
|
||||
#36 13.04 dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf 24.50 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 25.32 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 26.27 kB
|
||||
#36 13.04 dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf 27.56 kB
|
||||
#36 13.04 dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 28.08 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff 29.91 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff 30.77 kB
|
||||
#36 13.04 dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf 31.20 kB
|
||||
#36 13.04 dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf 31.31 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf 32.97 kB
|
||||
#36 13.04 dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff 33.52 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf 33.58 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf 51.34 kB
|
||||
#36 13.04 dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf 53.58 kB
|
||||
#36 13.04 dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf 63.63 kB
|
||||
#36 13.04 dist/assets/index-DhpBfxvE.css 35.50 kB │ gzip: 9.76 kB
|
||||
#36 13.04 dist/assets/channel-BWcBR9m9.js 0.11 kB │ gzip: 0.12 kB
|
||||
#36 13.04 dist/assets/init-Gi6I4Gst.js 0.15 kB │ gzip: 0.13 kB
|
||||
#36 13.04 dist/assets/chunk-2Q5K7J3B-fvi-UXVX.js 0.19 kB │ gzip: 0.16 kB
|
||||
#36 13.04 dist/assets/chunk-JWPE2WC7-G9Xeymi4.js 0.22 kB │ gzip: 0.17 kB
|
||||
#36 13.04 dist/assets/chunk-XXDRQBXY-xL9d_pNj.js 0.22 kB │ gzip: 0.20 kB
|
||||
#36 13.04 dist/assets/chunk-5VM5RSS4-DPQCvrQZ.js 0.36 kB │ gzip: 0.27 kB
|
||||
#36 13.04 dist/assets/stateDiagram-v2-MP3YSRHH-BTyA19R_.js 0.39 kB │ gzip: 0.29 kB
|
||||
#36 13.04 dist/assets/classDiagram-ZZMXUADV-ju1dtYDK.js 0.43 kB │ gzip: 0.30 kB
|
||||
#36 13.04 dist/assets/classDiagram-v2-VYDZK3BY-ju1dtYDK.js 0.43 kB │ gzip: 0.30 kB
|
||||
#36 13.04 dist/assets/chunk-POPQ4Y6H-ohWCggfc.js 0.50 kB │ gzip: 0.35 kB
|
||||
#36 13.04 dist/assets/swimlanesDiagram-VR7AAH4N-CMd0mlZ_.js 0.51 kB │ gzip: 0.35 kB
|
||||
#36 13.04 dist/assets/infoDiagram-27XIBGKW-JCNs47kX.js 0.55 kB │ gzip: 0.38 kB
|
||||
#36 13.04 dist/assets/sizeCapture-INFHLROL-B5tX4lBk.js 0.90 kB │ gzip: 0.51 kB
|
||||
#36 13.04 dist/assets/ordinal-Cboi1Yqb.js 1.19 kB │ gzip: 0.57 kB
|
||||
#36 13.04 dist/assets/railroadDiagram-O6MQD6OU-DerDjLon.js 1.57 kB │ gzip: 0.73 kB
|
||||
#36 13.04 dist/assets/abnfDiagram-VCTEODGH-BqgLUvbA.js 1.77 kB │ gzip: 0.87 kB
|
||||
#36 13.04 dist/assets/chunk-F27PBJKO-DgJC4NP8.js 1.88 kB │ gzip: 0.83 kB
|
||||
#36 13.04 dist/assets/pegDiagram-XKGWAZYB-BSdBF8u3.js 1.92 kB │ gzip: 0.90 kB
|
||||
#36 13.04 dist/assets/ebnfDiagram-PWID7BFC-B1Vh2lZu.js 1.97 kB │ gzip: 0.86 kB
|
||||
#36 13.04 dist/assets/arc-Dg1z7rL4.js 3.43 kB │ gzip: 1.48 kB
|
||||
#36 13.04 dist/assets/diagram-Z3DM3KII-MMEbqEao.js 4.18 kB │ gzip: 1.82 kB
|
||||
#36 13.04 dist/assets/defaultLocale-DX6XiGOO.js 4.69 kB │ gzip: 2.18 kB
|
||||
#36 13.04 dist/assets/linear-IbVmzniw.js 5.65 kB │ gzip: 2.31 kB
|
||||
#36 13.04 dist/assets/diagram-UQ7AKVKN-DPZ7_mDB.js 6.04 kB │ gzip: 2.60 kB
|
||||
#36 13.04 dist/assets/pieDiagram-E7YTZNPT-2ngtcoaI.js 6.26 kB │ gzip: 2.60 kB
|
||||
#36 13.04 dist/assets/diagram-S7CK7UJ4-C7OEX6qE.js 8.18 kB │ gzip: 3.66 kB
|
||||
#36 13.04 dist/assets/cynefinDiagram-5FMLGOSQ-BQH9LwOp.js 10.06 kB │ gzip: 3.61 kB
|
||||
#36 13.04 dist/assets/stateDiagram-D77RDMKH-Dc0D62G4.js 10.33 kB │ gzip: 3.61 kB
|
||||
#36 13.04 dist/assets/dagre-GXQ25YYZ-wv3TCqIH.js 10.64 kB │ gzip: 4.01 kB
|
||||
#36 13.04 dist/assets/diagram-VSXAHHWV-u2vQ4soy.js 10.68 kB │ gzip: 4.11 kB
|
||||
#36 13.04 dist/assets/chunk-SVP7TREG-aEarUKZP.js 15.73 kB │ gzip: 4.41 kB
|
||||
#36 13.04 dist/assets/diagram-VX7I27RA-Cb7wTojJ.js 15.92 kB │ gzip: 5.68 kB
|
||||
#36 13.04 dist/assets/ishikawaDiagram-5VMMS53U-CznyBeyE.js 17.43 kB │ gzip: 6.62 kB
|
||||
#36 13.04 dist/assets/kanban-definition-UXKFOSKX-aT8ET1nQ.js 20.26 kB │ gzip: 7.18 kB
|
||||
#36 13.04 dist/assets/mindmap-definition-YA3MSWOX-_5EdLs8X.js 23.14 kB │ gzip: 7.80 kB
|
||||
#36 13.04 dist/assets/sankeyDiagram-P5KCCOFB-BM7tDQn_.js 23.16 kB │ gzip: 8.54 kB
|
||||
#36 13.04 dist/assets/journeyDiagram-3NMN7TZE-CedQ2jwu.js 23.54 kB │ gzip: 8.33 kB
|
||||
#36 13.04 dist/assets/wardleyDiagram-VM6X3IG4-D_YsZsg2.js 25.47 kB │ gzip: 6.77 kB
|
||||
#36 13.04 dist/assets/gitGraphDiagram-WWUBYQGX-GtfdtO4t.js 29.38 kB │ gzip: 8.68 kB
|
||||
#36 13.04 dist/assets/erDiagram-RLTQ6QDP-CGMTHkNL.js 30.76 kB │ gzip: 10.57 kB
|
||||
#36 13.04 dist/assets/timeline-definition-24CTP7MA-ogOAUlJu.js 30.79 kB │ gzip: 10.13 kB
|
||||
#36 13.04 dist/assets/requirementDiagram-BXWQKSXE-B-ETwSmf.js 30.97 kB │ gzip: 9.70 kB
|
||||
#36 13.04 dist/assets/quadrantDiagram-AXDQQJYC-DlAs_B1Z.js 33.98 kB │ gzip: 9.96 kB
|
||||
#36 13.04 dist/assets/layout-DWec3g51.js 35.43 kB │ gzip: 12.74 kB
|
||||
#36 13.04 dist/assets/chunk-IMKFNOWR-DHDwQtrv.js 38.07 kB │ gzip: 12.51 kB
|
||||
#36 13.04 dist/assets/blockDiagram-I7D4REHJ-BlCMDKFT.js 41.72 kB │ gzip: 13.56 kB
|
||||
#36 13.04 dist/assets/vennDiagram-4TSXK5OY-D_pXpwex.js 41.93 kB │ gzip: 15.67 kB
|
||||
#36 13.04 dist/assets/xychartDiagram-S5SC5T6Z-D2873Pm8.js 44.47 kB │ gzip: 12.58 kB
|
||||
#36 13.04 dist/assets/chunk-TICWLB2K-DuvmdDPq.js 49.17 kB │ gzip: 15.74 kB
|
||||
#36 13.04 dist/assets/flowDiagram-HODETNUW-BOtmA1VA.js 61.84 kB │ gzip: 19.87 kB
|
||||
#36 13.04 dist/assets/c4Diagram-7LVT6UL2-C_41Uupm.js 65.44 kB │ gzip: 18.77 kB
|
||||
#36 13.04 dist/assets/ganttDiagram-EL5Y4UJY-SPRaHc5m.js 69.66 kB │ gzip: 23.54 kB
|
||||
#36 13.04 dist/assets/cose-bilkent-JH36ORCC-BjP8KHon.js 81.66 kB │ gzip: 22.46 kB
|
||||
#36 13.04 dist/assets/swimlanes-42K2YHIH-BN7Q91pf.js 115.76 kB │ gzip: 42.49 kB
|
||||
#36 13.04 dist/assets/sequenceDiagram-WJ2MYXX4-DuMA_SHp.js 116.93 kB │ gzip: 31.11 kB
|
||||
#36 13.04 dist/assets/architectureDiagram-5GKGNRK7-CAfHi13y.js 151.79 kB │ gzip: 43.13 kB
|
||||
#36 13.04 dist/assets/katex-HP8lGamR.js 261.31 kB │ gzip: 77.57 kB
|
||||
#36 13.04 dist/assets/cytoscape.esm-BB4DxJjf.js 443.04 kB │ gzip: 141.98 kB
|
||||
#36 13.04 dist/assets/cynefin-OW5HDTMX-BfYiBAUJ.js 687.91 kB │ gzip: 154.14 kB
|
||||
#36 13.04 dist/assets/index-D0QTzO_j.js 5,736.12 kB │ gzip: 1,643.85 kB
|
||||
#36 13.04
|
||||
#36 13.04 (!) Some chunks are larger than 500 kB after minification. Consider:
|
||||
#36 13.04 - Using dynamic import() to code-split the application
|
||||
#36 13.04 - Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
|
||||
#36 13.04 - Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
|
||||
#36 13.04 ✓ built in 8.48s
|
||||
#36 DONE 13.2s
|
||||
|
||||
#38 [app stage-2 2/8] RUN set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates curl; rm -rf /var/lib/apt/lists/*
|
||||
#38 CACHED
|
||||
|
||||
#39 [app stage-2 6/8] COPY deploy/postgres/goose /app/deploy/postgres/goose
|
||||
#39 CACHED
|
||||
|
||||
#40 [app stage-2 7/8] COPY templates /app/templates
|
||||
#40 CACHED
|
||||
|
||||
#41 [app stage-2 3/8] WORKDIR /app
|
||||
#41 CACHED
|
||||
|
||||
#42 [app stage-2 4/8] COPY --from=go-builder /server /app/server
|
||||
#42 CACHED
|
||||
|
||||
#43 [app stage-2 5/8] COPY --from=web-builder /web/dist /app/web/dist
|
||||
#43 CACHED
|
||||
|
||||
#44 [app stage-2 8/8] COPY configs /app/configs
|
||||
#44 CACHED
|
||||
|
||||
#45 [app] exporting to image
|
||||
#45 exporting layers done
|
||||
#45 exporting manifest sha256:9fee6acf4f87174f86355426f3c7c451e0527b53266f1d013e28c40c75eeed1f done
|
||||
#45 exporting config sha256:cec2dbc9f1cae5d5095ffb2b86fc18a23aa4580be63d0caa1462cbc8cf332e26 done
|
||||
#45 exporting attestation manifest sha256:5a7218569febc6fb0974ffb97ead8475d3160b6bac700535e1ea14761c9efc0e done
|
||||
#45 exporting manifest list sha256:0a9249ac6dee61c36017ec5b65b9bad1f15f9409acdc0217a9a95618168f0d9f done
|
||||
#45 naming to docker.io/library/agent-test-app:latest done
|
||||
#45 unpacking to docker.io/library/agent-test-app:latest 0.1s done
|
||||
#45 DONE 0.1s
|
||||
|
||||
#46 [app] resolving provenance for metadata file
|
||||
#46 DONE 0.0s
|
||||
Image agent-test-app Built
|
||||
Image shuimu-pi-agent:test Built
|
||||
time="2026-09-16T05:19:20Z" level=warning msg="Found orphan containers (shuimu-agent-events-test) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up."
|
||||
Container shuimu-system-pg-test Running
|
||||
Container shuimu-cursor-agent-test Running
|
||||
Container shuimu-pi-agent-test Recreate
|
||||
Container shuimu-agent-app-test Recreate
|
||||
Container shuimu-agent-app-test Recreated
|
||||
Container shuimu-pi-agent-test Recreated
|
||||
Container shuimu-pi-agent-test Starting
|
||||
Container shuimu-system-pg-test Waiting
|
||||
Container shuimu-pi-agent-test Started
|
||||
Container shuimu-system-pg-test Healthy
|
||||
Container shuimu-agent-app-test Starting
|
||||
Container shuimu-agent-app-test Started
|
||||
==> [test] 镜像与容器已更新
|
||||
@@ -0,0 +1,250 @@
|
||||
==> [test] 重建镜像并重建容器...
|
||||
Image shuimu-pi-agent:test Building
|
||||
Image agent-test-app Building
|
||||
Image agent-test-events Building
|
||||
#1 [internal] load local bake definitions
|
||||
#1 reading from stdin 1.45kB done
|
||||
#1 DONE 0.0s
|
||||
|
||||
#2 [app internal] load build definition from Dockerfile
|
||||
#2 transferring dockerfile: 1.53kB done
|
||||
#2 DONE 0.0s
|
||||
|
||||
#3 [pi-agent internal] load build definition from Dockerfile
|
||||
#3 transferring dockerfile: 1.58kB done
|
||||
#3 DONE 0.0s
|
||||
|
||||
#4 [events internal] load metadata for docker.io/library/golang:1.23-bookworm
|
||||
#4 DONE 0.2s
|
||||
|
||||
#5 [app internal] load metadata for docker.io/library/node:22-bookworm
|
||||
#5 DONE 0.2s
|
||||
|
||||
#6 [pi-agent internal] load metadata for docker.io/library/node:22-bookworm-slim
|
||||
#6 DONE 0.2s
|
||||
|
||||
#7 [events internal] load metadata for docker.io/library/debian:bookworm-slim
|
||||
#7 DONE 0.2s
|
||||
|
||||
#8 [events internal] load .dockerignore
|
||||
#8 transferring context: 234B done
|
||||
#8 DONE 0.0s
|
||||
|
||||
#9 [pi-agent 1/11] FROM docker.io/library/node:22-bookworm-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5
|
||||
#9 resolve docker.io/library/node:22-bookworm-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5 done
|
||||
#9 DONE 0.0s
|
||||
|
||||
#10 [events go-builder 1/7] FROM docker.io/library/golang:1.23-bookworm@sha256:167053a2bb901972bf2c1611f8f52c44d5fe7e762e5cab213708d82c421614db
|
||||
#10 resolve docker.io/library/golang:1.23-bookworm@sha256:167053a2bb901972bf2c1611f8f52c44d5fe7e762e5cab213708d82c421614db done
|
||||
#10 DONE 0.0s
|
||||
|
||||
#11 [events stage-2 1/9] FROM docker.io/library/debian:bookworm-slim@sha256:88200866dfff7ea7f5cbcb6ec7c8a701889efe6fe859fe64d6990e4b07ea4171
|
||||
#11 resolve docker.io/library/debian:bookworm-slim@sha256:88200866dfff7ea7f5cbcb6ec7c8a701889efe6fe859fe64d6990e4b07ea4171 done
|
||||
#11 DONE 0.0s
|
||||
|
||||
#12 [app web-builder 1/6] FROM docker.io/library/node:22-bookworm@sha256:8a34c4ab3ea2c5cd194f07e317b2a8f09461d3c8b05c4e34c8ccd56d56024c4d
|
||||
#12 resolve docker.io/library/node:22-bookworm@sha256:8a34c4ab3ea2c5cd194f07e317b2a8f09461d3c8b05c4e34c8ccd56d56024c4d done
|
||||
#12 DONE 0.0s
|
||||
|
||||
#13 [app internal] load build context
|
||||
#13 ...
|
||||
|
||||
#14 [pi-agent internal] load build context
|
||||
#14 transferring context: 18.57kB 0.1s done
|
||||
#14 DONE 0.1s
|
||||
|
||||
#15 [pi-agent 9/11] COPY deploy/pi-agent/settle-policy.mjs /app/settle-policy.mjs
|
||||
#15 CACHED
|
||||
|
||||
#16 [pi-agent 3/11] RUN npm install -g @earendil-works/pi-coding-agent@0.85.1 --omit=dev
|
||||
#16 CACHED
|
||||
|
||||
#17 [pi-agent 8/11] COPY deploy/pi-agent/result-v1.mjs /app/result-v1.mjs
|
||||
#17 CACHED
|
||||
|
||||
#18 [pi-agent 4/11] RUN pi --version
|
||||
#18 CACHED
|
||||
|
||||
#19 [pi-agent 5/11] WORKDIR /app
|
||||
#19 CACHED
|
||||
|
||||
#20 [pi-agent 7/11] COPY deploy/pi-agent/runner.mjs /app/runner.mjs
|
||||
#20 CACHED
|
||||
|
||||
#21 [pi-agent 2/11] RUN set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates curl git bash; rm -rf /var/lib/apt/lists/*
|
||||
#21 CACHED
|
||||
|
||||
#22 [pi-agent 10/11] COPY deploy/pi-agent/entrypoint.sh /app/entrypoint.sh
|
||||
#22 CACHED
|
||||
|
||||
#23 [pi-agent 6/11] COPY deploy/pi-agent/extensions/ /app/extensions/
|
||||
#23 CACHED
|
||||
|
||||
#24 [pi-agent 11/11] RUN chmod +x /app/entrypoint.sh /app/runner.mjs
|
||||
#24 CACHED
|
||||
|
||||
#25 [pi-agent] exporting to image
|
||||
#25 exporting layers done
|
||||
#25 exporting manifest sha256:1565757be5855280b35ef7e3901496c75270397a465f7789201be925706df172 done
|
||||
#25 exporting config sha256:e52bdca1a5b6048f4ccb007889c7cfce3a61c45e006a093444fba756eb5108f0 done
|
||||
#25 exporting attestation manifest sha256:a1e1a5204c5a97ffb09f1b551de9279c66d27fc4772aa139db53d274ed483671 done
|
||||
#25 exporting manifest list sha256:96b07cfd10c20ffcdeec2c0a726ca9ca33d0416383c93a7274e66ad1740e581a done
|
||||
#25 naming to docker.io/library/shuimu-pi-agent:test done
|
||||
#25 unpacking to docker.io/library/shuimu-pi-agent:test done
|
||||
#25 DONE 0.0s
|
||||
|
||||
#26 [pi-agent] resolving provenance for metadata file
|
||||
#26 DONE 0.0s
|
||||
|
||||
#13 [app internal] load build context
|
||||
#13 ...
|
||||
|
||||
#27 [app go-builder 2/7] WORKDIR /src
|
||||
#27 CACHED
|
||||
|
||||
#28 [app go-builder 3/7] COPY go.mod go.sum ./
|
||||
#28 CACHED
|
||||
|
||||
#29 [app go-builder 4/7] RUN go mod download
|
||||
#29 CACHED
|
||||
|
||||
#13 [app internal] load build context
|
||||
#13 transferring context: 148.57MB 0.7s done
|
||||
#13 ...
|
||||
|
||||
#30 [app go-builder 5/7] COPY . .
|
||||
#30 DONE 0.3s
|
||||
|
||||
#31 [events go-builder 6/7] RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /server ./cmd/server
|
||||
#31 DONE 5.5s
|
||||
|
||||
#32 [app go-builder 7/7] RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /events ./cmd/events
|
||||
#32 DONE 0.5s
|
||||
|
||||
#13 [app internal] load build context
|
||||
#13 ...
|
||||
|
||||
#33 [events web-builder 3/6] COPY web/package.json web/package-lock.json* ./
|
||||
#33 CACHED
|
||||
|
||||
#34 [events web-builder 4/6] RUN npm ci
|
||||
#34 CACHED
|
||||
|
||||
#35 [events stage-2 3/9] WORKDIR /app
|
||||
#35 CACHED
|
||||
|
||||
#36 [events stage-2 4/9] COPY --from=go-builder /server /app/server
|
||||
#36 CACHED
|
||||
|
||||
#37 [events stage-2 5/9] COPY --from=go-builder /events /app/events
|
||||
#37 CACHED
|
||||
|
||||
#38 [events web-builder 6/6] RUN npm run build
|
||||
#38 CACHED
|
||||
|
||||
#39 [events stage-2 6/9] COPY --from=web-builder /web/dist /app/web/dist
|
||||
#39 CACHED
|
||||
|
||||
#40 [events stage-2 2/9] RUN set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates curl; rm -rf /var/lib/apt/lists/*
|
||||
#40 CACHED
|
||||
|
||||
#41 [events web-builder 2/6] WORKDIR /web
|
||||
#41 CACHED
|
||||
|
||||
#42 [events stage-2 7/9] COPY deploy/postgres/goose /app/deploy/postgres/goose
|
||||
#42 CACHED
|
||||
|
||||
#43 [events web-builder 5/6] COPY web/ ./
|
||||
#43 CACHED
|
||||
|
||||
#44 [events stage-2 8/9] COPY templates /app/templates
|
||||
#44 CACHED
|
||||
|
||||
#45 [events stage-2 9/9] COPY configs /app/configs
|
||||
#45 CACHED
|
||||
|
||||
#43 [app web-builder 5/6] COPY web/ ./
|
||||
#43 CACHED
|
||||
|
||||
#42 [app stage-2 7/9] COPY deploy/postgres/goose /app/deploy/postgres/goose
|
||||
#42 CACHED
|
||||
|
||||
#40 [app stage-2 2/9] RUN set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates curl; rm -rf /var/lib/apt/lists/*
|
||||
#40 CACHED
|
||||
|
||||
#35 [app stage-2 3/9] WORKDIR /app
|
||||
#35 CACHED
|
||||
|
||||
#38 [app web-builder 6/6] RUN npm run build
|
||||
#38 CACHED
|
||||
|
||||
#36 [app stage-2 4/9] COPY --from=go-builder /server /app/server
|
||||
#36 CACHED
|
||||
|
||||
#39 [app stage-2 6/9] COPY --from=web-builder /web/dist /app/web/dist
|
||||
#39 CACHED
|
||||
|
||||
#34 [app web-builder 4/6] RUN npm ci
|
||||
#34 CACHED
|
||||
|
||||
#37 [app stage-2 5/9] COPY --from=go-builder /events /app/events
|
||||
#37 CACHED
|
||||
|
||||
#44 [app stage-2 8/9] COPY templates /app/templates
|
||||
#44 CACHED
|
||||
|
||||
#33 [app web-builder 3/6] COPY web/package.json web/package-lock.json* ./
|
||||
#33 CACHED
|
||||
|
||||
#41 [app web-builder 2/6] WORKDIR /web
|
||||
#41 CACHED
|
||||
|
||||
#46 [events] exporting to image
|
||||
#46 exporting layers done
|
||||
#46 exporting manifest sha256:ae93691f063530a0ce8de4c2ca82c3d750496398024b713799b6207f47df4867 done
|
||||
#46 exporting config sha256:ca49ca76612131959a67a4e1cfccb4f66dada4c6274404032cf488809b741f28 done
|
||||
#46 exporting attestation manifest sha256:672e1217ad9a66e1e89b0c54567fe96e54a791df8a41ca25339007d90390bcb6 done
|
||||
#46 exporting manifest list sha256:28b7e83c01bf8f7eb6f24e054290b011421f12faff41f50e7565348b00d9a06b done
|
||||
#46 naming to docker.io/library/agent-test-events:latest done
|
||||
#46 unpacking to docker.io/library/agent-test-events:latest done
|
||||
#46 DONE 0.0s
|
||||
|
||||
#47 [app] exporting to image
|
||||
#47 exporting layers done
|
||||
#47 exporting manifest sha256:4c20923bc49e4dbe4d3c55adb7f2a630bc7df8039f41ab455d8418f5e1b24502 done
|
||||
#47 exporting config sha256:0f894fb409f1c1c159d807d33729d2624bbf2df33247a0b9748b9520135e069d done
|
||||
#47 exporting attestation manifest sha256:d5909ff63a4418100627bbeab97b259565d046ed8cd2337ec9080fc6bd52e003 done
|
||||
#47 exporting manifest list sha256:4d76b7bdea5bd87994ebfa0d87a0c4f8b3e57a0777d04441e3210246ad96f29b done
|
||||
#47 naming to docker.io/library/agent-test-app:latest done
|
||||
#47 unpacking to docker.io/library/agent-test-app:latest done
|
||||
#47 DONE 0.0s
|
||||
|
||||
#48 [events] resolving provenance for metadata file
|
||||
#48 DONE 0.0s
|
||||
|
||||
#49 [app] resolving provenance for metadata file
|
||||
#49 DONE 0.0s
|
||||
|
||||
#13 [app internal] load build context
|
||||
Image agent-test-events Built
|
||||
Image shuimu-pi-agent:test Built
|
||||
Image agent-test-app Built
|
||||
Container shuimu-system-pg-test Running
|
||||
Container shuimu-cursor-agent-test Running
|
||||
Container shuimu-pi-agent-test Recreate
|
||||
Container shuimu-agent-events-test Recreate
|
||||
Container shuimu-agent-app-test Recreate
|
||||
Container shuimu-agent-app-test Recreated
|
||||
Container shuimu-agent-events-test Recreated
|
||||
Container shuimu-pi-agent-test Recreated
|
||||
Container shuimu-pi-agent-test Starting
|
||||
Container shuimu-system-pg-test Waiting
|
||||
Container shuimu-system-pg-test Waiting
|
||||
Container shuimu-pi-agent-test Started
|
||||
Container shuimu-system-pg-test Healthy
|
||||
Container shuimu-agent-app-test Starting
|
||||
Container shuimu-system-pg-test Healthy
|
||||
Container shuimu-agent-events-test Starting
|
||||
Container shuimu-agent-app-test Started
|
||||
Container shuimu-agent-events-test Started
|
||||
==> [test] 镜像与容器已更新
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
ok chat-agent-system/internal/auth 0.993s
|
||||
ok chat-agent-system/internal/app 0.016s
|
||||
ok chat-agent-system/internal/bizdev 0.136s
|
||||
ok chat-agent-system/internal/server 10.771s
|
||||
+1
@@ -0,0 +1 @@
|
||||
ok chat-agent-system/internal/server 357.605s
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
ok chat-agent-system/internal/taskrun 1.455s
|
||||
ok chat-agent-system/internal/server 239.214s
|
||||
ok chat-agent-system/internal/auth 20.428s
|
||||
@@ -0,0 +1,16 @@
|
||||
=== RUN TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain
|
||||
2026/09/16 10:27:14 goose: no migrations to run. current version: 47
|
||||
2026/09/16 10:27:14 goose: no migrations to run. current version: 47
|
||||
workflow_governance_full_none_piagent_pg_test.go:147: ✓ [1. activate] instance=6 full=intake none=research(disabled until stage)
|
||||
workflow_governance_full_none_piagent_pg_test.go:201: ✓ pi-agent intake doc=doc_proj6016_intake elapsed=3m17s
|
||||
workflow_governance_full_none_piagent_pg_test.go:216: ✓ [2. full intake] cross-user approve complete
|
||||
workflow_governance_full_none_piagent_pg_test.go:228: ✓ [3. advance V0.1] ok
|
||||
{"time":"2026-09-16T10:30:31.406184808Z","level":"INFO","msg":"[kb-retriever] embed failed: http 401 Unauthorized: 无效的令牌 (request id: 20260916103030837768242c14228f5YPT2AEZQ) (batch=1 est_tokens≈14)"}
|
||||
workflow_governance_full_none_piagent_pg_test.go:230: ✓ pi-agent research doc=doc_proj6016_research elapsed=10m22s
|
||||
workflow_governance_full_none_piagent_pg_test.go:249: ✓ [4. none research] generate ok; submit-review denied HTTP 403
|
||||
workflow_governance_full_none_piagent_pg_test.go:278: ✓ [5. readiness] none does not block
|
||||
workflow_governance_full_none_piagent_pg_test.go:304: ✓ [6. advance V0.5] none non-blocking PASS
|
||||
workflow_governance_full_none_piagent_pg_test.go:314: ✓ [7. refresh] settings still readable
|
||||
--- PASS: TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain (818.64s)
|
||||
PASS
|
||||
ok chat-agent-system/internal/server 818.645s
|
||||
@@ -0,0 +1,13 @@
|
||||
=== RUN TestMultiIntentU8_RealPI_ConfirmGenerate_PG
|
||||
2026/09/16 10:23:52 goose: no migrations to run. current version: 47
|
||||
2026/09/16 10:23:52 goose: no migrations to run. current version: 47
|
||||
multi_intent_u8_piagent_pg_test.go:228: ✓ [1. awaiting] plan_id=pln_79d640abce7c0f2ecf8c3726d28206a9 revision=1 starts=0
|
||||
{"time":"2026-09-16T10:27:03.596012876Z","level":"INFO","msg":"taskrun_status_transition","run_id":"run_1789554232489934117","status":"completed","workspace_id":"/home/weichen/projects/Agent-System/data/dev/workspaces/bizdev/intake_1789554232498567790","error":""}
|
||||
multi_intent_u8_piagent_pg_test.go:268: ✓ [2. real PI generate] run_id=run_1789554232489934117 status=completed elapsed=3m11s
|
||||
multi_intent_u8_piagent_pg_test.go:277: ✓ [3. idempotent replay] starts still 1
|
||||
multi_intent_u8_piagent_pg_test.go:287: ✓ [4. revoke] TaskRunAdapter denied
|
||||
multi_intent_u8_piagent_pg_test.go:310: ✓ [5. PG restart recovery] plan_id=pln_79d640abce7c0f2ecf8c3726d28206a9 status=executing
|
||||
multi_intent_u8_piagent_pg_test.go:321: ✓ [6. HTTP refresh] GET plan 486 bytes
|
||||
--- PASS: TestMultiIntentU8_RealPI_ConfirmGenerate_PG (191.34s)
|
||||
PASS
|
||||
ok chat-agent-system/internal/server 191.352s
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
==> nightly real-PI suite commit=67d73359fd13 runner=http://127.0.0.1:18865
|
||||
=== RUN TestMultiIntentU8_RealPI_ConfirmGenerate_PG
|
||||
2026/09/16 14:02:33 goose: no migrations to run. current version: 47
|
||||
2026/09/16 14:02:33 goose: no migrations to run. current version: 47
|
||||
2026/09/16 14:02:33 [kb] 无法连接到 PostgreSQL 知识库 (postgres://regkb:shared_kb_secret_pass@shuimu-kb-shared:5432/regulations?sslmode=disable): failed to connect to `user=regkb database=regulations`: 198.18.0.100:5432 (shuimu-kb-shared): failed to receive message: unexpected EOF, 将降级运行在离线模式
|
||||
{"time":"2026-09-16T14:02:33.628512914Z","level":"INFO","msg":"taskrun_orphans_marked_interrupted","count":1}
|
||||
multi_intent_u8_piagent_pg_test.go:228: ✓ [1. awaiting] plan_id=pln_32041689e1f4258fc8b7d492a3360198 revision=1 starts=0
|
||||
{"time":"2026-09-16T14:08:26.513003368Z","level":"INFO","msg":"taskrun_status_transition","run_id":"run_1789567353839978574","status":"quality_failed","workspace_id":"data/test/workspaces/bizdev/intake_1789567353851980348","error":""}
|
||||
multi_intent_u8_piagent_pg_test.go:266: PI run status=quality_failed want completed
|
||||
--- FAIL: TestMultiIntentU8_RealPI_ConfirmGenerate_PG (352.98s)
|
||||
=== RUN TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain
|
||||
{"time":"2026-09-16T14:08:26.524142457Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"}
|
||||
{"time":"2026-09-16T14:08:26.534944856Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"}
|
||||
{"time":"2026-09-16T14:08:26.539895189Z","level":"INFO","msg":"[kb] 无法连接到 PostgreSQL 知识库 (postgres://regkb:shared_kb_secret_pass@shuimu-kb-shared:5432/regulations?sslmode=disable): failed to connect to `user=regkb database=regulations`: 198.18.0.100:5432 (shuimu-kb-shared): failed to receive message: unexpected EOF, 将降级运行在离线模式"}
|
||||
{"time":"2026-09-16T14:08:26.603109332Z","level":"INFO","msg":"taskrun_orphans_marked_interrupted","count":1}
|
||||
workflow_governance_full_none_piagent_pg_test.go:147: ✓ [1. activate] instance=16 full=intake none=research(disabled until stage)
|
||||
workflow_governance_full_none_piagent_pg_test.go:201: ✓ pi-agent intake doc=doc_proj6037_intake elapsed=6m31s
|
||||
workflow_governance_full_none_piagent_pg_test.go:216: ✓ [2. full intake] cross-user approve complete
|
||||
workflow_governance_full_none_piagent_pg_test.go:228: ✓ [3. advance V0.1] ok
|
||||
EXIT:1
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
==> nightly real-PI suite commit=67d73359fd13 runner=http://127.0.0.1:18865
|
||||
=== RUN TestMultiIntentU8_RealPI_ConfirmGenerate_PG
|
||||
2026/09/16 14:02:33 goose: no migrations to run. current version: 47
|
||||
2026/09/16 14:02:33 goose: no migrations to run. current version: 47
|
||||
2026/09/16 14:02:33 [kb] 无法连接到 PostgreSQL 知识库 (postgres://regkb:shared_kb_secret_pass@shuimu-kb-shared:5432/regulations?sslmode=disable): failed to connect to `user=regkb database=regulations`: 198.18.0.100:5432 (shuimu-kb-shared): failed to receive message: unexpected EOF, 将降级运行在离线模式
|
||||
{"time":"2026-09-16T14:02:33.628512914Z","level":"INFO","msg":"taskrun_orphans_marked_interrupted","count":1}
|
||||
multi_intent_u8_piagent_pg_test.go:228: ✓ [1. awaiting] plan_id=pln_32041689e1f4258fc8b7d492a3360198 revision=1 starts=0
|
||||
{"time":"2026-09-16T14:08:26.513003368Z","level":"INFO","msg":"taskrun_status_transition","run_id":"run_1789567353839978574","status":"quality_failed","workspace_id":"data/test/workspaces/bizdev/intake_1789567353851980348","error":""}
|
||||
multi_intent_u8_piagent_pg_test.go:266: PI run status=quality_failed want completed
|
||||
--- FAIL: TestMultiIntentU8_RealPI_ConfirmGenerate_PG (352.98s)
|
||||
=== RUN TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain
|
||||
{"time":"2026-09-16T14:08:26.524142457Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"}
|
||||
{"time":"2026-09-16T14:08:26.534944856Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"}
|
||||
{"time":"2026-09-16T14:08:26.539895189Z","level":"INFO","msg":"[kb] 无法连接到 PostgreSQL 知识库 (postgres://regkb:shared_kb_secret_pass@shuimu-kb-shared:5432/regulations?sslmode=disable): failed to connect to `user=regkb database=regulations`: 198.18.0.100:5432 (shuimu-kb-shared): failed to receive message: unexpected EOF, 将降级运行在离线模式"}
|
||||
{"time":"2026-09-16T14:08:26.603109332Z","level":"INFO","msg":"taskrun_orphans_marked_interrupted","count":1}
|
||||
workflow_governance_full_none_piagent_pg_test.go:147: ✓ [1. activate] instance=16 full=intake none=research(disabled until stage)
|
||||
workflow_governance_full_none_piagent_pg_test.go:201: ✓ pi-agent intake doc=doc_proj6037_intake elapsed=6m31s
|
||||
workflow_governance_full_none_piagent_pg_test.go:216: ✓ [2. full intake] cross-user approve complete
|
||||
workflow_governance_full_none_piagent_pg_test.go:228: ✓ [3. advance V0.1] ok
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
==> nightly real-PI suite commit=67d73359fd13 runner=http://127.0.0.1:18865
|
||||
=== RUN TestMultiIntentU8_RealPI_ConfirmGenerate_PG
|
||||
2026/09/16 14:02:33 goose: no migrations to run. current version: 47
|
||||
2026/09/16 14:02:33 goose: no migrations to run. current version: 47
|
||||
2026/09/16 14:02:33 [kb] 无法连接到 PostgreSQL 知识库 (postgres://regkb:shared_kb_secret_pass@shuimu-kb-shared:5432/regulations?sslmode=disable): failed to connect to `user=regkb database=regulations`: 198.18.0.100:5432 (shuimu-kb-shared): failed to receive message: unexpected EOF, 将降级运行在离线模式
|
||||
{"time":"2026-09-16T14:02:33.628512914Z","level":"INFO","msg":"taskrun_orphans_marked_interrupted","count":1}
|
||||
multi_intent_u8_piagent_pg_test.go:228: ✓ [1. awaiting] plan_id=pln_32041689e1f4258fc8b7d492a3360198 revision=1 starts=0
|
||||
{"time":"2026-09-16T14:08:26.513003368Z","level":"INFO","msg":"taskrun_status_transition","run_id":"run_1789567353839978574","status":"quality_failed","workspace_id":"data/test/workspaces/bizdev/intake_1789567353851980348","error":""}
|
||||
multi_intent_u8_piagent_pg_test.go:266: PI run status=quality_failed want completed
|
||||
--- FAIL: TestMultiIntentU8_RealPI_ConfirmGenerate_PG (352.98s)
|
||||
=== RUN TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain
|
||||
{"time":"2026-09-16T14:08:26.524142457Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"}
|
||||
{"time":"2026-09-16T14:08:26.534944856Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"}
|
||||
{"time":"2026-09-16T14:08:26.539895189Z","level":"INFO","msg":"[kb] 无法连接到 PostgreSQL 知识库 (postgres://regkb:shared_kb_secret_pass@shuimu-kb-shared:5432/regulations?sslmode=disable): failed to connect to `user=regkb database=regulations`: 198.18.0.100:5432 (shuimu-kb-shared): failed to receive message: unexpected EOF, 将降级运行在离线模式"}
|
||||
{"time":"2026-09-16T14:08:26.603109332Z","level":"INFO","msg":"taskrun_orphans_marked_interrupted","count":1}
|
||||
workflow_governance_full_none_piagent_pg_test.go:147: ✓ [1. activate] instance=16 full=intake none=research(disabled until stage)
|
||||
workflow_governance_full_none_piagent_pg_test.go:201: ✓ pi-agent intake doc=doc_proj6037_intake elapsed=6m31s
|
||||
workflow_governance_full_none_piagent_pg_test.go:216: ✓ [2. full intake] cross-user approve complete
|
||||
workflow_governance_full_none_piagent_pg_test.go:228: ✓ [3. advance V0.1] ok
|
||||
EXIT:1
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"verdict": "product_fail",
|
||||
"commit": "67d73359fd137422b19c0096be5aaea044c4ca16",
|
||||
"recorded_at": "2026-09-16T14:33:49Z",
|
||||
"runner_url": "http://127.0.0.1:18865",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"protocol": "typed-result-v1",
|
||||
"image_digests": {
|
||||
"app": "71154c9458c2c453c52ea7bebbca9faa2e2bde74356506644ed29e4546bc158f",
|
||||
"events": "425483f6d1fa24c450b2d7058059081b124ff04a7f68bf2cc5215b1b81eafcbf",
|
||||
"pi-agent": "6c146efd371156a79cc5ca998044b449f846550cb0103fd54c2a8d0b58fbf565"
|
||||
},
|
||||
"suite": "nightly-real-pi-u8-fullnone",
|
||||
"failure_class": "product",
|
||||
"evidence_refs": [
|
||||
"/home/weichen/projects/Agent-System/.doc/test-reports/assets/promotion-receipts/evidence-67d73359fd13-20260916T140233Z/go-test.txt"
|
||||
]
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"commit": "7c808bdcfced14febafe33f72ae14232d938f7e5",
|
||||
"recorded_at": "2026-09-16T14:43:48Z",
|
||||
"tags": {
|
||||
"app": "shuimu-agent-app:candidate-7c808bdcfced",
|
||||
"events": "shuimu-agent-events:candidate-7c808bdcfced",
|
||||
"pi-agent": "shuimu-pi-agent:candidate-7c808bdcfced"
|
||||
},
|
||||
"image_ids": {
|
||||
"app": "sha256:44c114af4032bafe26a90adca718cd3a343d4c34fbb0f569290fd0f24ec412db",
|
||||
"events": "sha256:44c114af4032bafe26a90adca718cd3a343d4c34fbb0f569290fd0f24ec412db",
|
||||
"pi-agent": "sha256:b8f9b5255b212ad95da0fefc13fad66b755bbfb2d9b2f8d2da8e96dccf77f814"
|
||||
},
|
||||
"image_digests": {
|
||||
"app": "sha256:44c114af4032bafe26a90adca718cd3a343d4c34fbb0f569290fd0f24ec412db",
|
||||
"events": "sha256:44c114af4032bafe26a90adca718cd3a343d4c34fbb0f569290fd0f24ec412db",
|
||||
"pi-agent": "sha256:b8f9b5255b212ad95da0fefc13fad66b755bbfb2d9b2f8d2da8e96dccf77f814"
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"verdict": "pass",
|
||||
"commit": "7c808bdcfced14febafe33f72ae14232d938f7e5",
|
||||
"recorded_at": "2026-09-16T14:43:49Z",
|
||||
"runner_url": "http://127.0.0.1:18865",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"protocol": "typed-result-v1",
|
||||
"image_digests": {
|
||||
"app": "sha256:44c114af4032bafe26a90adca718cd3a343d4c34fbb0f569290fd0f24ec412db",
|
||||
"events": "sha256:44c114af4032bafe26a90adca718cd3a343d4c34fbb0f569290fd0f24ec412db",
|
||||
"pi-agent": "sha256:b8f9b5255b212ad95da0fefc13fad66b755bbfb2d9b2f8d2da8e96dccf77f814"
|
||||
},
|
||||
"suite": "wave2c-fixture",
|
||||
"failure_class": "none",
|
||||
"evidence_refs": [
|
||||
".doc/test-reports/assets/promotion-receipts/.gitkeep"
|
||||
]
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"verdict": "infra_fail",
|
||||
"commit": "82780222373de1ded853e3fe5a8f2208133bc7c7",
|
||||
"recorded_at": "2026-09-16T13:59:52Z",
|
||||
"runner_url": "http://127.0.0.1:18865",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"protocol": "typed-result-v1",
|
||||
"image_digests": {
|
||||
"app": "71154c9458c2c453c52ea7bebbca9faa2e2bde74356506644ed29e4546bc158f",
|
||||
"events": "425483f6d1fa24c450b2d7058059081b124ff04a7f68bf2cc5215b1b81eafcbf",
|
||||
"pi-agent": "6c146efd371156a79cc5ca998044b449f846550cb0103fd54c2a8d0b58fbf565"
|
||||
},
|
||||
"suite": "nightly-real-pi-u8-fullnone",
|
||||
"failure_class": "infra",
|
||||
"evidence_refs": [
|
||||
"/home/weichen/projects/Agent-System/.doc/test-reports/assets/promotion-receipts/evidence-82780222373d-20260916T135951Z/infra-forced.txt"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
# Promotion receipts
|
||||
|
||||
Immutable JSON receipts written by `scripts/promotion-receipt-write.sh` and
|
||||
validated by `scripts/promotion-receipt-check.sh` before `promote-to-test` /
|
||||
`release-to-main`.
|
||||
|
||||
## Layout
|
||||
|
||||
- `<full-sha>.json` — receipt (`verdict`: pass | product_fail | infra_fail)
|
||||
- `<full-sha>.waiver.json` — timed audited exemption binding a PASS receipt
|
||||
- `evidence-<short>-<stamp>/` — desensitized logs from nightly runs
|
||||
- Fixture SHAs (`aaaa…`, `cccc…`, `dddd…`, `eeee…`) — gate unit demos only
|
||||
|
||||
## Policy
|
||||
|
||||
- Do not delete historical receipts; overwrite only with `--force` for local fixtures.
|
||||
- `product_fail` always blocks promotion (waiver cannot override).
|
||||
- `infra_fail` blocks unless a non-expired waiver with owner/reason binds a PASS receipt.
|
||||
- Same-image digest promotion is **not** claimed complete in Wave 2B; digests are recorded for traceability only.
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"verdict": "pass",
|
||||
"commit": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"recorded_at": "2026-09-16T13:59:51Z",
|
||||
"runner_url": "http://127.0.0.1:18865",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"protocol": "typed-result-v1",
|
||||
"image_digests": {
|
||||
"app": "71154c9458c2c453c52ea7bebbca9faa2e2bde74356506644ed29e4546bc158f",
|
||||
"events": "425483f6d1fa24c450b2d7058059081b124ff04a7f68bf2cc5215b1b81eafcbf",
|
||||
"pi-agent": "6c146efd371156a79cc5ca998044b449f846550cb0103fd54c2a8d0b58fbf565"
|
||||
},
|
||||
"suite": "fixture",
|
||||
"failure_class": "none",
|
||||
"evidence_refs": [
|
||||
".doc/test-reports/assets/promotion-receipts/.gitkeep"
|
||||
]
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"verdict": "product_fail",
|
||||
"commit": "cccccccccccccccccccccccccccccccccccccccc",
|
||||
"recorded_at": "2026-09-16T13:59:51Z",
|
||||
"runner_url": "http://127.0.0.1:18865",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"protocol": "typed-result-v1",
|
||||
"image_digests": {
|
||||
"app": "71154c9458c2c453c52ea7bebbca9faa2e2bde74356506644ed29e4546bc158f",
|
||||
"events": "425483f6d1fa24c450b2d7058059081b124ff04a7f68bf2cc5215b1b81eafcbf",
|
||||
"pi-agent": "6c146efd371156a79cc5ca998044b449f846550cb0103fd54c2a8d0b58fbf565"
|
||||
},
|
||||
"suite": "fixture",
|
||||
"failure_class": "product",
|
||||
"evidence_refs": []
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"verdict": "infra_fail",
|
||||
"commit": "dddddddddddddddddddddddddddddddddddddddd",
|
||||
"recorded_at": "2026-09-16T13:59:51Z",
|
||||
"runner_url": "http://127.0.0.1:18865",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"protocol": "typed-result-v1",
|
||||
"image_digests": {
|
||||
"app": "71154c9458c2c453c52ea7bebbca9faa2e2bde74356506644ed29e4546bc158f",
|
||||
"events": "425483f6d1fa24c450b2d7058059081b124ff04a7f68bf2cc5215b1b81eafcbf",
|
||||
"pi-agent": "6c146efd371156a79cc5ca998044b449f846550cb0103fd54c2a8d0b58fbf565"
|
||||
},
|
||||
"suite": "fixture",
|
||||
"failure_class": "infra",
|
||||
"evidence_refs": []
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"commit": "dddddddddddddddddddddddddddddddddddddddd",
|
||||
"owner": "release-owner@local",
|
||||
"reason": "external runner outage confirmed; last PASS still valid",
|
||||
"expires_at": "2099-01-01T00:00:00Z",
|
||||
"binds_receipt": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"verdict": "pass",
|
||||
"commit": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
||||
"recorded_at": "2026-09-16T13:59:51Z",
|
||||
"runner_url": "http://127.0.0.1:18865",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"protocol": "typed-result-v1",
|
||||
"image_digests": {
|
||||
"app": "71154c9458c2c453c52ea7bebbca9faa2e2bde74356506644ed29e4546bc158f",
|
||||
"events": "425483f6d1fa24c450b2d7058059081b124ff04a7f68bf2cc5215b1b81eafcbf",
|
||||
"pi-agent": "6c146efd371156a79cc5ca998044b449f846550cb0103fd54c2a8d0b58fbf565"
|
||||
},
|
||||
"suite": "fixture",
|
||||
"failure_class": "none",
|
||||
"evidence_refs": []
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
=== RUN TestMultiIntentU8_RealPI_ConfirmGenerate_PG
|
||||
2026/09/16 14:02:33 goose: no migrations to run. current version: 47
|
||||
2026/09/16 14:02:33 goose: no migrations to run. current version: 47
|
||||
2026/09/16 14:02:33 [kb] 无法连接到 PostgreSQL 知识库 (postgres://regkb:shared_kb_secret_pass@shuimu-kb-shared:5432/regulations?sslmode=disable): failed to connect to `user=regkb database=regulations`: 198.18.0.100:5432 (shuimu-kb-shared): failed to receive message: unexpected EOF, 将降级运行在离线模式
|
||||
{"time":"2026-09-16T14:02:33.628512914Z","level":"INFO","msg":"taskrun_orphans_marked_interrupted","count":1}
|
||||
multi_intent_u8_piagent_pg_test.go:228: ✓ [1. awaiting] plan_id=pln_32041689e1f4258fc8b7d492a3360198 revision=1 starts=0
|
||||
{"time":"2026-09-16T14:08:26.513003368Z","level":"INFO","msg":"taskrun_status_transition","run_id":"run_1789567353839978574","status":"quality_failed","workspace_id":"data/test/workspaces/bizdev/intake_1789567353851980348","error":""}
|
||||
multi_intent_u8_piagent_pg_test.go:266: PI run status=quality_failed want completed
|
||||
--- FAIL: TestMultiIntentU8_RealPI_ConfirmGenerate_PG (352.98s)
|
||||
=== RUN TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain
|
||||
{"time":"2026-09-16T14:08:26.524142457Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"}
|
||||
{"time":"2026-09-16T14:08:26.534944856Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"}
|
||||
{"time":"2026-09-16T14:08:26.539895189Z","level":"INFO","msg":"[kb] 无法连接到 PostgreSQL 知识库 (postgres://regkb:shared_kb_secret_pass@shuimu-kb-shared:5432/regulations?sslmode=disable): failed to connect to `user=regkb database=regulations`: 198.18.0.100:5432 (shuimu-kb-shared): failed to receive message: unexpected EOF, 将降级运行在离线模式"}
|
||||
{"time":"2026-09-16T14:08:26.603109332Z","level":"INFO","msg":"taskrun_orphans_marked_interrupted","count":1}
|
||||
workflow_governance_full_none_piagent_pg_test.go:147: ✓ [1. activate] instance=16 full=intake none=research(disabled until stage)
|
||||
workflow_governance_full_none_piagent_pg_test.go:201: ✓ pi-agent intake doc=doc_proj6037_intake elapsed=6m31s
|
||||
workflow_governance_full_none_piagent_pg_test.go:216: ✓ [2. full intake] cross-user approve complete
|
||||
workflow_governance_full_none_piagent_pg_test.go:228: ✓ [3. advance V0.1] ok
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"ok": true,
|
||||
"service": "shuimu-pi-agent-runner",
|
||||
"endpoint_url": "https://api.minimaxi.com/v1",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"api": "openai-compatible",
|
||||
"has_token": true,
|
||||
"tavily": {
|
||||
"active": true,
|
||||
"keys_count": 2
|
||||
},
|
||||
"data_dir": "/app/data/workspaces",
|
||||
"uptime": 38034.707339415
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
forced infra failure (--dry-infra-fail)
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"verdict": "pass",
|
||||
"commit": "ffffffffffffffffffffffffffffffffffffffff",
|
||||
"recorded_at": "2026-09-16T00:00:00Z",
|
||||
"runner_url": "x",
|
||||
"model_id": "x",
|
||||
"protocol": "x",
|
||||
"image_digests": {
|
||||
"app": null,
|
||||
"events": null,
|
||||
"pi-agent": null
|
||||
},
|
||||
"suite": "neg",
|
||||
"failure_class": "none",
|
||||
"evidence_refs": []
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
# Nightly real PI regression (Wave 2B / PU5B).
|
||||
# PR CI (ci.yml) intentionally does NOT run real PI.
|
||||
name: Nightly Real PI
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Daily 16:00 UTC ≈ 00:00 CST
|
||||
- cron: "0 16 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: nightly-real-pi
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
# Local Gitea act_runner label `nightly:host` — reaches host :18865 / :5434.
|
||||
# Do not use ubuntu-latest docker isolation for this job on this machine.
|
||||
nightly-real-pi:
|
||||
runs-on: nightly
|
||||
timeout-minutes: 120
|
||||
permissions:
|
||||
contents: read
|
||||
env:
|
||||
# Optional overrides via repo vars; script defaults apply when empty.
|
||||
PI_AGENT_RUNNER_URL: ${{ vars.PI_AGENT_RUNNER_URL }}
|
||||
PI_AGENT_MODEL: ${{ vars.PI_AGENT_MODEL }}
|
||||
PI_AGENT_PROTOCOL: typed-result-v1
|
||||
# Prefer dedicated secret; empty → infra_fail via run-nightly-real-pi.sh (never PASS).
|
||||
RUNNER_AUTH_TOKEN: ${{ secrets.RUNNER_AUTH_TOKEN }}
|
||||
PI_AGENT_RUNNER_AUTH_TOKEN: ${{ secrets.RUNNER_AUTH_TOKEN }}
|
||||
TEST_DATABASE_URL: ${{ secrets.NIGHTLY_TEST_DATABASE_URL }}
|
||||
# Align with PI on :18865 (shuimu-pi-agent-dev mounts data/dev/workspaces).
|
||||
DATA_DIR: /host-agent-data/dev
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: "1.27.1"
|
||||
cache-dependency-path: go.sum
|
||||
|
||||
- name: Run nightly real-PI suite (classified receipt)
|
||||
id: nightly
|
||||
run: |
|
||||
chmod +x scripts/run-nightly-real-pi.sh scripts/promotion-receipt-write.sh scripts/promotion-receipt-check.sh
|
||||
set +e
|
||||
./scripts/run-nightly-real-pi.sh
|
||||
rc=$?
|
||||
set -e
|
||||
echo "rc=${rc}" >> "$GITHUB_OUTPUT"
|
||||
# Always upload receipts/evidence; never treat missing secret as PASS.
|
||||
exit "${rc}"
|
||||
|
||||
# Gitea act_runner rejects upload-artifact@v4 (GHESNotSupportedError).
|
||||
# Keep a portable tarball in the job log workspace for local runner hosts.
|
||||
- name: Archive promotion receipt artifacts
|
||||
if: always()
|
||||
run: |
|
||||
set -euo pipefail
|
||||
out="promotion-receipt-${GITHUB_SHA}.tar.gz"
|
||||
mkdir -p .doc/test-reports/assets/promotion-receipts
|
||||
if compgen -G ".doc/test-reports/assets/promotion-receipts/${GITHUB_SHA}.json" >/dev/null \
|
||||
|| compgen -G ".doc/test-reports/assets/promotion-receipts/evidence-*" >/dev/null; then
|
||||
tar -czf "${out}" \
|
||||
.doc/test-reports/assets/promotion-receipts/"${GITHUB_SHA}".json \
|
||||
.doc/test-reports/assets/promotion-receipts/evidence-* \
|
||||
2>/dev/null || tar -czf "${out}" .doc/test-reports/assets/promotion-receipts
|
||||
ls -la "${out}"
|
||||
else
|
||||
echo "warn: no promotion receipt files to archive"
|
||||
fi
|
||||
|
||||
- name: Summarize receipt verdict
|
||||
if: always()
|
||||
run: |
|
||||
f=".doc/test-reports/assets/promotion-receipts/${GITHUB_SHA}.json"
|
||||
if [[ -f "$f" ]]; then
|
||||
echo "Receipt:"
|
||||
cat "$f"
|
||||
verdict="$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["verdict"])' "$f")"
|
||||
echo "verdict=${verdict}"
|
||||
if [[ "${verdict}" != "pass" ]]; then
|
||||
echo "::error::nightly real-PI verdict=${verdict} (infrastructure failures must not be reported as PASS)"
|
||||
fi
|
||||
else
|
||||
echo "::error::no promotion receipt written"
|
||||
exit 1
|
||||
fi
|
||||
@@ -0,0 +1,12 @@
|
||||
# Example pinned image env for test/main (Wave 2C same-image promotion).
|
||||
# Generated by scripts/candidate-images-apply.sh as configs/.env.<env>.images
|
||||
# Do not commit live digests that are machine-specific unless intentional fixtures.
|
||||
#
|
||||
# APP_IMAGE=shuimu-agent-app:test
|
||||
# EVENTS_IMAGE=shuimu-agent-events:test
|
||||
# PI_AGENT_IMAGE=shuimu-pi-agent:test
|
||||
# PINNED_IMAGE_MODE=1
|
||||
# PINNED_COMMIT=<full-sha>
|
||||
# PINNED_APP_DIGEST=sha256:...
|
||||
# PINNED_EVENTS_DIGEST=sha256:...
|
||||
# PINNED_PI_AGENT_DIGEST=sha256:...
|
||||
@@ -0,0 +1,140 @@
|
||||
-- +goose Up
|
||||
-- SWBOOT-01: additive project domain / type / compliance / governance fields.
|
||||
-- Does NOT backfill product_domain or project_type for legacy rows (avoid misclassification).
|
||||
|
||||
ALTER TABLE projects
|
||||
ADD COLUMN IF NOT EXISTS product_domain TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS project_type_key TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS compliance_profile_key TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS governance_profile TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS team_mode TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS execution_mode TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS data_sensitivity TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS network_policy TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS budget_class TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS problem_statement TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS target_users TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS target_outcome TEXT NOT NULL DEFAULT '',
|
||||
ADD COLUMN IF NOT EXISTS product_shape TEXT NOT NULL DEFAULT '';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS project_types (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
type_key TEXT NOT NULL UNIQUE,
|
||||
name TEXT NOT NULL,
|
||||
product_domain TEXT NOT NULL,
|
||||
description TEXT NOT NULL DEFAULT '',
|
||||
default_governance TEXT NOT NULL DEFAULT 'standard',
|
||||
default_workflow_key TEXT NOT NULL DEFAULT '',
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS compliance_profiles (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
profile_key TEXT NOT NULL UNIQUE,
|
||||
name TEXT NOT NULL,
|
||||
description TEXT NOT NULL DEFAULT '',
|
||||
ruleset_version TEXT NOT NULL DEFAULT 'v1',
|
||||
requires_independent_review BOOLEAN NOT NULL DEFAULT false,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS project_type_workflows (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
project_type_key TEXT NOT NULL REFERENCES project_types(type_key) ON DELETE CASCADE,
|
||||
workflow_key TEXT NOT NULL,
|
||||
compliance_profile_key TEXT NOT NULL DEFAULT '',
|
||||
recommended BOOLEAN NOT NULL DEFAULT false,
|
||||
allowed BOOLEAN NOT NULL DEFAULT true,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
CONSTRAINT uq_project_type_workflow UNIQUE (project_type_key, workflow_key, compliance_profile_key)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS project_source_bindings (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
project_id BIGINT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
source_type TEXT NOT NULL,
|
||||
source_ref TEXT NOT NULL DEFAULT '',
|
||||
revision TEXT NOT NULL DEFAULT '',
|
||||
content_hash TEXT NOT NULL DEFAULT '',
|
||||
permission_scope TEXT NOT NULL DEFAULT 'read_only',
|
||||
secret_ref TEXT NOT NULL DEFAULT '',
|
||||
exclude_globs TEXT NOT NULL DEFAULT '',
|
||||
ingested_at TIMESTAMPTZ,
|
||||
created_by BIGINT REFERENCES users(id) ON DELETE SET NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_project_source_bindings_project
|
||||
ON project_source_bindings(project_id, created_at DESC);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS repo_path_allowlist (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
path_prefix TEXT NOT NULL UNIQUE,
|
||||
description TEXT NOT NULL DEFAULT '',
|
||||
enabled BOOLEAN NOT NULL DEFAULT true,
|
||||
created_by BIGINT REFERENCES users(id) ON DELETE SET NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
INSERT INTO project_types (type_key, name, product_domain, description, default_governance, default_workflow_key)
|
||||
VALUES
|
||||
('greenfield', '绿地立项', 'non_medical_software', '从零规划新软件', 'standard', 'software_bootstrap'),
|
||||
('existing_product', '既有产品梳理', 'non_medical_software', '梳理已有产品与仓库', 'standard', 'software_bootstrap'),
|
||||
('legacy_modernization', '遗留现代化', 'non_medical_software', '遗留系统改造与迁移', 'standard', 'software_bootstrap'),
|
||||
('existing_self_bootstrap', '系统自举', 'non_medical_software', '用 Agent-System 梳理并建设自身', 'standard', 'software_bootstrap')
|
||||
ON CONFLICT (type_key) DO NOTHING;
|
||||
|
||||
INSERT INTO compliance_profiles (profile_key, name, description, ruleset_version, requires_independent_review)
|
||||
VALUES
|
||||
('none', '无外部合规预设', '不预设外部法规步骤;鉴权/审计/安全基线仍生效', 'v1', false),
|
||||
('internal_control', '内部控制', '内部流程、权限与审计约束', 'v1', false),
|
||||
('security_baseline', '安全基线', '威胁建模、依赖与 secret 边界', 'v1', false),
|
||||
('privacy', '隐私保护', '数据分类与最小权限', 'v1', true),
|
||||
('custom', '自定义合规', '项目自定义合规包', 'v1', true)
|
||||
ON CONFLICT (profile_key) DO NOTHING;
|
||||
|
||||
INSERT INTO project_type_workflows (project_type_key, workflow_key, compliance_profile_key, recommended, allowed)
|
||||
VALUES
|
||||
('greenfield', 'software_bootstrap', '', true, true),
|
||||
('greenfield', 'software_delivery', '', false, true),
|
||||
('existing_product', 'software_bootstrap', '', true, true),
|
||||
('existing_product', 'software_delivery', '', false, true),
|
||||
('legacy_modernization', 'software_bootstrap', '', true, true),
|
||||
('legacy_modernization', 'software_delivery', '', false, true),
|
||||
('existing_self_bootstrap', 'software_bootstrap', '', true, true),
|
||||
('existing_self_bootstrap', 'software_delivery', '', false, true)
|
||||
ON CONFLICT (project_type_key, workflow_key, compliance_profile_key) DO NOTHING;
|
||||
|
||||
INSERT INTO workflow_executor_registry (executor_key, description) VALUES
|
||||
('software.doc.v1', '软件领域通用文档执行器(bootstrap/delivery)')
|
||||
ON CONFLICT (executor_key) DO NOTHING;
|
||||
|
||||
-- +goose Down
|
||||
DROP TABLE IF EXISTS repo_path_allowlist;
|
||||
DROP TABLE IF EXISTS project_source_bindings;
|
||||
DROP TABLE IF EXISTS project_type_workflows;
|
||||
DROP TABLE IF EXISTS compliance_profiles;
|
||||
DROP TABLE IF EXISTS project_types;
|
||||
|
||||
ALTER TABLE projects
|
||||
DROP COLUMN IF EXISTS product_shape,
|
||||
DROP COLUMN IF EXISTS target_outcome,
|
||||
DROP COLUMN IF EXISTS target_users,
|
||||
DROP COLUMN IF EXISTS problem_statement,
|
||||
DROP COLUMN IF EXISTS budget_class,
|
||||
DROP COLUMN IF EXISTS network_policy,
|
||||
DROP COLUMN IF EXISTS data_sensitivity,
|
||||
DROP COLUMN IF EXISTS execution_mode,
|
||||
DROP COLUMN IF EXISTS team_mode,
|
||||
DROP COLUMN IF EXISTS governance_profile,
|
||||
DROP COLUMN IF EXISTS compliance_profile_key,
|
||||
DROP COLUMN IF EXISTS project_type_key,
|
||||
DROP COLUMN IF EXISTS product_domain;
|
||||
|
||||
DELETE FROM workflow_executor_registry WHERE executor_key = 'software.doc.v1';
|
||||
@@ -46,10 +46,10 @@ services:
|
||||
- main-net
|
||||
|
||||
pi-agent:
|
||||
image: ${PI_AGENT_IMAGE:-shuimu-pi-agent:main}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: deploy/pi-agent/Dockerfile
|
||||
image: shuimu-pi-agent:main
|
||||
container_name: shuimu-pi-agent-main
|
||||
environment:
|
||||
PORT: 18867
|
||||
@@ -78,6 +78,7 @@ services:
|
||||
- main-net
|
||||
|
||||
app:
|
||||
image: ${APP_IMAGE:-shuimu-agent-app:main}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: deploy/app/Dockerfile
|
||||
@@ -143,6 +144,7 @@ services:
|
||||
- shared-net
|
||||
|
||||
events:
|
||||
image: ${EVENTS_IMAGE:-shuimu-agent-events:main}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: deploy/app/Dockerfile
|
||||
|
||||
@@ -46,10 +46,10 @@ services:
|
||||
- test-net
|
||||
|
||||
pi-agent:
|
||||
image: ${PI_AGENT_IMAGE:-shuimu-pi-agent:test}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: deploy/pi-agent/Dockerfile
|
||||
image: shuimu-pi-agent:test
|
||||
container_name: shuimu-pi-agent-test
|
||||
environment:
|
||||
PORT: 18866
|
||||
@@ -78,6 +78,7 @@ services:
|
||||
- test-net
|
||||
|
||||
app:
|
||||
image: ${APP_IMAGE:-shuimu-agent-app:test}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: deploy/app/Dockerfile
|
||||
@@ -143,6 +144,7 @@ services:
|
||||
- shared-net
|
||||
|
||||
events:
|
||||
image: ${EVENTS_IMAGE:-shuimu-agent-events:test}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: deploy/app/Dockerfile
|
||||
|
||||
@@ -83,10 +83,27 @@ func (p *Plans) emitFact(ctx context.Context, plan *Plan, stepID string, now tim
|
||||
return err
|
||||
}
|
||||
eventID := fmt.Sprintf("intent-plan:%s:%s:%d:%s", plan.PlanID, name, plan.Revision, stepID)
|
||||
aggType := "intent_plan"
|
||||
aggID := plan.PlanID
|
||||
aggVer := plan.Revision
|
||||
if stepID != "" {
|
||||
// Step facts must not collide with plan-revision unique (aggregate_type, id, version).
|
||||
aggType = "intent_plan_step"
|
||||
aggID = stepID
|
||||
aggVer = 1
|
||||
for _, s := range plan.Steps {
|
||||
if s.StepID == stepID {
|
||||
if s.Version > 0 {
|
||||
aggVer = s.Version
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
env := events.Envelope{
|
||||
EventID: eventID, EventName: name, SchemaVersion: events.EnvelopeSchema,
|
||||
Environment: plan.Principal.Environment, ProjectID: plan.Principal.ProjectID,
|
||||
AggregateType: "intent_plan", AggregateID: plan.PlanID, AggregateVersion: plan.Revision,
|
||||
AggregateType: aggType, AggregateID: aggID, AggregateVersion: aggVer,
|
||||
ActorRef: fmt.Sprintf("user:%d", plan.Principal.UserID), IdempotencyKey: eventID,
|
||||
PayloadDigest: events.Digest(body), Producer: "app/intentflow",
|
||||
OccurredAt: now, Payload: body,
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
package intentflow_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"chat-agent-system/internal/app/intentflow"
|
||||
"chat-agent-system/internal/app/uow"
|
||||
"chat-agent-system/internal/db"
|
||||
"chat-agent-system/internal/events"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
func TestAdvanceEligible_WithPGSinkWritesReceipt(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("short")
|
||||
}
|
||||
dsn := db.SkipIfNoTestDatabaseURL(t)
|
||||
ctx := context.Background()
|
||||
pool, err := pgxpool.New(ctx, dsn)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(pool.Close)
|
||||
owner := intentflow.NewFakeActionOwner()
|
||||
plans := intentflow.NewPlans(uow.NewPG(pool), intentflow.NewRepository(), intentflow.Options{
|
||||
Owner: owner,
|
||||
Events: events.PGSink{},
|
||||
Now: func() time.Time { return time.Date(2026, 9, 16, 12, 0, 0, 0, time.UTC) },
|
||||
})
|
||||
prin := intentflow.Principal{UserID: 1, Environment: "test", ProjectID: 992, SessionID: "sess-adv-sink2"}
|
||||
created, err := plans.CreatePlan(ctx, intentflow.CreateCommand{
|
||||
Principal: prin, ClientTurnID: "adv-sink-2", RequestDigest: "d-sink2", WritePlan: true,
|
||||
ExecutionMode: intentflow.ModeLive,
|
||||
Steps: []intentflow.StepDraft{
|
||||
{ActionKey: "regulation.query", ActionDigest: "q", ExecutionMode: intentflow.ModeLive},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() {
|
||||
_, _ = pool.Exec(context.Background(), `DELETE FROM intent_plan_decisions WHERE plan_id=$1`, created.PlanID)
|
||||
_, _ = pool.Exec(context.Background(), `DELETE FROM intent_plan_steps WHERE plan_id=$1`, created.PlanID)
|
||||
_, _ = pool.Exec(context.Background(), `DELETE FROM intent_plans WHERE plan_id=$1`, created.PlanID)
|
||||
_, _ = pool.Exec(context.Background(), `DELETE FROM event_deliveries WHERE event_id LIKE $1`, "intent-plan:"+created.PlanID+"%")
|
||||
_, _ = pool.Exec(context.Background(), `DELETE FROM event_envelopes WHERE aggregate_id=$1`, created.PlanID)
|
||||
})
|
||||
confirmed, err := plans.DecidePlan(ctx, intentflow.DecisionCommand{
|
||||
Principal: prin, PlanID: created.PlanID, ExpectedRevision: created.Revision,
|
||||
DecisionNonce: "n-sink2", DecisionDigest: "dd-sink2", Kind: intentflow.DecisionConfirm,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
claimed, err := plans.ClaimStep(ctx, "w-sink", confirmed.PlanID, confirmed.Steps[0].StepID)
|
||||
if err != nil || claimed == nil {
|
||||
t.Fatalf("claim: %v %+v", err, claimed)
|
||||
}
|
||||
t.Logf("claimed fence=%d status=%s", claimed.FencingToken, claimed.Step.Status)
|
||||
view, err := plans.ExecuteClaimed(ctx, claimed)
|
||||
t.Logf("execute view=%+v err=%v", view, err)
|
||||
if err != nil {
|
||||
t.Fatalf("execute: %v", err)
|
||||
}
|
||||
var status, ref string
|
||||
_ = pool.QueryRow(ctx, `SELECT status, result_ref FROM intent_plan_steps WHERE step_id=$1`, confirmed.Steps[0].StepID).Scan(&status, &ref)
|
||||
t.Logf("db status=%s ref=%s", status, ref)
|
||||
if status != "succeeded" {
|
||||
t.Fatalf("want succeeded got %s", status)
|
||||
}
|
||||
}
|
||||
@@ -77,13 +77,14 @@ func insertStep(ctx context.Context, tx pgx.Tx, s Step) error {
|
||||
if len(slots) == 0 {
|
||||
slots = []byte("{}")
|
||||
}
|
||||
dependsOn := textArrayOrEmpty(s.DependsOn)
|
||||
_, err := tx.Exec(ctx, `
|
||||
INSERT INTO intent_plan_steps (
|
||||
step_id, plan_id, ordinal, action_key, slots, depends_on, status, expected_resource_version,
|
||||
action_digest, idempotency_key, attempt, result_ref, result_digest, safe_summary,
|
||||
lease_owner, lease_until, fencing_token, version, execution_mode, created_at, updated_at
|
||||
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21)`,
|
||||
s.StepID, s.PlanID, s.Ordinal, s.ActionKey, slots, s.DependsOn, string(s.Status),
|
||||
s.StepID, s.PlanID, s.Ordinal, s.ActionKey, slots, dependsOn, string(s.Status),
|
||||
s.ExpectedResourceVersion, s.ActionDigest, s.IdempotencyKey, s.Attempt, s.ResultRef,
|
||||
s.ResultDigest, s.SafeSummary, s.LeaseOwner, s.LeaseUntil, s.FencingToken, s.Version,
|
||||
string(s.ExecutionMode), s.CreatedAt, s.UpdatedAt,
|
||||
@@ -208,7 +209,7 @@ INSERT INTO intent_plan_decisions (
|
||||
exclude_unselected, decision_digest, outcome, created_at
|
||||
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11)`,
|
||||
d.DecisionID, d.PlanID, d.Nonce, d.PlanRevision, d.ActorUserID, string(d.Kind),
|
||||
d.StepIDs, d.ExcludeUnselected, d.DecisionDigest, d.Outcome, d.CreatedAt,
|
||||
textArrayOrEmpty(d.StepIDs), d.ExcludeUnselected, d.DecisionDigest, d.Outcome, d.CreatedAt,
|
||||
)
|
||||
if isUniqueViolation(err) {
|
||||
return uow.ErrDigestConflict
|
||||
@@ -256,7 +257,7 @@ SET status=$1, depends_on=$2, expected_resource_version=$3, action_digest=$4,
|
||||
lease_owner=$10, lease_until=$11, fencing_token=$12, version=$13, execution_mode=$14,
|
||||
updated_at=$15, slots=$16
|
||||
WHERE step_id=$17 AND plan_id=$18`,
|
||||
string(s.Status), s.DependsOn, s.ExpectedResourceVersion, s.ActionDigest,
|
||||
string(s.Status), textArrayOrEmpty(s.DependsOn), s.ExpectedResourceVersion, s.ActionDigest,
|
||||
s.IdempotencyKey, s.Attempt, s.ResultRef, s.ResultDigest, s.SafeSummary,
|
||||
s.LeaseOwner, s.LeaseUntil, s.FencingToken, s.Version, string(s.ExecutionMode),
|
||||
s.UpdatedAt, jsonbOrNil(s.Slots), s.StepID, planID,
|
||||
@@ -473,6 +474,13 @@ func jsonbOrNil(raw []byte) []byte {
|
||||
return raw
|
||||
}
|
||||
|
||||
func textArrayOrEmpty(vals []string) []string {
|
||||
if vals == nil {
|
||||
return []string{}
|
||||
}
|
||||
return vals
|
||||
}
|
||||
|
||||
func statusStrings(in []PlanStatus) []string {
|
||||
out := make([]string, len(in))
|
||||
for i, s := range in {
|
||||
|
||||
@@ -151,7 +151,11 @@ func (p *Plans) AdvanceEligible(ctx context.Context, workerID, planID string) (*
|
||||
last = got
|
||||
}
|
||||
if last == nil {
|
||||
return p.GetPlan(ctx, prin, planID)
|
||||
view, getErr := p.GetPlan(ctx, prin, planID)
|
||||
if firstErr != nil {
|
||||
return view, firstErr
|
||||
}
|
||||
return view, getErr
|
||||
}
|
||||
return last, firstErr
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package app
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -121,8 +120,7 @@ func TestLiveTaskStarterReplaysIdempotencyKey(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestTaskGenerateRealPIStopGate(t *testing.T) {
|
||||
if os.Getenv("PI_AGENT_RUNNER_URL") == "" {
|
||||
t.Skip("stop-gate: PI_AGENT_RUNNER_URL not set; real PI generate is not claimed")
|
||||
}
|
||||
t.Skip("live PI generate path is gated; unit evidence is TaskRunAdapter + ClaimRun idempotency")
|
||||
// Real PI + PG + revoke/restart evidence lives in
|
||||
// TestMultiIntentU8_RealPI_ConfirmGenerate_PG (internal/server).
|
||||
t.Skip("redirect: run TestMultiIntentU8_RealPI_ConfirmGenerate_PG with TEST_DATABASE_URL + runner")
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package auth
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"chat-agent-system/internal/config"
|
||||
@@ -13,7 +15,17 @@ type Stores struct {
|
||||
Sessions SessionStore
|
||||
}
|
||||
|
||||
func allowInMemoryAuthFallback(cfg *config.Config) bool {
|
||||
if cfg == nil || !cfg.AllowInMemory {
|
||||
return false
|
||||
}
|
||||
env := strings.ToLower(strings.TrimSpace(cfg.Env))
|
||||
return env == "dev" || env == "test"
|
||||
}
|
||||
|
||||
// NewStores 根据数据库与 IAM 迁移状态选择 PG 或内存实现。
|
||||
// 仅当环境明确为 dev/test 且 AllowInMemory 时允许 MemoryStore;
|
||||
// 环境空值、未知值、main/prod、pool 缺失或 IAM 表未就绪时 fail closed。
|
||||
func NewStores(ctx context.Context, pool *pgxpool.Pool, cfg *config.Config) (*Stores, error) {
|
||||
if pool != nil && IAMTablesReady(ctx, pool) {
|
||||
pg, err := NewPgStore(pool, cfg)
|
||||
@@ -25,6 +37,19 @@ func NewStores(ctx context.Context, pool *pgxpool.Pool, cfg *config.Config) (*St
|
||||
}
|
||||
return &Stores{Auth: pg, Sessions: pg}, nil
|
||||
}
|
||||
mem := NewMemoryStore(cfg)
|
||||
return &Stores{Auth: mem, Sessions: NewMemorySessionStore()}, nil
|
||||
if allowInMemoryAuthFallback(cfg) {
|
||||
mem := NewMemoryStore(cfg)
|
||||
return &Stores{Auth: mem, Sessions: NewMemorySessionStore()}, nil
|
||||
}
|
||||
env := ""
|
||||
if cfg != nil {
|
||||
env = strings.TrimSpace(cfg.Env)
|
||||
}
|
||||
reason := "IAM tables not ready or database pool unavailable"
|
||||
if pool == nil {
|
||||
reason = "database pool is nil"
|
||||
} else if !IAMTablesReady(ctx, pool) {
|
||||
reason = "IAM tables not ready"
|
||||
}
|
||||
return nil, fmt.Errorf("auth store fail-closed: %s (env=%q); memory IAM fallback requires env=dev|test and ALLOW_IN_MEMORY=true", reason, env)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"chat-agent-system/internal/config"
|
||||
)
|
||||
|
||||
func TestNewStores_FailClosed_WhenIAMUnavailable(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
cases := []struct {
|
||||
name string
|
||||
cfg *config.Config
|
||||
}{
|
||||
{name: "main_nil_pool", cfg: &config.Config{Env: "main", AllowInMemory: false}},
|
||||
{name: "prod_nil_pool", cfg: &config.Config{Env: "prod", AllowInMemory: false}},
|
||||
{name: "empty_env_nil_pool", cfg: &config.Config{Env: "", AllowInMemory: true}},
|
||||
{name: "unknown_env_nil_pool", cfg: &config.Config{Env: "staging", AllowInMemory: true}},
|
||||
{name: "dev_without_opt_in", cfg: &config.Config{Env: "dev", AllowInMemory: false}},
|
||||
{name: "test_without_opt_in", cfg: &config.Config{Env: "test", AllowInMemory: false}},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
stores, err := NewStores(ctx, nil, tc.cfg)
|
||||
if err == nil {
|
||||
t.Fatalf("expected fail-closed error, got stores=%v", stores)
|
||||
}
|
||||
if stores != nil {
|
||||
t.Fatalf("expected nil stores on failure, got %#v", stores)
|
||||
}
|
||||
if !strings.Contains(err.Error(), "IAM") && !strings.Contains(err.Error(), "memory") {
|
||||
t.Fatalf("error should mention IAM/memory policy: %v", err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewStores_AllowsMemoryOnlyWithDevTestOptIn(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
for _, env := range []string{"dev", "test"} {
|
||||
t.Run(env, func(t *testing.T) {
|
||||
cfg := &config.Config{
|
||||
Env: env,
|
||||
AllowInMemory: true,
|
||||
AdminUsername: "admin",
|
||||
AdminPassword: "admin-test-pass",
|
||||
}
|
||||
stores, err := NewStores(ctx, nil, cfg)
|
||||
if err != nil {
|
||||
t.Fatalf("expected memory fixture: %v", err)
|
||||
}
|
||||
if stores == nil || stores.Auth == nil || stores.Sessions == nil {
|
||||
t.Fatal("expected auth+session stores")
|
||||
}
|
||||
if _, ok := stores.Auth.(*MemoryStore); !ok {
|
||||
t.Fatalf("Auth should be MemoryStore, got %T", stores.Auth)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// brokenSessionStore simulates IAM/session dependency outage after process start.
|
||||
type brokenSessionStore struct{}
|
||||
|
||||
func (brokenSessionStore) CreateSession(ctx context.Context, userID int64, tokenHash string, meta SessionMeta) error {
|
||||
return fmt.Errorf("session store unavailable")
|
||||
}
|
||||
func (brokenSessionStore) ResolveUserID(ctx context.Context, tokenHash string) (int64, error) {
|
||||
return 0, fmt.Errorf("session store unavailable")
|
||||
}
|
||||
func (brokenSessionStore) TouchSession(ctx context.Context, tokenHash string) error {
|
||||
return fmt.Errorf("session store unavailable")
|
||||
}
|
||||
func (brokenSessionStore) RevokeByTokenHash(ctx context.Context, tokenHash string) error {
|
||||
return fmt.Errorf("session store unavailable")
|
||||
}
|
||||
func (brokenSessionStore) RevokeAllForUser(ctx context.Context, userID int64) error {
|
||||
return fmt.Errorf("session store unavailable")
|
||||
}
|
||||
func (brokenSessionStore) ListActiveSessions(ctx context.Context, userID int64, currentTokenHash string) ([]SessionRecord, error) {
|
||||
return nil, fmt.Errorf("session store unavailable")
|
||||
}
|
||||
func (brokenSessionStore) RevokeSessionByID(ctx context.Context, userID int64, sessionID string) error {
|
||||
return fmt.Errorf("session store unavailable")
|
||||
}
|
||||
|
||||
func TestAuthStore_SessionInterruptFailClosed(t *testing.T) {
|
||||
// After a session was "established", subsequent lookups must not silently
|
||||
// succeed with cached authority when the session store is down.
|
||||
var ss SessionStore = brokenSessionStore{}
|
||||
_, err := ss.ResolveUserID(context.Background(), "hash-already-issued")
|
||||
if err == nil {
|
||||
t.Fatal("interrupted session store must fail-closed on ResolveUserID")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "unavailable") {
|
||||
t.Fatalf("want unavailable error, got %v", err)
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,9 @@ func MustNewService(t testing.TB, cfg *config.Config) *Service {
|
||||
return svc
|
||||
}
|
||||
cfg.AllowInMemory = true
|
||||
if cfg.Env == "" {
|
||||
cfg.Env = "test"
|
||||
}
|
||||
svc, err := NewService(cfg)
|
||||
if err != nil {
|
||||
t.Fatalf("NewService: %v", err)
|
||||
|
||||
@@ -24,7 +24,7 @@ func validatePlan(plan WorkflowPlan, version *workflowdef.Version) workflowdef.V
|
||||
if !workflowdef.IsOfficialWorkflowKey(plan.WorkflowDefinitionKey) {
|
||||
issues = append(issues, workflowdef.ValidationIssue{
|
||||
Code: "WORKFLOW_NOT_SELECTABLE", Field: "workflow_definition_key",
|
||||
Message: "仅允许选择正式三工作流",
|
||||
Message: "仅允许选择正式工作流(医疗三或软件自举/交付)",
|
||||
})
|
||||
}
|
||||
if plan.WorkflowDefinitionKey != version.WorkflowKey {
|
||||
|
||||
@@ -28,11 +28,11 @@ type memoryCatalog struct {
|
||||
order []string
|
||||
}
|
||||
|
||||
// NewDefaultCatalog 创建默认工作流目录(内建 main、product_manager、test_manager)
|
||||
// NewDefaultCatalog 创建默认工作流目录(医疗三 + 软件自举/交付)
|
||||
func NewDefaultCatalog() Catalog {
|
||||
c := &memoryCatalog{
|
||||
definitions: make(map[string]*Definition),
|
||||
order: []string{"main", "product_manager", "test_manager"},
|
||||
order: []string{"main", "product_manager", "test_manager", "software_bootstrap", "software_delivery"},
|
||||
}
|
||||
|
||||
c.definitions["main"] = &Definition{
|
||||
@@ -69,6 +69,28 @@ func NewDefaultCatalog() Catalog {
|
||||
Enabled: true,
|
||||
}
|
||||
|
||||
c.definitions["software_bootstrap"] = &Definition{
|
||||
Key: "software_bootstrap",
|
||||
Name: "软件项目自举流程",
|
||||
Description: "S0–S4:章程、现状、需求、架构、风险、路线与就绪评审",
|
||||
StageKey: "S0_boundary",
|
||||
TaskKey: "software_charter",
|
||||
OutputDocType: "software_charter",
|
||||
OutputDocTitle: "项目章程",
|
||||
Enabled: true,
|
||||
}
|
||||
|
||||
c.definitions["software_delivery"] = &Definition{
|
||||
Key: "software_delivery",
|
||||
Name: "软件交付迭代流程",
|
||||
Description: "D0–D4:变更定义、实施证据、验证、发布与复盘",
|
||||
StageKey: "D0_change_definition",
|
||||
TaskKey: "change_brief",
|
||||
OutputDocType: "change_brief",
|
||||
OutputDocTitle: "变更简报",
|
||||
Enabled: true,
|
||||
}
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user