From 42944928a1cd023a2b2d0cb408d4b55c1c3ca10c Mon Sep 17 00:00:00 2001 From: Albert Date: Wed, 6 May 2026 00:03:36 +0800 Subject: [PATCH] feat(pmflow-os): connect execution capability gate --- docs/PMFLOW_PRODUCT_DELIVERY_STANDARD.md | 138 ++--- docs/architecture/ARCHITECTURE_INVENTORY.md | 1 + docs/architecture/CODE_REFERENCE_INDEX.md | 6 +- .../pmflow-os/pages/ExecutionBridgePage.tsx | 522 ++++++++++++++++-- .../src/features/pmflow-os/store.api.test.tsx | 105 ++++ frontend/src/features/pmflow-os/store.tsx | 48 +- 6 files changed, 701 insertions(+), 119 deletions(-) diff --git a/docs/PMFLOW_PRODUCT_DELIVERY_STANDARD.md b/docs/PMFLOW_PRODUCT_DELIVERY_STANDARD.md index aa0c32b0..0f76a5c8 100644 --- a/docs/PMFLOW_PRODUCT_DELIVERY_STANDARD.md +++ b/docs/PMFLOW_PRODUCT_DELIVERY_STANDARD.md @@ -765,113 +765,85 @@ commit gate 判定: 当前已完成: -**P8:Review Decision Loop 剩余消费面收口。** +**main-flow-d4-execution-runtime-capability:Execution Capability Graph 接入开发执行页。** 原因: -- Main Flow 已把 `reviewerRouting` 从“只读建议”推进到 `review request -> reviewer decision -> approval audit`,并复用 `PMFlowApproval` 形成审计记录。 -- Space 已把待审/已请求/已决策事项纳入 `/space` 的个人下一步队列,Account 已补 review decision / high-risk approval 的页面内提醒偏好合同。 -- P8 集成仍不新增战略页面,不改 router/nav,不接真实通知中心;继续使用既有 `/change-review / /team-layer / /space / /me` 表面。 +- `/execution-bridge` 已从字段调试页推进到产品化开发执行工作面,并进一步消费 `execution-capabilities`,把 `AI 直接执行 / AI 执行 + 用户验收 / AI 执行 + 技术审查 / 需要人类先补判断 / 当前不可执行` 变成首屏执行模式判定。 +- PMFlow OS store 已把 `GET /pmflow-os/projects/{project_id}/execution-capabilities` 纳入共享状态,执行交接除正式 Task gate 外,也会在 reviewer 缺失时阻断 handoff。 +- `/execution-bridge` 已展示“本次执行结果”汇总,把运行端、代码证据、测试证据、阻塞与下一步收敛成验收前判断,不把缺证据状态表达成发布成功。 -### 7.1 P8 并行建议 +### 7.1 下一步推荐 Packet:`main-flow-d5-execution-acceptance-loop` -P8 可以三条 lane 并行,但共享高冲突文件必须由 Main Flow 或 Shell / Integration 串行处理。 - -#### Main Flow Packet:`main-flow-p8-review-decision-loop` - -状态:已完成。 +状态:建议下一步。 目标: -- 把 reviewerRouting 从“只读建议”推进到“审查决策闭环”。 -- 支持对待审 ChangeSet 请求审查、记录 reviewer decision、形成 `PMFlowApproval` 审计记录。 -- 让 `ChangeReviewPage / TeamLayerPage` 展示审查状态、审查意见、高风险 approval gate 和下一步动作。 -- reviewer decision 只影响审查/approval 状态,不自动 commit ChangeSet。 -- high-risk ChangeItem 必须继续遵守 C2 approval gate。 +- 把 `execution_result_protocol_v1` 回写后的结果接到“用户验收 / 技术审查 / 发布门禁”状态流。 +- 区分 `待回写 / 执行中 / 执行受阻 / 待用户验收 / 待技术审查 / 已验收`,并让 Space next action 在验收后能收敛。 +- 技术审查模式必须保留 reviewer gate;agent / IDE / Local Bridge 回写测试通过,不等于自动完成。 +- 通过验收后再让 Release/Growth 门禁读取稳定状态,缺 PR、测试或阻塞证据时继续 fail-closed。 建议写范围: - `backend/app/api/pmflow_os_api/` -- `backend/app/services/pmflow_change_review_service.py` - `backend/app/services/pmflow_os_projection_service.py` - `backend/app/schemas/pmflow_os.py` -- `backend/tests/test_pmflow_change_review_api.py` - `backend/tests/test_pmflow_os_projection_api.py` - `frontend/src/api/pmflowOs.ts` - `frontend/src/features/pmflow-os/store.tsx` - `frontend/src/features/pmflow-os/store.api.test.tsx` -- `frontend/src/features/pmflow-os/types.ts` -- `frontend/src/features/pmflow-os/pages/ChangeReviewPage.tsx` -- `frontend/src/features/pmflow-os/pages/TeamLayerPage.tsx` -- 相关 Main Flow 文档 +- `frontend/src/features/pmflow-os/pages/ExecutionBridgePage.tsx` +- `frontend/src/features/pmflow-os/pages/ReleaseGrowthPage.tsx` +- 必要文档 禁止: -- 不新增 migration,优先复用 `PMFlowApproval`。 -- 不新增 route/nav。 -- 不改 Space / Account。 -- 不自动 commit ChangeSet。 -- 不接真实邮件、桌面推送或系统通知中心。 - -#### Space Packet:`space-p7-review-attention-queue` - -状态:已完成。 - -目标: - -- 把 Team Review 的待审事项接入 `/space` 的“我的下一步”队列。 -- 只读消费 `truth-state.reviewerRouting`;如果 Main Flow P8 已完成,再只读消费 `reviewDecision / approvalState`。 -- 展示“我需要审什么 / 哪些审查卡住了项目”,所有动作仍只跳主流程。 - -建议写范围: - -- `frontend/src/api/space.ts` -- `frontend/src/features/personal-space/` -- `frontend/src/features/personal-space/PersonalSpacePage.test.tsx` -- Space 相关文档 - -禁止: - -- 不写 ChangeSet、`PMFlowApproval`、ProgressEvent、ReleaseValidationRun、FeedbackIngest。 -- 不改 PMFlow OS、Account、router 或 bottom nav。 -- 不虚构 reviewer 或待审项。 - -#### Account Settings Packet:`account-p8-review-decision-preference` - -状态:已完成。 - -目标: - -- 扩展 Account Settings 的提醒偏好合同,增加 review decision / reviewer request / high-risk approval 相关偏好。 -- 仍然只控制页面内提醒强度,不接真实通知中心。 -- 偏好关闭只能静默强调,不得隐藏真实 reviewerRouting、approval、evidence 或 audit state。 - -建议写范围: - -- `frontend/src/api/accountSettings.ts` -- `frontend/src/features/account-settings/AccountSettingsPanel.tsx` -- `frontend/src/features/account-settings/accountSettings.test.ts` -- Account 相关文档 - -禁止: - -- 不改 PMFlow OS、Space、router 或 backend schema。 -- 不把偏好当业务权限。 - -### 7.2 P8 Integration Owner 收口 - -状态:已完成。 - -目标: - -- 检查 Main Flow / Space / Account 三个 Packet 的 `git diff --name-only` 是否越界。 -- 统一处理共享文档、API 索引和状态台账冲突。 -- 确认 P8 仍不新增战略页面,仍使用既有 `/change-review / /team-layer / /space / /me` 表面。 -- 跑 Main Flow / Space / Account focused tests、全量 typecheck/build,并在后端变更后重启 backend 确认 healthy。 -- 更新 `## 8. 进度台账`、`CODE_REFERENCE_INDEX.md`、`ARCHITECTURE_INVENTORY.md` 与必要的 `CLAUDE.md`。 +- 不执行本机命令、不推送、不发布。 +- 不自动创建正式任务。 +- 不绕过 Project Memory commit 后才能执行的边界。 +- 不把测试通过自动等同于用户验收或技术审查通过。 ## 8. 进度台账 +### 2026-05-05 / main-flow-d4-execution-runtime-capability / implemented + +完成内容: + +- PMFlow OS store 新增真实 `execution-capabilities` 查询状态,`refetchApiState` 会同步刷新 truth-state、execution-summary 与 execution-capabilities。 +- `createExecutionHandoff` 在正式任务 gate 之外新增 reviewer/capability gate:当技术审查责任缺失时阻止真实 handoff,提示先回团队层或待确认中心补齐审查责任。 +- `/execution-bridge` 首屏新增“执行模式判定”,消费 Execution Capability Graph 展示 `AI 直接执行 / AI 执行 + 用户验收 / AI 执行 + 技术审查 / 需要人类先补判断 / 当前不可执行`。 +- `/execution-bridge` 新增“本次执行结果”汇总,把运行端、代码证据、测试证据、阻塞与下一步收敛为验收前判断;缺证据时保持待回写,不进入发布成功表达。 +- 执行交接主按钮改为能力 gate:候选/草稿任务、待确认范围、缺 reviewer 会阻塞;缺 repo 时只允许生成交接草案;缺 Prompt Package 时提示生成上下文包。 +- AI 副驾从泛审查文案升级为执行裁决建议,只基于 execution-summary、execution-capabilities、progress event 与 release gate,不调用新 LLM,不编造 PR/测试/代码质量。 + +涉及文件: + +- `frontend/src/features/pmflow-os/store.tsx` +- `frontend/src/features/pmflow-os/pages/ExecutionBridgePage.tsx` +- `frontend/src/features/pmflow-os/store.api.test.tsx` +- `docs/PMFLOW_PRODUCT_DELIVERY_STANDARD.md` +- `docs/architecture/CODE_REFERENCE_INDEX.md` +- `docs/architecture/ARCHITECTURE_INVENTORY.md` + +验证: + +- `cd frontend && npx tsc --noEmit --pretty false --incremental false` 通过。 +- `cd frontend && npm run test -- src/features/pmflow-os/store.api.test.tsx -t "execution capability|technical review|execution bridge"` 通过:2 passed,32 skipped。 +- `cd frontend && npm run test -- src/features/pmflow-os` 通过:35 passed;仍有既有 React Router future flag warning。 +- `cd frontend && npm run build` 通过。 +- Playwright / Chromium 打开 `http://localhost:5176/execution-bridge?demo=1`,桌面 1440x1100 与移动 390x844 均能渲染“执行模式判定 / 本次执行结果 / 执行交接”模块;截图输出到 `output/playwright/execution-bridge-d4-desktop.png` 与 `output/playwright/execution-bridge-d4-mobile.png`。 +- 本轮只修改前端和文档,未修改后端代码、Schema 或 migration,因此未执行后端编译、数据库迁移或热重启。 + +未完成或风险: + +- 当前未接真实 Deep Agents runtime,也不执行本机命令;Execution Bridge 仍只做上下文包、handoff 合同与结果回写展示。 +- 浏览器实测中本地无后端认证导致既有 `GET /api/ai-readiness/project-launch` 401,这属于项目壳 AI readiness 本地环境问题,不影响本页模块渲染结论。 + +下一步建议: + +- 进入 `main-flow-d5-execution-acceptance-loop`:把执行结果回写接到用户验收 / 技术审查 / 发布门禁状态流,避免测试通过后仍停留在“待回写”或被误认为自动完成。 + ### 2026-05-05 / main-flow-d3-execution-bridge-productization / implemented 完成内容: diff --git a/docs/architecture/ARCHITECTURE_INVENTORY.md b/docs/architecture/ARCHITECTURE_INVENTORY.md index 057d9e07..de273ea8 100644 --- a/docs/architecture/ARCHITECTURE_INVENTORY.md +++ b/docs/architecture/ARCHITECTURE_INVENTORY.md @@ -213,6 +213,7 @@ - `frontend/src/features/pmflow-os/store.tsx` 当前是 PMFlow OS 共享 truth store:`?projectId=` 时通过 React Query 调用 `frontend/src/api/pmflowOs.ts` 读取真实 `GET /pmflow-os/projects/{project_id}/truth-state` 与 `GET /pmflow-os/projects/{project_id}/execution-summary`,真实模式下项目内 `sendMessage` 会写 thread message 并触发后端真实 AI extraction;显式 `proposed_items` extraction、ChangeItem `accept/edit/defer`、ChangeSet commit、review decision、Execution Handoff create/consume、execution progress writeback、release validation run create、release feedback ingest、单条 iteration recommendation -> ChangeSet draft 与同组 iteration recommendation 批量 -> ChangeSet draft 均调用 `/pmflow-os` 后端并 refetch;只有显式 `?demo=1` 或 `?dataSource=demo` 时才启用本地 mock 演示状态机。真实读取/动作失败会进入错误/空态,不静默 fallback 成 mock 成功;AI extraction 失败显示“结构化失败/待补充”,不创建模板 ChangeSet。 - `frontend/src/features/pmflow-os/store.tsx` 仍保留演示用项目内 AI 结构化闭环状态机:`command_idle / ai_extracting / extraction_ready / review_open / writeback_success`。`frontend/src/features/pmflow-os/pages/StructuredExtractionPage.tsx` 是本轮结构化提取页,也是结构化读取检查层:从指挥台进入时主动作进入待确认或继续补充;从 `ChangeReviewPage.tsx` 进入时通过 `origin=change_review / returnTo=change_review / changeSetId / itemId` 保留审查上下文,主动作返回待确认队列,补充证据才回指挥台;已 committed 的轮次显示为结构化写入快照并转向项目记忆或新变更链路。`ChangeReviewPage.tsx` 是决策与待确认中心,真实模式下顶部识别统计、待确认列表与右侧 AI 副驾评估都只消费后端 `changeSets / changeItems / evidence`,没有真实待审项时显示空态,禁止用 demo 审查项补位;确认写入 Project Memory 前,`pending_review / accepted / edited / deferred` ChangeItem 均可继续 accept/edit/defer,只有 `committed / skipped` 或关闭轮次不可再操作;`MemoryWritebackResultPage.tsx` 是项目记忆写入结果页,`WorkGraphPage.tsx` 是项目工作台关系总览与对象投影视图,`ExecutionBridgePage.tsx` 是执行桥上下文包、交接按钮、运行端领取确认、PR/测试与回写状态页;`ReleaseGrowthPage.tsx` 真实模式读取 `execution-summary.releaseGate`、`latestValidationRun` 与 `releaseSignals`,从 branch、commit、PR、test、failed evidence 展示 `可发布 / 阻塞 / 需要人工确认 / 缺少证据` 判断、阻塞原因、下一步动作、发布验证记录和发布后 feedback/revenue/ROI/compliance/recommendation 信号,缺少发布后信号时显示 empty/warning,不执行发布命令、不展示 mock 发布结果;页面可展示 recommendation quality grouping,把真实 recommendation 单条或同组批量生成下一轮待确认 ChangeSet draft,生成后仍进入 Change Review accept/edit/defer,不自动 commit、不写 Project Memory、不创建正式任务;`ChangeReviewPage.tsx` 会展示 `iteration_recommendation_group` evidence 的来源组、feedback 数、recommendation 数、风险、影响和审查优先级;同时读取 Account notification preference helper,用 `releaseGate` 偏好控制发布门禁强调提醒,用 `failureAlert` 偏好控制失败强调提醒,偏好关闭时只静默提醒表达强度,不隐藏 release evidence、阻塞原因、审计状态、validation run 或 releaseSignals;静态发布/增长原型只保留在显式 demo 模式。A3 已接入后端 truth-state,C1 已接入真实 message/extraction/review 状态机,C2 已接入真实 ChangeSet commit,Phase D 已接入真实 execution-summary/dev-sync,D.2 已接入 `POST /execution-handoffs` 创建 PromptPackage + handoff_created progress event,P1 已接入 `POST /execution-handoffs/{prompt_package_id}/consume` 创建 handoff_consumed progress event 并把 execution status 投影为 coding,Release Growth P1 已接入 execution evidence gate,Release Validation P1 已接入 `POST /release-validation-runs` 创建 `ReleaseValidationRun` 快照,Release Feedback P1 已接入 `POST /release-feedback-ingests` 写入 `FeedbackIngest` 并生成 `IterationRecommendation`,Iteration Loop P1 已接入 `POST /iteration-recommendations/{recommendation_id}/change-set-drafts` 把 recommendation 回流到 Change Review,Iteration Loop P2 已接入 `POST /iteration-recommendation-groups/{group_key}/change-set-drafts` 并在 `releaseSignals.recommendationGroups` 暴露分组/去重/风险/影响合同;真实 AI extraction 已接入独立 `change_review` protected scene、`pmflow_change_review_extraction_v1` 运行合同、`PROMPT_PMFLOW_CHANGE_REVIEW_EXTRACTION` Prompt 资产与后端 `llm_service.generate_structured_object`,成功时生成 open ChangeSet、pending_review ChangeItems 与 thread message evidence,失败时 fail-closed,不把 mock 当真实失败 fallback,也不复用 Project Launch draft prompt/function。`ProjectMemoryPage.tsx` 在真实模式下展示后端 `truth_nodes + semantic_facts` 的 `projectMemory` 投影,accepted/edited ChangeItem 只有 commit 成功后才进入 Project Memory。`frontend/src/features/pmflow-os/components/ProjectStructuredLoop.tsx` 提供 `StatusLabel / EvidenceSnippet / ObjectChangeCard / ProjectConversationPanel / StructuredExtractionPanel / ProjectAICopilotPanel` 等闭环组件,并复用契约化 `InlineNotice` 表达“未确认不得写入”的局部提示。 - Execution Result Protocol P1 将 Execution Bridge 的执行结果回写收敛为 `execution_result_protocol_v1`:`backend/app/schemas/pmflow_os.py` 接收 `execution_status` 与 `blocker_summary`,`backend/app/services/pmflow_os_projection_service.py` 写入 `ProgressEvent.payload.protocol_version` 与 `execution_result` envelope,同时保留 `branch_name / commit_sha / pr_number / test_summary / workflow_state` flat 字段兼容现有投影;`frontend/src/api/pmflowOs.ts` 和 `ExecutionBridgePage.tsx` 支持手动记录 status/blocker。该链路只记录 Codex/IDE/Local Bridge/GitHub agent 已产生的结果,不执行本机命令、不推送、不发布、不自动创建正式任务;`execution-summary`、`releaseGate` 与 Team Feed 均从 `ProgressEvent` 只读消费。 +- Main Flow D4 已把 Execution Capability Graph 接入 `/execution-bridge`:`frontend/src/features/pmflow-os/store.tsx` 现在读取并刷新真实 `GET /pmflow-os/projects/{project_id}/execution-capabilities`,`ExecutionBridgePage.tsx` 首屏展示执行模式判定、本次执行结果、执行链路、上下文包、回写视图和 AI 执行裁决建议;handoff 主按钮受正式 Task、待确认范围、repo/prompt package 与 reviewer gate 约束,技术审查责任缺失时 store 会阻止真实 handoff,缺 repo 时只允许表达交接草案。该层仍只做能力判定、交接合同和结果回写展示,不执行本机命令、不触发真实 agent、不自动验收、不自动发布。 - Project Knowledge Hub 读模型由 `GET /pmflow-os/projects/{project_id}/project-memory/overview`、`items`、`items/{item_id}`、`assets`、`context-packs`、`writebacks` 承载,后端在 `backend/app/services/pmflow_os_projection_service.py` 从 `truth_nodes / tasks / semantic_facts / pmflow_evidence_links / pmflow_thread_messages / pmflow_change_sets / pmflow_change_items` 聚合首页雷达、全部记忆、项目资产、上下文包和写入版本记录。前端对应 `ProjectMemoryPage.tsx`、`ProjectMemoryCollectionPages.tsx` 与 `projectMemoryUtils.ts`:列表时间使用短格式,抽屉显示完整时间和北京时间;首页卡片与二级列表单条点击打开右侧详情抽屉,展示来源证据、影响对象和 AI 执行动作跳转;全部记忆支持类型、阶段、来源、状态、搜索筛选。该读模型只读,资产可自动索引,进入项目真相层仍必须经过 Change Review 或可信规则确认。 - `frontend/src/features/account-settings/AccountSettingsPanel.tsx` 是 `/me` 设置页实现:桌面端为个人资料摘要 + 分区设置面板,移动端为分组列表 + `MobileBottomSheet` 编辑;当前覆盖个人资料、默认语言、AI 回答深度、证据展示偏好、待确认、执行回写、发布门禁和失败提醒通知偏好,并在通知偏好区展示页面内提醒消费说明、提醒强度和证据展示配置。`frontend/src/api/accountSettings.ts` 是前端合同层;有 token 时优先调用 `backend/app/api/account_settings_api/`,失败时回落浏览器本机暂存;P2 新增 `shouldShowAccountNotification` 与 `getAccountNotificationConsumption`,将四类通知偏好映射为本地 UI 的待确认、Execution Bridge、Release/Growth 和失败提醒显示/静默状态;P3 新增 `getReleaseGateNotificationPreference(settings, event)`,把 Release/Growth 的 `release_gate_* / release_validation_*` 事件映射到 `releaseGate` 偏好,把 `failed_event` 映射到 `failureAlert` 偏好;P5/P6 的 `getPostReleaseNotificationPreference(settings, event)` 把发布后 `feedback_received / revenue_signal / compliance_blocked` 映射到 `releaseGate` 偏好,把 `iteration_recommendation / next_change_review` 映射到 `pendingConfirmation` 偏好和 `change_review` surface,并返回 `spaceReadable / evidencePolicy / reminderPolicy` 供 Main Flow 与 Space 消费;P7 将通知偏好扩展为 `reminderIntensity=silent|normal|prominent` 与 `evidenceDisplay=compact|expanded`,并新增 `getAccountReminderConsumption(settings, event)` 覆盖 `change_review_high_risk / iteration_draft_ready / release_blocked / execution_stalled`,输出 `notificationTransport=in_app_only / evidencePolicy=preserve_business_evidence / auditPolicy=preserve_audit_state`;P8 新增 `getReviewDecisionNotificationPreference(settings, event)` 覆盖 `review_requested / review_approved / review_changes_requested / review_rejected / high_risk_approval_required`,继续使用 `pendingConfirmation` 偏好和 `change_review` surface,并声明 reviewerRouting、approval、evidence、audit state 均必须保留。该合同只控制页面内提醒表达,不代表邮件、桌面推送或系统通知中心已接入;偏好关闭也不得隐藏业务证据、reviewerRouting、approval、recommendation、ChangeSet、执行状态或审计状态。`backend/app/schemas/account_settings.py` 定义账号偏好合同,`backend/app/services/account_settings_service.py` 当前复用既有 `integrations` 表按 `tenant_id + user_id` 保存 `account_settings_preferences` 配置包,`backend/app/api/router.py` 已挂载该 API;未改用户表、OAuth/JWT/auth core 或 PMFlow OS truth store。 - `frontend/src/features/pmflow-os/store.tsx` 当前是 PMFlow OS 共享 truth store:`?projectId=` 时通过 React Query 调用 `frontend/src/api/pmflowOs.ts` 读取真实 `GET /pmflow-os/projects/{project_id}/truth-state` 与 `GET /pmflow-os/projects/{project_id}/execution-summary`,真实模式下项目内 `sendMessage` 会写 thread message 并触发后端真实 AI extraction;显式 `proposed_items` extraction、ChangeItem `accept/edit/defer`、ChangeSet commit、review decision、AI feedback、Execution Handoff create/consume、execution progress writeback、release validation run create、release feedback ingest 与 iteration recommendation -> ChangeSet draft 均调用 `/pmflow-os` 后端并 refetch;AI feedback 写入 `pmflow_ai_feedback_events`,在 `truth-state.aiFeedback` 恢复当前用户选择,并由后端按 `prompt_key` 生成待复核 `JudgeRun / OptimizerCandidate` 质量优化候选,用户改回赞同时挂起此前候选,Prompt Asset quality summary 会聚合 PMFlow 反馈与优化候选;只有显式 `?demo=1` 或 `?dataSource=demo` 时才启用本地 mock 演示状态机。真实读取/动作失败会进入错误/空态,不静默 fallback 成 mock 成功;AI extraction 失败显示“结构化失败/待补充”,不创建模板 ChangeSet。 diff --git a/docs/architecture/CODE_REFERENCE_INDEX.md b/docs/architecture/CODE_REFERENCE_INDEX.md index fb8cdaf3..28a57405 100644 --- a/docs/architecture/CODE_REFERENCE_INDEX.md +++ b/docs/architecture/CODE_REFERENCE_INDEX.md @@ -101,7 +101,7 @@ - SSTC 负责人推荐接口:参考 `POST /projects/{project_id}/tasks/{task_id}/recommend-assignee` - SSTC 任务更新接口:参考 `PATCH /projects/{project_id}/tasks/{task_id}` - SSTC 发布创建接口:参考 `POST /projects/{project_id}/releases` -- PMFlow OS 真实读路径、C1 Change Review API、C2 backend commit、Execution Handoff、Release Evidence Gate、Release Validation Run、Release Feedback Signal、Iteration Loop draft、Team reviewer decision loop、Execution Capability Graph 与 Team Feed 只读动态流:参考 `backend/app/api/pmflow_os_api/`、`backend/app/services/pmflow_os_projection_service.py`、`backend/app/services/pmflow_change_review_service.py`、`backend/app/services/pmflow_ai_feedback_service.py`、`backend/app/services/team_execution_capability_service.py`、`backend/app/schemas/pmflow_os.py`;只读提供 `GET /pmflow-os/projects/{project_id}/truth-state`、`GET /pmflow-os/projects/{project_id}/execution-summary` 与 `GET /pmflow-os/projects/{project_id}/execution-capabilities`,复用 `truth_nodes / tasks / semantic_facts / ai_project_control / dev_sync / users / user_projects / user_workloads / user_skill_bindings`;`truth-state.aiFeedback` 返回当前用户对 AI chat answer / structured extraction / copilot answer 的反馈事件,底表为 `pmflow_ai_feedback_events`,用于按 `scene_key / prompt_key / prompt_release_id / runtime_profile_id` 汇总 prompt 质量信号;负反馈会归因到真实 `prompt_key` 并生成待平台 AI Ops 复核的 `JudgeRun / OptimizerCandidate`,用户改回赞同时挂起此前候选,不直接改 active prompt;`execution-capabilities` 只输出执行模式、个人执行准备度、成员执行能力与容量信号、warning,不自动分配任务、不自动请求审查、不写 ChangeSet;`truth-state.reviewerRouting` 是 `{status, warningCode, summary, items}` 读模型,会从 open/pending ChangeSet、待审 item 风险、跨对象类型、evidence source、项目成员与 `OWNER / REVIEWER` 角色生成 `sourceType / riskLevel / priority / suggestedReviewer / fallbackReviewerRole / targetUrl`,并返回 `reviewDecision / approvalState / requestedAt / decidedAt / decisionReason` 审查决策只读字段;`truth-state.feed` 是 Team Feed 只读动态流,从 review request / review decision / ChangeSet 状态 / `ProgressEvent` / release gate 聚合,不写审批、不写 ChangeSet、不写通知;P8 新增 `POST /pmflow-os/change-sets/{change_set_id}/review-decisions`,支持 `request_review / approve / request_changes / reject`,复用 `PMFlowApproval` 写审计,`approve` 满足 high-risk C2 approval gate 但不自动 commit,`request_changes / reject` 不写 Project Memory;C1 写 API 包括 thread message、`POST /pmflow-os/projects/{project_id}/extractions` 的真实 AI extraction 或显式 `proposed_items` draft、ChangeSet detail、ChangeItem `accept/edit/defer`、`POST /pmflow-os/projects/{project_id}/ai-feedback` 记录 AI 回答赞同/不赞同与原因标签;AI extraction 复用 `llm_service.generate_structured_object` 与 PMFlow prompt/config/routing 层,成功时生成 open ChangeSet + pending_review ChangeItems + thread message evidence,失败时返回 `ai_extraction_failed / extraction_evidence_insufficient` 且不创建模板假结果;C2 backend 已实现 `POST /pmflow-os/change-sets/{change_set_id}/commit`,默认 `mode=atomic`,将 `Requirement / Decision / Risk` 写入 `truth_nodes`,将 `Task` 写入 `truth_nodes(node_type='task') + tasks`,高风险项强制 approval gate;commit 会持久化 `pmflow_change_sets.committed_by` 并在 commit result、truth-state 与 Project Memory writebacks 中返回 `committedBy/committedById`,写入结果页不得再用前端硬编码人员;D.2 已实现 `POST /pmflow-os/projects/{project_id}/execution-handoffs`,对已确认任务生成/复用 `PromptPackage` 并创建 `ProgressEvent(event_type='handoff_created')` 起点;P1 已实现 `POST /pmflow-os/projects/{project_id}/execution-handoffs/{prompt_package_id}/consume`,记录运行端领取、更新 `PromptPackage.package_payload.latest_handoff.handoff_state=consumed` 并创建 `ProgressEvent(event_type='handoff_consumed', derived_task_status='coding')`;Release Growth P1 已在 `execution-summary.releaseGate` 中从 branch / commit / PR / test_passed / checks_passed / failed / blocked 等 `ProgressEvent` 推导 `ready / blocked / needs_confirmation / empty`;Release Validation P1 新增 `POST /pmflow-os/projects/{project_id}/release-validation-runs`,从当前 `releaseGate` 固化 `ReleaseValidationRun` 快照并在 `releaseGate.latestValidationRun` 返回最新记录,无 evidence 时返回 `release_validation_evidence_empty`;Release Feedback P1 新增 `POST /pmflow-os/projects/{project_id}/release-feedback-ingests`,复用 `FeedbackIngest / IterationRecommendation` 写入真实发布后反馈,并在 `execution-summary.releaseSignals` 投影真实 `feedback / revenueEvents / roiSnapshots / complianceChecks / recommendations`、风险计数与 release gate / validation run / business signal types 关系;Iteration Loop P1/P2 支持 recommendation 单条或同组生成 ChangeSet draft;这些步骤均不执行发布命令、外部支付、真实推送、自动 Project Memory commit 或正式 Task 创建。 +- PMFlow OS 真实读路径、C1 Change Review API、C2 backend commit、Execution Handoff、Release Evidence Gate、Release Validation Run、Release Feedback Signal、Iteration Loop draft、Team reviewer decision loop、Execution Capability Graph 与 Team Feed 只读动态流:参考 `backend/app/api/pmflow_os_api/`、`backend/app/services/pmflow_os_projection_service.py`、`backend/app/services/pmflow_change_review_service.py`、`backend/app/services/pmflow_ai_feedback_service.py`、`backend/app/services/team_execution_capability_service.py`、`backend/app/schemas/pmflow_os.py`;只读提供 `GET /pmflow-os/projects/{project_id}/truth-state`、`GET /pmflow-os/projects/{project_id}/execution-summary` 与 `GET /pmflow-os/projects/{project_id}/execution-capabilities`,复用 `truth_nodes / tasks / semantic_facts / ai_project_control / dev_sync / users / user_projects / user_workloads / user_skill_bindings`;`truth-state.aiFeedback` 返回当前用户对 AI chat answer / structured extraction / copilot answer 的反馈事件,底表为 `pmflow_ai_feedback_events`,用于按 `scene_key / prompt_key / prompt_release_id / runtime_profile_id` 汇总 prompt 质量信号;负反馈会归因到真实 `prompt_key` 并生成待平台 AI Ops 复核的 `JudgeRun / OptimizerCandidate`,用户改回赞同时挂起此前候选,不直接改 active prompt;`execution-capabilities` 只输出执行模式、个人执行准备度、成员执行能力与容量信号、warning,不自动分配任务、不自动请求审查、不写 ChangeSet;D4 后前端 `/execution-bridge` 将该快照作为主动作 gate 的输入,技术审查责任缺失时阻止 handoff,缺 repo 时只能表达交接草案,不声称真实推送;`truth-state.reviewerRouting` 是 `{status, warningCode, summary, items}` 读模型,会从 open/pending ChangeSet、待审 item 风险、跨对象类型、evidence source、项目成员与 `OWNER / REVIEWER` 角色生成 `sourceType / riskLevel / priority / suggestedReviewer / fallbackReviewerRole / targetUrl`,并返回 `reviewDecision / approvalState / requestedAt / decidedAt / decisionReason` 审查决策只读字段;`truth-state.feed` 是 Team Feed 只读动态流,从 review request / review decision / ChangeSet 状态 / `ProgressEvent` / release gate 聚合,不写审批、不写 ChangeSet、不写通知;P8 新增 `POST /pmflow-os/change-sets/{change_set_id}/review-decisions`,支持 `request_review / approve / request_changes / reject`,复用 `PMFlowApproval` 写审计,`approve` 满足 high-risk C2 approval gate 但不自动 commit,`request_changes / reject` 不写 Project Memory;C1 写 API 包括 thread message、`POST /pmflow-os/projects/{project_id}/extractions` 的真实 AI extraction 或显式 `proposed_items` draft、ChangeSet detail、ChangeItem `accept/edit/defer`、`POST /pmflow-os/projects/{project_id}/ai-feedback` 记录 AI 回答赞同/不赞同与原因标签;AI extraction 复用 `llm_service.generate_structured_object` 与 PMFlow prompt/config/routing 层,成功时生成 open ChangeSet + pending_review ChangeItems + thread message evidence,失败时返回 `ai_extraction_failed / extraction_evidence_insufficient` 且不创建模板假结果;C2 backend 已实现 `POST /pmflow-os/change-sets/{change_set_id}/commit`,默认 `mode=atomic`,将 `Requirement / Decision / Risk` 写入 `truth_nodes`,将 `Task` 写入 `truth_nodes(node_type='task') + tasks`,高风险项强制 approval gate;commit 会持久化 `pmflow_change_sets.committed_by` 并在 commit result、truth-state 与 Project Memory writebacks 中返回 `committedBy/committedById`,写入结果页不得再用前端硬编码人员;D.2 已实现 `POST /pmflow-os/projects/{project_id}/execution-handoffs`,对已确认任务生成/复用 `PromptPackage` 并创建 `ProgressEvent(event_type='handoff_created')` 起点;P1 已实现 `POST /pmflow-os/projects/{project_id}/execution-handoffs/{prompt_package_id}/consume`,记录运行端领取、更新 `PromptPackage.package_payload.latest_handoff.handoff_state=consumed` 并创建 `ProgressEvent(event_type='handoff_consumed', derived_task_status='coding')`;Release Growth P1 已在 `execution-summary.releaseGate` 中从 branch / commit / PR / test_passed / checks_passed / failed / blocked 等 `ProgressEvent` 推导 `ready / blocked / needs_confirmation / empty`;Release Validation P1 新增 `POST /pmflow-os/projects/{project_id}/release-validation-runs`,从当前 `releaseGate` 固化 `ReleaseValidationRun` 快照并在 `releaseGate.latestValidationRun` 返回最新记录,无 evidence 时返回 `release_validation_evidence_empty`;Release Feedback P1 新增 `POST /pmflow-os/projects/{project_id}/release-feedback-ingests`,复用 `FeedbackIngest / IterationRecommendation` 写入真实发布后反馈,并在 `execution-summary.releaseSignals` 投影真实 `feedback / revenueEvents / roiSnapshots / complianceChecks / recommendations`、风险计数与 release gate / validation run / business signal types 关系;Iteration Loop P1/P2 支持 recommendation 单条或同组生成 ChangeSet draft;这些步骤均不执行发布命令、外部支付、真实推送、自动 Project Memory commit 或正式 Task 创建。 - Execution Result Protocol P1:`POST /pmflow-os/projects/{project_id}/execution-progress-events` 的最小协议在 `backend/app/schemas/pmflow_os.py` 与 `backend/app/services/pmflow_os_projection_service.py`,写入 `ProgressEvent.payload.protocol_version='execution_result_protocol_v1'` 和 `execution_result={eventType, source, status, branchName, commitSha, prNumber, testSummary, blockerSummary, repositoryFullName}`;前端合同位于 `frontend/src/api/pmflowOs.ts`,手动回写入口位于 `frontend/src/features/pmflow-os/pages/ExecutionBridgePage.tsx`。该协议只记录 Codex/IDE/Local Bridge/GitHub agent 已产生的 branch/commit/PR/test/blocker/status,不执行命令、不创建正式任务、不发布;`ExecutionSummary.releaseGate` 与 Team Feed 继续从 `ProgressEvent` 只读投影。 - Project Knowledge Hub / 项目记忆读模型:参考 `backend/app/api/pmflow_os_api/`、`backend/app/services/pmflow_os_projection_service.py`、`frontend/src/api/pmflowOs.ts`、`frontend/src/features/pmflow-os/pages/ProjectMemoryPage.tsx`、`frontend/src/features/pmflow-os/pages/ProjectMemoryCollectionPages.tsx` 与 `frontend/src/features/pmflow-os/projectMemoryUtils.ts`;只读接口为 `GET /pmflow-os/projects/{project_id}/project-memory/overview`、`items`、`items/{item_id}`、`assets`、`context-packs`、`writebacks`。首页只做知识库雷达,二级页承接全部记忆、项目资产库、上下文包、写入与版本记录,writeback 行展示真实写入人 `committedBy` 与时间;时间展示统一走 `formatProjectMemoryTime`,列表短格式、抽屉完整格式并标注北京时间;`items` 支持类型/阶段/来源/状态/搜索筛选,`assets` 支持资产类型/来源/状态/搜索筛选;单条点击打开右侧抽屉展示来源证据、影响对象和 AI 可执行跳转。资产可自动索引,但进入项目真相层仍必须经 Change Review 或可信规则确认。 - Adaptive Human Capacity:参考 `backend/app/services/adaptive_capacity_service.py`、`backend/app/models/human_capacity_override.py`、`backend/alembic/versions/20260427_add_human_capacity_overrides.py`、`frontend/src/api/pmflowOs.ts`、`frontend/src/api/space.ts`、`frontend/src/features/pmflow-os/pages/TeamLayerPage.tsx` 与 `frontend/src/features/personal-space/PersonalSpacePage.tsx`;接口为 `GET /pmflow-os/projects/{project_id}/capacity-plan`、`POST /pmflow-os/projects/{project_id}/capacity-overrides/simulate`、`POST /pmflow-os/projects/{project_id}/capacity-overrides`、`GET /pmflow-os/projects/{project_id}/capacity-overrides`,并在 `execution-capabilities.adaptiveCapacitySummary` 返回今日容量摘要。每日计划由当前任务池实时计算,不持久化固定基线;`human_capacity_overrides` 只存负责人手工调整、原因、过期时间和审计;写接口不自动派任务、不请求审查、不写 ChangeSet;旧 `/workloads*` 前端路由只兼容跳转到 `/team-layer?view=capacity`,传统工时明细不再作为用户可见一级入口。 @@ -126,9 +126,9 @@ - 个人空间首页 / 空间层入口前端产品域:参考 `frontend/src/features/personal-space/`、`frontend/src/api/space.ts` 与薄入口 `frontend/src/pages/PersonalSpacePage.tsx`;登录后路由入口为 `/space`,未登录由 `frontend/src/auth/RouteBoundary.tsx` 跳转 `/login?redirect=/space`;首屏以 `nextActionQueue` 展示“我的下一步”,并保留执行准备度、继续推进、待我确认、发布关注、发布后反馈关注、下一轮迭代草稿关注、执行中 / AI 正在推进、暂存想法、草案箱、缺项目归属补全与最近项目明细;红框三块在首页只作为工作雷达预览,暂存想法、草案箱、最近项目均最多露出少量高优先级条目,完整处理分别进入 `/space/ideas`、`/space/drafts` 与 `/space/projects?view=recent`。`frontend/src/features/personal-space/SpaceCollectionPages.tsx` 承载二级页:`/space/ideas` 支持暂存想法筛选、搜索、补充、归档与转 Project Launch 草案,`/space/drafts` 支持待确认草案筛选、搜索与回主流程确认;这些页面仍使用空间壳,不直接写项目真相层。Space 同时展示 AI readiness 客户视图卡片,管理员可从侧边栏或顶部状态进入 `/ai-config?tab=setup`。空间级 AI 管家在 `frontend/src/features/personal-space/components/SpaceAIConcierge.tsx`,入口只挂 `/space`,向现有 `/rag/ask` 注入个人空间上下文包并复用 QA session 历史能力;它只能围绕个人空间、跨项目下一步、待确认、执行中、草案、暂存想法和 AI 能力状态工作,真实写操作必须回主流程确认或跳转,不得声称已执行。全局 `Layout` 不再挂载旧 `FloatingQAChat` 悬浮球,普通后台页不显示无上下文聊天球,项目页继续使用项目级 `AI 副驾`。Space 左侧导航只承载稳定空间目的地,当前保留“空间首页”“暂存想法”“草案箱”“所有项目”和管理员“AI 使用设置”。点击项目主动作进入 `/pmflow-os?projectId=`,待确认项进入 `/change-review?projectId=&changeSetId=`,review attention 待审项进入 `/change-review?projectId=&changeSetId=`,reviewer 缺失 warning 进入已有 `/team-layer?projectId=`,执行中与执行准备度项进入 `/execution-bridge?projectId=`,发布关注和发布后反馈关注项进入 `/release-growth?projectId=`;执行失败和回写失败项进入 `/execution-bridge?projectId=`;Space 聚合项目摘要、PMFlow OS `truth-state.reviewerRouting / truth-state.releases / execution-summary.releaseGate / execution-summary.releaseSignals / execution-summary.recentProgressEvents / execution-summary.recentDeliveries / execution-capabilities` 和真实 `GET /space/saved-ideas`,并兼容读取旧 AI PMO `waiting_manual / draft_pending_confirm` 工作项;`missing_project_scope` 仅在 Space 选择项目后复用 `POST /ai-pmo/work-items/{id}/decision`,不新增旁路接口,不直接写项目真相层。缺数据时显示明确空态或 warning,不虚构 reviewer、审查意见、待审 ChangeSet、执行能力、工具连接、验证、反馈、收入、ROI、合规、iteration recommendation 或 ChangeSet draft;暂存想法是唯一允许 Space 写入的 pre-project seed,保存原始输入、来源、状态、准备度和 draft 关联,生成草案只进入 Project Launch human review;除此之外不直接写 Project Memory、ChangeSet 状态、PMFlowApproval、execution event、ReleaseValidationRun、FeedbackIngest、RevenueEvent 或 ComplianceCheckRun;空间层共享左侧栏、顶部条与空间用量组件在 `frontend/src/features/personal-space/components/SpaceChrome.tsx`,`/project-launch` 桌面首次新建壳也复用该空间 Chrome - 新项目启动台 / 首次进入页前端产品域:参考 `frontend/src/features/project-launch/` 与薄入口 `frontend/src/pages/ProjectLaunchPage.tsx`;真实模式登录后路由入口为 `/project-launch`,默认通过 `frontend/src/api/pmflowLaunch.ts` 调用后端 taskized draft job/confirm API;AI 草案创建链路是 `POST /pmflow-launch/draft-jobs -> GET /pmflow-launch/draft-jobs/{job_id} -> POST /pmflow-launch/drafts/{draft_id}/confirm`,补充一句走 `POST /pmflow-launch/drafts/{draft_id}/revise` 或创建新的 `merge_supplement` job,旧 `POST /ai-steward/project-from-text` 只返回 410 迁移错误;只有显式 `?demo=1` 或 `?dataSource=demo` 才允许匿名并启用 `mockData.ts` 本地演示状态机,真实模式的操作流、生成过程、审查建议、附件引用和计数从当前输入、job 状态与后端返回草案派生,不再使用周报 demo 文案兜底;真实模式下 AI 未就绪时先渲染 `AISetupRequiredPanel`,按权限展示记录想法、查看空间状态或平台 AI 能力处理 CTA,不提供空项目创建入口,避免在缺少结构化上下文时提前创建项目壳。401/无 token 通过 `frontend/src/lib/apiError.ts` 归一为 `auth_required/session_expired`,通过 `frontend/src/lib/pendingIntent.ts` 保留输入;`input_needs_more_info` 422 归一为 `input_invalid` 并停在补充输入失败态,用户可见失败态不得展示 `Request failed with status code 401` 或把 401 归为网络异常 - 前端身份边界与产品化错误:参考 `frontend/src/auth/RouteBoundary.tsx`、`frontend/src/lib/rbac.ts`、`frontend/src/lib/apiError.ts`、`frontend/src/lib/pendingIntent.ts`;`/space`、真实 `/project-launch`、`/me`、主链 standalone、空间管理入口与平台运营入口均在前端边界收口。空间管理入口使用 workspace role,`/platform/*` 和平台治理入口使用 `platform_context.capabilities`,后端 JWT/RBAC 仍是最终校验;pending intent 只能恢复 project launch 输入或承接已经生成好的 Project Launch draft,不允许登录后自动重放真实写请求 -- PMFlow OS 共享 truth store 与主链状态动作:参考 `frontend/src/features/pmflow-os/store.tsx`;当前支持 `?projectId=` 走 React Query 读取真实 `truth-state` 与 `execution-summary`,真实模式下 `sendMessage` 会先写 thread message,再调用 `createPMFlowExtraction` 触发后端真实 AI extraction,成功后 refetch 出 open ChangeSet / pending_review ChangeItems;显式 `proposed_items` extraction 仍保留给受控 draft 场景;ChangeItem `accept/edit/defer`、ChangeSet commit、review decision、AI feedback、Execution Handoff create/consume、execution progress writeback、release validation run create、release feedback ingest、单条 iteration recommendation -> ChangeSet draft 与同组 iteration recommendation 批量 -> ChangeSet draft 均调后端并 refetch,不本地 promote 入 Project Memory、不伪造 approval、execution event、发布验证记录、发布后信号或下一轮 draft;AI feedback 通过 `createPMFlowAIFeedback` 写入 `pmflow_ai_feedback_events` 并在 `truth-state.aiFeedback` 恢复当前用户选择;AI extraction 失败在 CommandCenter / StructuredExtraction 显示“结构化失败/待补充”,不展示模板假候选;`?demo=1` 才启用本地 mock 演示状态机和本地动作;项目内 AI 结构化闭环状态机为 `command_idle / ai_extracting / extraction_ready / review_open / writeback_success` +- PMFlow OS 共享 truth store 与主链状态动作:参考 `frontend/src/features/pmflow-os/store.tsx`;当前支持 `?projectId=` 走 React Query 读取真实 `truth-state`、`execution-summary` 与 `execution-capabilities`,真实模式下 `sendMessage` 会先写 thread message,再调用 `createPMFlowExtraction` 触发后端真实 AI extraction,成功后 refetch 出 open ChangeSet / pending_review ChangeItems;显式 `proposed_items` extraction 仍保留给受控 draft 场景;ChangeItem `accept/edit/defer`、ChangeSet commit、review decision、AI feedback、Execution Handoff create/consume、execution progress writeback、release validation run create、release feedback ingest、单条 iteration recommendation -> ChangeSet draft 与同组 iteration recommendation 批量 -> ChangeSet draft 均调后端并 refetch,不本地 promote 入 Project Memory、不伪造 approval、execution event、发布验证记录、发布后信号或下一轮 draft;D4 后 `createExecutionHandoff` 除正式 Task gate 外会读取 `execution-capabilities`,在技术审查责任缺失时阻止 handoff,避免把 agent 执行绕过 reviewer gate;AI feedback 通过 `createPMFlowAIFeedback` 写入 `pmflow_ai_feedback_events` 并在 `truth-state.aiFeedback` 恢复当前用户选择;AI extraction 失败在 CommandCenter / StructuredExtraction 显示“结构化失败/待补充”,不展示模板假候选;`?demo=1` 才启用本地 mock 演示状态机和本地动作;项目内 AI 结构化闭环状态机为 `command_idle / ai_extracting / extraction_ready / review_open / writeback_success` - Account Settings / `/me` 前端产品域与 P1-P8 偏好合同:参考 `frontend/src/features/account-settings/AccountSettingsPanel.tsx`、`frontend/src/features/pmflow-os/pages/AccountPage.tsx`、`frontend/src/api/accountSettings.ts`、`backend/app/api/account_settings_api/`、`backend/app/schemas/account_settings.py` 与 `backend/app/services/account_settings_service.py`;当前覆盖个人资料、默认语言、AI 回答深度、证据展示偏好、待确认、执行回写、发布门禁和失败提醒通知偏好,移动端使用分组列表与 bottom sheet,账户退出仍复用 `AccountControls.tsx`,不改 OAuth/JWT/auth core;P1 后端合同提供 `GET /account-settings/me` 与 `PUT /account-settings/me`,已由 `backend/app/api/router.py` 挂入核心路由组,按当前 `tenant_id + user_id` 保存账号偏好,前端有 token 时优先账号同步,后端不可用时明确回落 `仅本机暂存 / 保存失败`;P2 在 `frontend/src/api/accountSettings.ts` 提供 `shouldShowAccountNotification` 与 `getAccountNotificationConsumption`,把通知偏好映射为页面内提醒消费模型;P3 新增 `getReleaseGateNotificationPreference(settings, event)` 供 Release/Growth 后续消费:`release_gate_*` 与 `release_validation_*` 使用 `releaseGate` 偏好,`failed_event` 使用 `failureAlert` 偏好;P5/P6 的 `getPostReleaseNotificationPreference(settings, event)` 供发布后反馈与下一轮待确认消费:`feedback_received / revenue_signal / compliance_blocked` 使用 `releaseGate` 偏好,`iteration_recommendation / next_change_review` 使用 `pendingConfirmation` 偏好并落到 `change_review` surface;P7 将每类通知偏好扩展为 `reminderIntensity=silent|normal|prominent` 与 `evidenceDisplay=compact|expanded`,并新增 `getAccountReminderConsumption(settings, event)` 覆盖 `change_review_high_risk / iteration_draft_ready / release_blocked / execution_stalled`,稳定返回 `notificationTransport=in_app_only / evidencePolicy=preserve_business_evidence / auditPolicy=preserve_audit_state`;P8 新增 `getReviewDecisionNotificationPreference(settings, event)` 覆盖 `review_requested / review_approved / review_changes_requested / review_rejected / high_risk_approval_required`,统一使用 `pendingConfirmation` 偏好和 `change_review` surface,返回 `reviewerRoutingPolicy=preserve_reviewer_routing / approvalPolicy=preserve_approval_state`,偏好关闭只静默页面内提醒,不隐藏 reviewerRouting、approval、evidence 或 audit state;ReleaseGrowthPage 当前消费 `releaseGate` 与 `failureAlert` 两个偏好,只静默强调型提醒,不隐藏 release evidence、阻塞原因、审计状态、validation run、releaseSignals 或下一轮 ChangeSet draft;这些 helper 只控制本地 UI 提醒消费合同,不代表真实邮件、桌面推送或系统通知中心已接入 -- PMFlow OS 产品页入口:参考 `frontend/src/features/pmflow-os/pages/CommandCenterPage.tsx`、`StructuredExtractionPage.tsx`、`ChangeReviewPage.tsx`、`MemoryWritebackResultPage.tsx`、`WorkGraphPage.tsx`、`ExecutionBridgePage.tsx`、`ReleaseGrowthPage.tsx`、`TeamLayerPage.tsx`、`ProjectMemoryPage.tsx`、`AccountPage.tsx`;`StructuredExtractionPage.tsx` 根据 `origin=change_review / returnTo=change_review / changeSetId / itemId` 区分指挥台读取检查、待确认证据检查和已写入快照,从待确认进入时主动作必须返回 `/change-review` 原轮次,不把用户强制带回指挥台;`ChangeReviewPage.tsx` 真实模式可对当前变更集请求审查、通过、要求修改或拒绝,展示审查状态、建议审查人、审查意见和高风险审批门禁,但不自动 commit,且在确认写入 Project Memory 前允许 `pending_review / accepted / edited / deferred` ChangeItem 继续 accept/edit/defer;`TeamLayerPage.tsx` 真实模式读取 `state.reviewerRouting`、`state.feed` 与 `execution-capabilities`,以 `团队动态 / 决策台 / 角色收件箱 / 智能体工位 / AI 副驾` 展示团队协作态势、待审变更责任路由、执行能力与容量信号、个人执行准备度和工具准备度,只给责任建议、阻塞解释与跳转,不自动分派、不自动审查、不写 ChangeSet 或 Project Memory;决策台与待审路由卡片不得预留独立空白操作列,正文应使用完整卡片宽度,1-2 条路由按双列或单列密度展示;`ReleaseGrowthPage.tsx` 真实模式展示 `execution-summary.releaseGate`、execution evidence、阻塞原因、下一步动作、`latestValidationRun` 和 `releaseSignals`,缺证据或缺发布后信号时显示 empty/warning,不展示 mock 发布结果;页面可调用真实 API 创建 release validation run、摄取 release feedback,并展示真实 feedback、revenue、ROI、compliance 与 recommendation 风险态,从真实 recommendation 单条或同组批量生成下一轮待确认 ChangeSet draft;生成后仍进入 Change Review accept/edit/defer,不自动 commit、不写 Project Memory、不执行部署命令、不接外部支付、不接真实合规平台;所有真实证据和审计状态仍可见,静态高保真发布/增长数据仅保留在显式 demo 模式 +- PMFlow OS 产品页入口:参考 `frontend/src/features/pmflow-os/pages/CommandCenterPage.tsx`、`StructuredExtractionPage.tsx`、`ChangeReviewPage.tsx`、`MemoryWritebackResultPage.tsx`、`WorkGraphPage.tsx`、`ExecutionBridgePage.tsx`、`ReleaseGrowthPage.tsx`、`TeamLayerPage.tsx`、`ProjectMemoryPage.tsx`、`AccountPage.tsx`;`StructuredExtractionPage.tsx` 根据 `origin=change_review / returnTo=change_review / changeSetId / itemId` 区分指挥台读取检查、待确认证据检查和已写入快照,从待确认进入时主动作必须返回 `/change-review` 原轮次,不把用户强制带回指挥台;`ChangeReviewPage.tsx` 真实模式可对当前变更集请求审查、通过、要求修改或拒绝,展示审查状态、建议审查人、审查意见和高风险审批门禁,但不自动 commit,且在确认写入 Project Memory 前允许 `pending_review / accepted / edited / deferred` ChangeItem 继续 accept/edit/defer;`ExecutionBridgePage.tsx` 真实模式读取 `execution-summary` 与 `execution-capabilities`,首屏展示执行模式判定、本次执行结果、执行链路、上下文包、回写视图和 AI 执行裁决建议;handoff 主按钮必须受正式 Task、待确认范围、repo/prompt package 与 reviewer gate 约束,缺 repo 只能生成交接草案,技术审查责任缺失时不能发起 handoff;执行结果只汇总运行端、PR/commit、测试、阻塞和下一步,不把测试通过自动视为验收完成;`TeamLayerPage.tsx` 真实模式读取 `state.reviewerRouting`、`state.feed` 与 `execution-capabilities`,以 `团队动态 / 决策台 / 角色收件箱 / 智能体工位 / AI 副驾` 展示团队协作态势、待审变更责任路由、执行能力与容量信号、个人执行准备度和工具准备度,只给责任建议、阻塞解释与跳转,不自动分派、不自动审查、不写 ChangeSet 或 Project Memory;决策台与待审路由卡片不得预留独立空白操作列,正文应使用完整卡片宽度,1-2 条路由按双列或单列密度展示;`ReleaseGrowthPage.tsx` 真实模式展示 `execution-summary.releaseGate`、execution evidence、阻塞原因、下一步动作、`latestValidationRun` 和 `releaseSignals`,缺证据或缺发布后信号时显示 empty/warning,不展示 mock 发布结果;页面可调用真实 API 创建 release validation run、摄取 release feedback,并展示真实 feedback、revenue、ROI、compliance 与 recommendation 风险态,从真实 recommendation 单条或同组批量生成下一轮待确认 ChangeSet draft;生成后仍进入 Change Review accept/edit/defer,不自动 commit、不写 Project Memory、不执行部署命令、不接外部支付、不接真实合规平台;所有真实证据和审计状态仍可见,静态高保真发布/增长数据仅保留在显式 demo 模式 - 团队层只读动态与协作态势:`TeamLayerPage.tsx` 直接消费 `ProjectTruthState.feed` 聚合的 review request、review decision、变更集状态、execution progress 与 release gate 事件,并结合 `reviewerRouting`、`execution-capabilities` 和容量计划生成首屏摘要;前端只做空态、摘要、中文化展示和跳转,不写审批、不写 ChangeSet、不写通知,也不在真实模式 fallback 到 mock 动态。 - PMFlow OS 行为组件:参考 `frontend/src/features/pmflow-os/components/ProjectStructuredLoop.tsx`、`ProjectStageRail.tsx`、`ThreadComposer.tsx`、`ExtractionRail.tsx`、`ChangeGroupPanel.tsx`、`ObjectGraphSection.tsx`、`ContextPacketPanel.tsx`、`ExecutionTimeline.tsx`、`ReleaseGatePanel.tsx`、`TeamFeedPanel.tsx`、`ChangeReviewGroup.tsx`、`WorkbenchPanel.tsx`、`ExecutionBridgeCards.tsx`、`PMFlowOsFrame.tsx`、`AccountControls.tsx`、`FeedbackPrimitives.tsx`、`MobileBottomNav.tsx`;其中 `ProjectStructuredLoop.tsx` 承接 `StatusLabel / EvidenceSnippet / ObjectChangeCard / ProjectConversationPanel / StructuredExtractionPanel / ProjectAICopilotPanel`,`PMFlowOsFrame.tsx` 承接项目内面包屑和项目切换器,`AccountControls.tsx` 承接桌面头像菜单、退出登录确认与移动端 bottom sheet,`FeedbackPrimitives.tsx` 承接 `PageBanner / InlineNotice / HumanDecisionBar / ConfirmDialog / MobileBottomSheet`,`MobileBottomNav.tsx` 承接正式应用壳移动端固定底部导航 - PMFlow OS 原型状态回归测试:参考 `frontend/src/features/pmflow-os/store.test.ts`;真实 API 动作回归参考 `frontend/src/features/pmflow-os/store.api.test.tsx` diff --git a/frontend/src/features/pmflow-os/pages/ExecutionBridgePage.tsx b/frontend/src/features/pmflow-os/pages/ExecutionBridgePage.tsx index 4df4b618..fe098aa5 100644 --- a/frontend/src/features/pmflow-os/pages/ExecutionBridgePage.tsx +++ b/frontend/src/features/pmflow-os/pages/ExecutionBridgePage.tsx @@ -17,6 +17,7 @@ import { Send, Server, Sparkles, + ShieldCheck, Terminal, TestTube2, } from "lucide-react"; @@ -41,6 +42,11 @@ import { PacketBlock, } from "@/features/pmflow-os/components/ExecutionBridgeCards"; import { usePMFlowOsStore } from "@/features/pmflow-os/store"; +import type { + PMFlowExecutionCapabilityMode, + PMFlowExecutionCapabilitySnapshot, + PMFlowExecutionModeCapability, +} from "@/features/pmflow-os/types"; import { cn } from "@/lib/utils"; const STATUS_LABEL: Record = { @@ -86,6 +92,7 @@ const TAB_ITEMS: Array<{ key: ExecutionTabKey; label: string }> = [ type ExecutionTabKey = "changes" | "terminal" | "commits" | "pr" | "tests" | "writeback"; type PipelineTone = "done" | "current" | "waiting" | "blocked"; +type CapabilityTone = "ready" | "partial" | "blocked" | "unknown"; function isFormalDevTask(task?: PMFlowDevTask | null) { const status = String(task?.status || "").toLowerCase(); @@ -96,6 +103,122 @@ function isFormalDevTask(task?: PMFlowDevTask | null) { ); } +function primaryExecutionMode(capabilities?: PMFlowExecutionCapabilitySnapshot | null): PMFlowExecutionModeCapability | null { + if (!capabilities?.executionModes.length) return null; + const order: PMFlowExecutionCapabilityMode[] = [ + "ai_with_technical_review", + "ai_direct", + "ai_with_user_acceptance", + "needs_human_judgement", + "blocked", + ]; + return order + .map((mode) => capabilities.executionModes.find((item) => item.mode === mode && item.status === "ready")) + .find(Boolean) || capabilities.executionModes[0]; +} + +function buildHandoffGate(summary: PMFlowExecutionSummary, capabilities?: PMFlowExecutionCapabilitySnapshot | null) { + const task = + summary.activeDevTasks.find((item) => item.id === summary.execution.taskId) || summary.activeDevTasks[0] || null; + const formalTask = isFormalDevTask(task) ? task : null; + const repo = task?.code_link?.repo || summary.repoBindings[0] || null; + const technicalReviewMode = capabilities?.executionModes.find((item) => item.mode === "ai_with_technical_review"); + const reviewerMissing = + technicalReviewMode?.status === "blocked" || Boolean(capabilities?.warnings.some((item) => item.includes("reviewer_missing"))); + const pendingConfirmations = Number(capabilities?.personalReadiness.waitingForUser.pendingConfirmations ?? 0); + const prompt = summary.promptPackage; + + if (!task) { + return { + task, + formalTask, + repo, + prompt, + canCreate: false, + actionLabel: "缺少正式任务", + reason: "暂无正式开发任务,先从项目记忆形成可执行任务。", + mode: primaryExecutionMode(capabilities), + requiresTechnicalReview: false, + }; + } + if (!formalTask) { + return { + task, + formalTask, + repo, + prompt, + canCreate: false, + actionLabel: "等待写入项目记忆", + reason: "当前任务仍是候选或草稿,需要先在待确认中心写入项目记忆。", + mode: primaryExecutionMode(capabilities), + requiresTechnicalReview: false, + }; + } + if (reviewerMissing) { + return { + task, + formalTask, + repo, + prompt, + canCreate: false, + actionLabel: "先补审查责任", + reason: "当前执行模式需要技术审查责任,但 reviewer 尚未明确;请先回到团队层或待确认中心补齐审查责任。", + mode: technicalReviewMode || primaryExecutionMode(capabilities), + requiresTechnicalReview: true, + }; + } + if (pendingConfirmations > 0) { + return { + task, + formalTask, + repo, + prompt, + canCreate: false, + actionLabel: "先处理待确认", + reason: "当前项目仍有 AI 候选变更待确认,先完成 Change Review,避免执行包基于未确认范围扩散。", + mode: primaryExecutionMode(capabilities), + requiresTechnicalReview: false, + }; + } + if (!repo) { + return { + task, + formalTask, + repo, + prompt, + canCreate: true, + actionLabel: "生成交接草案", + reason: "可以生成执行交接草案,但仓库落点仍需补齐;这不会声称已经推送到真实代码环境。", + mode: primaryExecutionMode(capabilities), + requiresTechnicalReview: technicalReviewMode?.status === "ready", + }; + } + if (!prompt) { + return { + task, + formalTask, + repo, + prompt, + canCreate: true, + actionLabel: "生成上下文包", + reason: "正式任务与仓库已就绪,下一步生成开发上下文包供运行端领取。", + mode: primaryExecutionMode(capabilities), + requiresTechnicalReview: technicalReviewMode?.status === "ready", + }; + } + return { + task, + formalTask, + repo, + prompt, + canCreate: true, + actionLabel: "发起执行交接", + reason: "复用当前上下文包,并记录新的执行交接起点;代码执行仍在外部运行端完成。", + mode: primaryExecutionMode(capabilities), + requiresTechnicalReview: technicalReviewMode?.status === "ready", + }; +} + export default function ExecutionBridgePage() { const { state, @@ -103,7 +226,11 @@ export default function ExecutionBridgePage() { executionSummary, executionSummaryStatus, executionSummaryError, + executionCapabilities, + executionCapabilitiesStatus, + executionCapabilitiesError, refetchExecutionSummary, + refetchExecutionCapabilities, createExecutionHandoff, consumeExecutionHandoff, recordExecutionProgress, @@ -111,6 +238,8 @@ export default function ExecutionBridgePage() { } = usePMFlowOsStore(); const demoSummary = dataSourceMode === "demo" ? createDemoExecutionSummary(state) : null; const summary = executionSummary || demoSummary; + const demoCapabilities = dataSourceMode === "demo" && summary ? createDemoExecutionCapabilities(summary) : null; + const capabilities = executionCapabilities || demoCapabilities; const isDemo = dataSourceMode === "demo"; const isLoading = dataSourceMode === "api" && executionSummaryStatus === "loading"; const error = dataSourceMode === "api" ? executionSummaryError : null; @@ -132,10 +261,13 @@ export default function ExecutionBridgePage() { ) : null} @@ -154,12 +286,19 @@ export default function ExecutionBridgePage() { {summary ? ( <> + +
- +
@@ -178,6 +317,127 @@ export default function ExecutionBridgePage() { ); } +function ExecutionCapabilityPanel({ + capabilities, + status, + error, +}: { + capabilities?: PMFlowExecutionCapabilitySnapshot | null; + status: "idle" | "loading" | "success" | "error"; + error?: string | null; +}) { + if (status === "loading") { + return ; + } + if (status === "error") { + return ; + } + if (!capabilities) { + return ; + } + const primary = primaryExecutionMode(capabilities); + const readiness = capabilities.personalReadiness; + return ( +
+
+
+
+ + 执行模式判定 +
+

+ 这里把正式任务、工具连接、审查责任和容量信号收束成执行模式;缺条件时只能阻塞或生成草案。 +

+
+ +
+ +
+
+ {capabilities.executionModes.map((mode) => ( + + ))} +
+ +
+
+ ); +} + +function ExecutionModeCard({ mode, active }: { mode: PMFlowExecutionModeCapability; active: boolean }) { + return ( +
+
+ + {active ? 当前建议 : null} +
+
{mode.label}
+

{mode.reason}

+
+ ); +} + +function ExecutionResultSummaryPanel({ + summary, + capabilities, +}: { + summary: PMFlowExecutionSummary; + capabilities?: PMFlowExecutionCapabilitySnapshot | null; +}) { + const result = deriveExecutionResult(summary, capabilities); + return ( +
+
+
+
+ + 本次执行结果 +
+

+ 汇总运行端、PR、测试、阻塞和验收信号;缺证据时停在待回写,不进入发布成功表达。 +

+
+ +
+
+ + + + +
+ {result.blocker ? ( +
{result.blocker}
+ ) : null} +
+ ); +} + function ExecutionPipelinePanel({ summary }: { summary: PMFlowExecutionSummary }) { const counts = summary.devSync; const steps = buildPipelineSteps(summary); @@ -262,11 +522,13 @@ function PipelineStepCard({ function ContextPackagePanel({ summary, + capabilities, onCreateHandoff, onConsumeHandoff, onDemoPush, }: { summary: PMFlowExecutionSummary; + capabilities?: PMFlowExecutionCapabilitySnapshot | null; onCreateHandoff?: (payload: { task_id: string; repo_binding_id?: string | null; @@ -277,20 +539,12 @@ function ContextPackagePanel({ onDemoPush?: () => void; }) { const prompt = summary.promptPackage; - const handoffTask = - summary.activeDevTasks.find((task) => task.id === summary.execution.taskId) || summary.activeDevTasks[0] || null; - const formalHandoffTask = isFormalDevTask(handoffTask) ? handoffTask : null; - const handoffRepo = handoffTask?.code_link?.repo || summary.repoBindings[0] || null; - const canCreateHandoff = Boolean(formalHandoffTask); - const handoffNextStep = !handoffTask - ? "暂无正式开发任务,先从项目记忆生成可执行任务。" - : !formalHandoffTask - ? "当前任务仍是候选或草稿,需要先在待确认中心写入项目记忆。" - : !handoffRepo - ? "可以生成交接草案,但仓库落点仍需补齐。" - : !prompt - ? "生成开发上下文包后,运行端才能领取任务。" - : "复用当前上下文包,并记录新的执行交接起点。"; + const handoffGate = buildHandoffGate(summary, capabilities); + const handoffTask = handoffGate.task; + const formalHandoffTask = handoffGate.formalTask; + const handoffRepo = handoffGate.repo; + const canCreateHandoff = handoffGate.canCreate; + const handoffNextStep = handoffGate.reason; return (