merge: candidate non-author-member-access docs into local_dev
CI / go-vet-and-short-test (push) Failing after 1s
CI / backup-restore-drill (push) Failing after 0s
CI / web (push) Failing after 0s

This commit is contained in:
weichen
2026-09-24 12:14:22 +00:00
9 changed files with 208 additions and 5 deletions
@@ -0,0 +1,25 @@
# ISSUE-20260924-non-author-400-duty
## 摘要
非编制项目成员无法上传/总结/对话写草稿;权限错误经 `writeDocGovError` 默认落成 HTTP **400**。
## 根因
1. `domainHTTPStatus` 未映射 `ErrOnlyAuthorCanEdit` / `ErrReviewerCannotEdit` / `ErrApproverCannotEdit` → 403。
2. `classifyAccess` / `AllowedTaskKeys` / `CanEditDocumentContent` 将 run/edit 绑编制职责(三道门协同过宽)。
3. 前端写意图路由偶发把「总结+写动词」送入 task run。
## 处置(deny_only_submit)
- run/edit → 项目成员级;submit/review/approve 保留职责门禁。
- AuthorID 仍归编制职责人(`docduty.Resolve` 不变)。
- 人工编辑传 `ActorIsMember`,不复用 `RoleSystem`。
## 验证
见 [测试报告](../test-reports/2026-09-24-non-author-member-access-test-report.md);真实 PI PASS。
## 状态
resolved(2026-09-24)
+1
View File
@@ -17,3 +17,4 @@
| ISSUE-20260924-pi-executor-boundaries | PI executor / 路径规范化 / MCP / 子进程 / 幂等 | 未发布初版只读边界与执行可靠性缺陷 | high | resolved | Cursor/Codex | 2026-09-24;173 工程回归与真实 Cursor CLI/MCP/PI | [主记录](2026-09-24-pi-executor-boundaries.md) | [工具路径与输入隔离](../ops/lessons/2026-09-24-pi-tool-boundaries.md) |
| ISSUE-20260924-cursor-cli-mcp-path | Cursor CLI / MCP / workspaceFolder / NDJSON | agentctl/jev MCP 加载失败(路径 + Content-Length 回包) | medium | verifying | Cursor | 2026-09-24;相对路径+NDJSON 已修;待 IDE 重载后 list-tools 实机 | [主记录](2026-09-24-pi-executor-boundaries.md#cursor-cli-mcp-path) | [LESSON-20260924-cursor-hook-advisory-gates](../ops/lessons/2026-09-24-cursor-hook-advisory-gates.md) |
| ISSUE-20260924-cursor-hook-event-contract | Cursor / hooks / beforeMCPExecution / probe | hook 事件 stdin 字段名与 matcher 官方未文档化 | medium | verifying | Cursor | 2026-09-24;IDE postToolUse tool_name=`MCP:pi_subagent_roles` 已采样;beforeMCP 全量 stdin 仍缺 | [主记录](2026-09-24-cursor-hook-event-contract.md) | [LESSON-20260924-cursor-hook-advisory-gates](../ops/lessons/2026-09-24-cursor-hook-advisory-gates.md) |
| ISSUE-20260924-non-author-400-duty | iam-authz / docgov / duty / 400 / 非编制 | 权限不足误报 400;run/edit 与编制职责绑死导致成员无法上传总结写草稿 | high | resolved | Cursor | 2026-09-24;真实 PI `TestNonAuthorMember_PiAgent_RunEditSubmitGates` PASS | [主记录](2026-09-24-non-author-member-access.md) | [LESSON-20260924-deny-only-submit](../ops/lessons/2026-09-24-deny-only-submit.md) |
+4 -1
View File
@@ -16,7 +16,10 @@
| GET /api/v1/tasks/runs/{id} | task_run | view | taskrun | 403 非 owner/非 owner 成员 |
| POST /api/v1/tasks/runs/{id}/cancel | task_run | cancel | taskrun | 403 取消他人 |
| POST /api/v1/chat/stream | chat | send | chat+stage | 403 无阶段权限 |
| GET /api/v1/docgov/* | document | * | docgov+duty | 403 非职责人 |
| GET /api/v1/docgov/* | document | * | docgov+duty | view:成员;run/edit:成员(deny_only_submit);submit/review/approve:对应职责,403 |
| POST /api/v1/docgov/content | document | edit | docgov+member | 403 非项目成员或锁定态 |
| POST /api/v1/docgov/submit-review | document | submit | docgov+author | 403 非编制职责人 |
| POST /api/v1/tasks/run | task | run | bizdev+member | 403 非成员 / 非活动阶段;不再要求编制职责 |
| GET /api/v1/admin/* | admin | * | authz RBAC | 403 非 admin/细粒度 perm |
| GET /health, /api/v1/health | system | health | server | 公开 |
@@ -0,0 +1,20 @@
# LESSON-20260924-deny-only-submit
## 触发条件 / 关键词
非编制、DOC_DUTY、400、run/edit、送审、成员草稿
## 注意事项
1. 权限哨兵必须在 `domainHTTPStatus` 显式映射到 403;默认 400 会让前端 403 文案永不命中。
2. 放宽受控文档写权限时,`classifyAccess`、`AllowedTaskKeys`、`CanEditDocumentContent` 必须同批调整,否则单门放行仍会在下游失败。
3. docgov 不得 import projectinstance:成员身份由 server 校验后经 `ActorIsMember` 传入;禁止用 `RoleSystem` 冒充人工成员。
4. 审批路径走 `CheckDocTaskAccess(submit|review|approve)`,不要复用 `TaskKeyAllowed`。
## lesson_state
validated(2026-09-24 真实 PI)
## 主记录
[ISSUE-20260924-non-author-400-duty](../../audit/2026-09-24-non-author-member-access.md)
+1
View File
@@ -9,5 +9,6 @@
| LESSON-20260923-matrix-status-cas | FEATURE-MATRIX、docs-apply、record_id、merge conflict、CAS | 矩阵/CURRENT 行变更走 docs apply;合并后核验状态列未被回退 | validated | [矩阵状态 CAS](2026-09-23-matrix-status-cas.md);2026-09-23 |
| LESSON-20260924-pi-tool-boundaries | PI、MCP、readonly、path、snapshot、process-group | 路径语义与快照边界一致,合法路径和拒绝路径都验收 | validated | [文件工具边界](2026-09-24-pi-tool-boundaries.md);2026-09-24 |
| LESSON-20260924-cursor-hook-advisory-gates | Cursor、hooks、advisory、fail-open、probe、stdin | hook 与执行器分层;契约未知 fail-open;审计日志放 ignore 路径 | candidate | [客户端 hook 门禁](2026-09-24-cursor-hook-advisory-gates.md);2026-09-24 |
| LESSON-20260924-deny-only-submit | 非编制、DOC_DUTY、400、run/edit、送审 | 权限哨兵映射 403;三道门协同放宽;ActorIsMember 不复用 RoleSystem | validated | [deny_only_submit](2026-09-24-deny-only-submit.md);2026-09-24 |
validated 的证据范围见各条目;本日复核为历史材料和源码阅读,未重跑产品回归。后续按机制补充,过时条目标 superseded/retired 并保留替代链接。
+1 -1
View File
@@ -75,7 +75,7 @@
| DOCREV-QUALITY-SELF-POLLUTE | 自检表引用禁词致 score=40 quality_failed;auto_repair 未启用;UI 映射 completed | **PASS** | [audit](../audit/2026-09-13-document-revision-quality-gate-self-pollution.md);Round20 UI-03 完成 | 不删证据;不删禁词 |
| DOCREV-ACTIVE-DOC-ROUTING | UI-05「当前受控文档」被法规关键词改路由到 `feasibility_reg`,intake 无 pending | **PASS** | [audit](../audit/2026-09-13-document-revision-active-doc-routing.md);Round20 UI-05 pending 停在 intake V2 | **不改弱 E2E**;不删证据 |
| DOCREV-QUALITY-STATUS-FP | 行动计划表状态列「待续」被门禁当敷衍,两轮 repair 后 quality_failed 80 | **PASS** | [audit](../audit/2026-09-13-document-revision-quality-status-false-positive.md);Round20 UI-03 | **不删禁词、不放宽正文**;不删证据 |
| GOVERNANCE-ACTION-AUTHZ | 文档动作按职责鉴权;未激活 202-blocked;关闭创建直通 | **PASS** | [test-report](../test-reports/2026-09-14-governance-action-level-authz-test-report.md);[audit 异态](../audit/2026-09-14-planning-with-workflow-key-anomaly.md) | 不改 83 条 planning+key 夹具;none 长 PI 审批链另开 |
| GOVERNANCE-ACTION-AUTHZ | 文档动作按职责鉴权;未激活 202-blocked;关闭实例直通 | **PASS** | [test-report](../test-reports/2026-09-14-governance-action-level-authz-test-report.md);[audit 异态](../audit/2026-09-14-planning-with-workflow-key-anomaly.md);[2026-09-24 deny_only_submit](../test-reports/2026-09-24-non-author-member-access-test-report.md) | 不改 83 条 planning+key 夹具;**after 2026-09-24**:run/edit 成员级,submit/review/approve 仍职责门禁 |
| DOC-RELIABILITY-PILOT | 受控文档写路径与 PG 事件交付尚未形成生产闭环;闭包副作用在崩溃/重启后不可重试审计,错误 scope 或 projection 缺失仍可能导致刷新失败 | **PASS** | [初审](../audit/2026-09-14-module-decoupling-plan-review.md);[Phase 1](./2026-09-14-module-decoupling-refactor-plan.md);[Phase 2 复核](../audit/2026-09-15-module-decoupling-phase2-plan-review.md);[Phase 2 修订](./2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md);[U11–U12 报告](../test-reports/2026-09-15-app-composition-u11-u12-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);[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) | 共享 notify/workflow_advance/projection 已 live;生产不再注册 `OnOutbox=` / `AddOnApprovedHook(`。FAV 仍 off。HTTP/PI 实施不纳入本行。项目 143 只读 |
---
+3 -3
View File
@@ -59,11 +59,11 @@
| chat-semantic-d3 | 语义摘要(D3) | 授权可见集上 shadow 语义摘要(durable jobs/租约/watermark/provenance);失败保留 deterministic served Narrative;默认 shadow off | done | deferred_enhancement | [chat-agent-p6-backlog](../backlog/chat-agent-p6-backlog.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[脚手架](../test-reports/2026-09-16-pu6-semantic-summary-test-report.md);[W2 真 PI](../test-reports/2026-09-17-w2-semantic-summary-shadow-test-report.md);[Track S1](../ops/short-term/2026-09-22-track-s1-summary-consolidation.md);[2026-09-23 收口](../test-reports/2026-09-23-chat-semantic-d3-closeout-test-report.md) | **before**:声明含 shadow→可选 REPLACE → **after**:仅 durable shadow;REPLACE 义务迁「语义摘要 REPLACE」行。关闭:tip 重验 + 真 PI PASS(见收口报告)。Wave5 X-2 密封不变 | `chat` |
| chat-data-d7 | 对话数据治理(D7) | 留存/删除口径、库·备份·日志控制、敏感字段加密边界 | deferred | deferred_enhancement(违规则升 blocker) | [计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) Scope Boundaries;[D7 ADR 草案](../adr/2026-09-17-d7-chat-data-retention.md);[W7 盘点](../audit/2026-09-17-d7-data-inventory.md);[红线证据](../test-reports/2026-09-22-redline-evidence-d7-test-report.md) | 只读盘点 + Track E ID-only 符合性已补。口径仍 `pending-compliance-signoff`;**禁止物理删除**。本行不升 done | `chat` |
| squad | 智能体小队 | 角色-任务-工作区-黑板 | 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` |
| workflow-gov | 工作流治理 | 三正式工作流、设置页/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` |
| workflow-gov | 工作流治理 | 三正式工作流、设置页/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);[deny_only_submit](../test-reports/2026-09-24-non-author-member-access-test-report.md) | full 跨用户审批 + none 免审批不阻塞已签。纯软件自举仍独立 planned **after 2026-09-24 deny_only_submit**:成员可 run/edit/上传/草稿;送审/审核/批准仍职责门禁。[重验](../test-reports/2026-09-24-non-author-member-access-test-report.md) | `workflow` |
| workflow-rdev | 研发设计控制(rdev) | 医疗第 4 工作流:13×60 manifest/模板、`squad.rdev_doc.v1` kind 编排、main-completed 硬 precheck、StageKey 动态化;不含前端/真 PI/键名空间化 | partial | deferred_enhancement | [设计](../system-design/project-workflow/07-研发工作流rdev接入-设计与实施计划.md);[收口](../ops/short-term/2026-09-22-rdev-closeout.md);[报告](../test-reports/2026-09-22-rdev-closeout-test-report.md);[P3 历史](../test-reports/2026-09-19-rdev-p3-real-pi-test-report.md) | **after 2026-09-22 收口**:`rd_proposal` 标题门禁 + 法规表首表截止 dry PASS;nightly 脚本已扩四工作流(FullChain×3+FullNone)。P3 真 PI 三样本重跑因缺 `env:dev` **blocked**(不以 stub 冒充)。剩余:获环境后重跑 P3。本行保持 partial | `workflow-def` / `rdev-templates` |
| workflow-swboot | 纯软件项目自举 | 软件项目创建、Bootstrap、Delivery、受控工程交接 | partial | deferred_enhancement(明确不挡首发) | [设计](../system-design/2026-09-14-software-project-bootstrap-workflow.md);[ADR](../adr/2026-09-16-software-project-bootstrap-keys.md);[L1 报告](../test-reports/2026-09-16-software-project-bootstrap-test-report.md);[W5a](../test-reports/2026-09-17-w5a-software-bootstrap-ui-pi-test-report.md);[红线证据](../test-reports/2026-09-22-redline-evidence-swboot-test-report.md) | **after W5a + 红线证据**:catalog 驱动创建、软件不挂医疗 key。**SWBOOT-10 仍 stub**(L1–L4 证据已补;L5/L6 待授权)。本行不升 done | `workflow-design` |
| iam-authz | 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` |
| docgov | 文档治理 | 法定文档生命周期 + 租约 + 受控正文读取 | 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);[键统一](../test-reports/2026-09-21-workflow-doc-key-unification-test-report.md) | 项目 143 只读;不终止。`doc_proj*` 同一发布键不能再并存;[自由协作认领](../test-reports/2026-09-24-free-collab-claim-notify-test-report.md)| `docgov` |
| iam-authz | 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);[deny_only_submit](../test-reports/2026-09-24-non-author-member-access-test-report.md) | 全路由 inventory + session 中断负例 + 410 冻结 + R13 基线已签 **after 2026-09-24 deny_only_submit**:成员可 run/edit/上传/草稿;送审/审核/批准仍职责门禁。[重验](../test-reports/2026-09-24-non-author-member-access-test-report.md) | `authz` |
| docgov | 文档治理 | 法定文档生命周期 + 租约 + 受控正文读取 | 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);[键统一](../test-reports/2026-09-21-workflow-doc-key-unification-test-report.md);[deny_only_submit](../test-reports/2026-09-24-non-author-member-access-test-report.md) | 项目 143 只读;不终止。`doc_proj*` 同一发布键不能再并存;[自由协作认领](../test-reports/2026-09-24-free-collab-claim-notify-test-report.md) **after 2026-09-24 deny_only_submit**:成员可 run/edit/上传/草稿;送审/审核/批准仍职责门禁。[重验](../test-reports/2026-09-24-non-author-member-access-test-report.md) | `docgov` |
| docgov-revision | 文档版本 baseline | 账本、人工修订、确定性 diff+lineage、运行时 UI、负责人通知 | done | non_blocker | [管理](../test-reports/2026-09-13-document-revision-management-test-report.md);[Round20 UI](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[ADR](../adr/2026-09-13-document-version-boundary.md);[proposed/authoritative](../ops/short-term/2026-09-20-proposed-authoritative-reports.md) | **before**:完整 PI narrative 混入 → **after**:迁「PI change-report 叙事」。fallback 报告是本行内显式行为,不是缺口。lineage GET 已按 URL 项目和文档可见性裁剪。test_manager 血缘的下游/上游版本改读文档版本,不再写死 1。Agent 候选报告为 `proposed`,正式提交才写 authoritative 后继并挂到版本;拒绝、替代后旧报告不能再出建议。人工修订、导入和聊天卡仍未分开预估与正式报告,见 [T1](../ops/short-term/2026-09-20-impact-loop-t1.md)。项目追踪索引见下一行 | `docgov` |
| trace-impact | 阶段回溯与影响闭环 | 五表追踪索引、影响报告、L1 文档修订、L2 阶段再打开、待复核软标记、对话修订提案 | done | deferred_enhancement(不挡首发) | [设计](../system-design/2026-09-20-stage-backtrack-and-impact-loop-design.md);[Track T](../remediation/2026-09-20-capability-enablement-impact-plan.md);[对话化报告](../test-reports/2026-09-21-trace-panel-to-chat-test-report.md);[T 补强](../ops/short-term/2026-09-22-track-t-strengthen.md) | 已合入 dev。常驻「需求与影响」面板已退役。**2026-09-23 实测** DOCREV 路径 schema **63**;test=`rc-v1.1.0-beta.1` schema 61;main 本轮未晋升。阶段推进确认门禁仍在。不签 D7 对话 ADR;[补充影响批次](../test-reports/2026-09-24-free-collab-claim-notify-test-report.md)| `trace-index` |
| docgov-pi-narrative | PI change-report 叙事 | 只读消费 diff+lineage 的 PI 叙事;失败全量降级 fallback | done | deferred_enhancement | [Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu7](../ops/long-term/2026-09-16-pu7-pi-narrative-contract.md);[W3 真 PI](../test-reports/2026-09-17-w3-pi-change-report-narrative-test-report.md);[红线负例](../test-reports/2026-09-22-redline-evidence-pi-narrative-test-report.md);[收口](../test-reports/2026-09-23-pi-narrative-closeout-test-report.md) | **after 2026-09-23 收口**:修复后真实 MiniMax 复测 PASS(截断差异输入 + reasoning 目标落盘);默认 flag **off**;dev/test 常驻开启另授权 | `docgov` |
@@ -0,0 +1,73 @@
# 非编制成员访问放行(deny_only_submit)测试报告
## 一、 测试背景 (Background)
项目成员无编制职责时,上传/总结/对话及受控草稿编写被误拦;权限不足经 `writeDocGovError` 误报 **HTTP 400**。根因为错误映射缺失与 run/edit 职责门禁过宽(三道门协同)。
## 二、 测试目标 (Test Objectives)
1. `ErrOnlyAuthorCanEdit` 等权限哨兵映射为 **403**。
2. 非编制成员可:上传资产、真实 PI 跑 intake、保存草稿正文。
3. 非编制成员 **不可** 送审;编制人可送审。
4. 前端只读意图优先、403 文案引导「可草稿、送审需编制人」。
## 三、 测试方案与环境 (Test Plan & Environment)
| 项 | 值 |
|---|---|
| OS | Linux |
| 隔离 PG | gate-pg `:5436` 临时库(测完 DROP) |
| PI Runner | `http://127.0.0.1:18865` MiniMax-M2.7-highspeed |
| 代码 tip | `feature/non-author-member-access-2026-09-24`(已祖先于 local `dev`) |
| 层级 | 工程单测 + PG 集成 + 真实 PI 产品链路(验证契约产品 PI 基线) |
## 四、 预期结果 (Expected Results)
| 步骤 | 预期 |
|---|---|
| guest 上传 | 2xx |
| guest `POST /tasks/run` intake | HTTP 200,产物标题非空(准入门禁放行) |
| guest `POST /docgov/content` | 200 |
| guest `POST /docgov/submit-review` | **403** + `DOC_DUTY_FORBIDDEN` |
| zhanggong submit | 200 / eng 送审成功 |
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 真实 PI:`TestNonAuthorMember_PiAgent_RunEditSubmitGates`
- **测试输入**:隔离 `TEST_DATABASE_URL` + 真实 pi-agent;成员 `guest`,编制人 `zhanggong`
- **实际输出**(摘自 `assets/2026-09-24-non-author-member-access/piagent-e2e.log`):
```
✓ [1. upload] non-author member asset upload OK
✓ [2. run] non-author member pi-agent intake doc=doc_proj6011_bd_intake success=false title="用户初始需求收集表" pending_author=false elapsed=1h8m51s
✓ [3. edit] non-author member SaveDocumentContent OK
✓ [4. submit denied] non-author member submit → 403 DOC_DUTY_FORBIDDEN
✓ [5. submit author] designated author submit OK
--- PASS: TestNonAuthorMember_PiAgent_RunEditSubmitGates (4131.60s)
PASS
```
- **评价判定**:PASS(步骤 2 `success=false` 为质量/产物字段语义,HTTP 与标题已证明 run 门禁对成员放行,与本任务目标一致)
- **性能与耗时**:约 4132s(含 PI 生成)
### 5.2 工程单测 / 门禁
| 套件 | 判定 |
|---|---|
| `go test ./internal/projectinstance ./internal/docgov` | PASS |
| `go test -short ./internal/server` | PASS |
| 隔离 PG `GoverningAccess` / StageAccess | PASS |
| `./scripts/arch-check.sh --mode block` | PASS |
| `go test -short ./...` | PASS |
| 前端 `taskRunErrorInfo` / `templateMatch` / `useSendMessage` | PASS (43) |
| `npm run build` | PASS |
## 六、 自动化测试套件汇总 (Test Suite Execution)
见上表;产品 PI 用例 `TestNonAuthorMember_PiAgent_RunEditSubmitGates` 为本次授权交付主证据。
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
- **结论**:deny_only_submit 三道门协同放行已用真实 PI 验收;400→403 与前端文案已覆盖。
- **后续**:`success=false` 但有标题的 PI 结果可单独排查质量投影;运行中成员租约需在送审前释放(用例已覆盖)。
@@ -0,0 +1,80 @@
=== RUN TestNonAuthorMember_PiAgent_RunEditSubmitGates
2026/09/24 11:00:10 OK 00001_baseline.sql (51.95ms)
2026/09/24 11:00:11 OK 00002_2026-09-09-doc-edit-lease.sql (3.04ms)
2026/09/24 11:00:11 OK 00003_2026-09-09-uq-context-memory-chunk-hash.sql (1.67ms)
2026/09/24 11:00:11 OK 00004_2026-09-10-chat-daily-digests-and-search.sql (631.01µs)
2026/09/24 11:00:11 OK 00005_2026-09-10-chat-messages-day-window.sql (950.4µs)
2026/09/24 11:00:11 OK 00006_2026-09-11-chat-read-positions.sql (374.46µs)
2026/09/24 11:00:11 OK 00007_2026-09-11-chat-turns.sql (412.75µs)
2026/09/24 11:00:11 OK 00008_2026-09-11-freeform-documents.sql (7.15ms)
2026/09/24 11:00:11 OK 00009_2026-09-11-message-export-policy.sql (2.95ms)
2026/09/24 11:00:11 OK 00010_2026-09-11-project-workflows-and-lineage.sql (12.23ms)
2026/09/24 11:00:11 OK 00011_2026-09-11-seed-ten-projects.sql (5.26ms)
2026/09/24 11:00:11 OK 00012_2026-09-11-seed-ten-projects-chat.sql (29.95ms)
2026/09/24 11:00:11 OK 00013_2026-09-11-task-run-lineage.sql (1.48ms)
2026/09/24 11:00:11 OK 00014_project_members.sql (3.65ms)
2026/09/24 11:00:11 OK 00015_2026-09-12-iam-core.sql (15.56ms)
2026/09/24 11:00:11 OK 00016_2026-09-12-workflow-definitions-and-templates.sql (10.68ms)
2026/09/24 11:00:11 OK 00017_2026-09-12-project-workflow-instances.sql (14.72ms)
2026/09/24 11:00:11 OK 00018_2026-09-12-outbox-notifications-stage-advance.sql (8.28ms)
2026/09/24 11:00:11 OK 00019_2026-09-12-task-runs-events.sql (4.89ms)
2026/09/24 11:00:11 OK 00020_2026-09-12-task-run-worker-lease.sql (1.12ms)
2026/09/24 11:00:11 OK 00021_2026-09-12-iam-hardening.sql (2.47ms)
2026/09/24 11:00:11 OK 00022_2026-09-12-workflow-schema-v2.sql (1.8ms)
2026/09/24 11:00:11 OK 00023_2026-09-12-instance-integrity.sql (1ms)
2026/09/24 11:00:11 OK 00024_2026-09-12-workflow-catalog-governance.sql (6.13ms)
2026/09/24 11:00:11 OK 00025_2026-09-13-sync-seed-sequences.sql (959µs)
2026/09/24 11:00:11 OK 00026_2026-09-13-chat-message-scope.sql (2.45ms)
2026/09/24 11:00:11 OK 00027_2026-09-13-chat-message-scope-backfill.sql (2.08ms)
2026/09/24 11:00:11 OK 00028_2026-09-13-document-revisions.sql (14.48ms)
2026/09/24 11:00:11 OK 00029_2026-09-13-freeform-client-key.sql (1.13ms)
2026/09/24 11:00:11 OK 00030_2026-09-13-task-run-pending-author-confirmation.sql (1.08ms)
2026/09/24 11:00:11 OK 00031_2026-09-13-project-member-document-duty.sql (1.69ms)
2026/09/24 11:00:11 OK 00032_2026-09-14-document-revision-migration-repair.sql (623.35µs)
2026/09/24 11:00:11 OK 00033_2026-09-14-task-run-blocked-pending-governance.sql (434.54µs)
2026/09/24 11:00:11 OK 00034_2026-09-14-workspace-lease-fencing.sql (459.15µs)
2026/09/24 11:00:11 OK 00035_2026-09-14-durable-event-delivery.sql (5.13ms)
2026/09/24 11:00:11 OK 00036_2026-09-14-final-artifact-vault.sql (8.72ms)
2026/09/24 11:00:11 OK 00037_2026-09-15-task-run-manifests.sql (2.27ms)
2026/09/24 11:00:11 OK 00038_2026-09-15-dataset-lifecycle.sql (7.33ms)
2026/09/24 11:00:11 OK 00039_2026-09-15-event-inventory-and-principals.sql (5.98ms)
2026/09/24 11:00:11 OK 00040_2026-09-15-event-dispatcher.sql (6.19ms)
2026/09/24 11:00:11 OK 00041_2026-09-15-notification-visible-outcome.sql (944.85µs)
2026/09/24 11:00:11 OK 00042_2026-09-15-workflow-advance-outcome.sql (854.16µs)
2026/09/24 11:00:11 OK 00043_2026-09-15-projection-outcome.sql (1.86ms)
2026/09/24 11:00:11 OK 00044_2026-09-15-intent-plans.sql (9.28ms)
2026/09/24 11:00:11 OK 00045_2026-09-16-intent-plan-projection.sql (3.31ms)
2026/09/24 11:00:11 OK 00046_2026-09-16-retire-demo-ten-projects.sql (980.24µs)
2026/09/24 11:00:11 OK 00047_2026-09-16-retire-demo-ten-project-sessions.sql (376.15µs)
2026/09/24 11:00:11 OK 00048_2026-09-16-software-project-bootstrap-fields.sql (11.6ms)
2026/09/24 11:00:11 OK 00049_2026-09-17-system-settings.sql (1.4ms)
2026/09/24 11:00:11 OK 00050_2026-09-17-workflow-author-only-policy.sql (2.21ms)
2026/09/24 11:00:11 OK 00051_2026-09-17-activation-token-author-only-revision.sql (329.56µs)
2026/09/24 11:00:11 OK 00052_2026-09-17-document-duty-locked.sql (450.61µs)
2026/09/24 11:00:11 OK 00053_2026-09-19-document-content-projection.sql (1.97ms)
2026/09/24 11:00:11 OK 00055_2026-09-20-project-manage-members-permission.sql (322.54µs)
2026/09/24 11:00:11 OK 00056_2026-09-20-project-create-idempotency.sql (2ms)
2026/09/24 11:00:11 OK 00057_2026-09-20-global-unique-project-name.sql (1.35ms)
2026/09/24 11:00:11 OK 00058_2026-09-20-chat-summaries.sql (1.54ms)
2026/09/24 11:00:11 OK 00059_2026-09-20-project-trace.sql (12.3ms)
2026/09/24 11:00:11 OK 00060_2026-09-21-document-canonical-task-key.sql (10.36ms)
2026/09/24 11:00:11 OK 00061_2026-09-21-material-parse-and-chunks.sql (5.05ms)
2026/09/24 11:00:11 OK 00062_2026-09-22-chat-summary-shadow-provenance.sql (2.9ms)
2026/09/24 11:00:11 OK 00063_2026-09-22-freeform-project-id-bigint.sql (3.78ms)
2026/09/24 11:00:11 OK 00064_2026-09-23-user-profile-admin-edit.sql (721.93µs)
2026/09/24 11:00:11 OK 00065_2026-09-23-system-console-perms-and-settings-audit.sql (3ms)
2026/09/24 11:00:11 OK 00066_2026-09-21-agentx-workspace-registry.sql (1.58ms)
2026/09/24 11:00:11 OK 00067_2026-09-24-user-password-reset-audit.sql (2.68ms)
2026/09/24 11:00:11 goose: successfully migrated database to version: 67
2026/09/24 11:00:11 goose: no migrations to run. current version: 67
2026/09/24 11:00:11 [kb] online=true dsn=postgres://regkb:***@127.0.0.1:5432/regulations?sslmode=disable
{"time":"2026-09-24T11:00:11.300679721Z","level":"INFO","msg":"jevdecide wired","mode":"assist","endpoint":"http://172.17.0.1:8767"}
non_author_member_access_piagent_pg_test.go:142: ✓ [1. upload] non-author member asset upload OK
non_author_member_access_piagent_pg_test.go:196: ✓ [2. run] non-author member pi-agent intake doc=doc_proj6011_bd_intake success=false title="用户初始需求收集表" pending_author=false elapsed=1h8m51s
non_author_member_access_piagent_pg_test.go:221: ✓ [3. edit] non-author member SaveDocumentContent OK
non_author_member_access_piagent_pg_test.go:236: ✓ [4. submit denied] non-author member submit → 403 DOC_DUTY_FORBIDDEN
non_author_member_access_piagent_pg_test.go:253: ✓ [5. submit author] designated author submit OK
--- PASS: TestNonAuthorMember_PiAgent_RunEditSubmitGates (4131.60s)
PASS
ok chat-agent-system/internal/server 4131.607s
260.569s