236 lines
24 KiB
Markdown
236 lines
24 KiB
Markdown
# PMFlow 项目结构说明(CLAUDE.md)
|
||
|
||
## 1. Agent 入口文件(你关心的“进项目先读什么”)
|
||
- `AGENTS.md`:Codex/Coding Agent 的主规则入口(优先级最高的项目级约束)
|
||
- `CLAUDE.md`:面向 Claude 风格的项目说明文档(补充背景)
|
||
- 建议:规则放 `AGENTS.md`,架构/目录说明放 `CLAUDE.md`
|
||
- 当前 AI 行为的系统宪章已在 `AGENTS.md` 中升级为“事实层 / 评审层 / 生成层 / 执行层”四层分治;所有新增 AI 业务默认按该宪章接入。`CLAUDE.md` 当前承载的是“架构说明 + 运行边界 + 目录库存”,不再假定自己只包含背景说明
|
||
- 新增执行约定:计划类需求一旦确认进入实现阶段,默认连续执行到“实现完成 + 验证完成 + 统一回复验收结果”;仅在明确阻塞、高风险冲突、context 限制或用户主动中断时才中途打断。
|
||
- 新增 bugfix 执行约定:缺陷修复/回归修复允许跨多个直接相关文件端到端完成,不再按文件数硬性拆分;但必须同时满足“改动范围围绕同一根因”“不夹带无关重构”“最终附带编译/测试验证”。大功能开发或结构性重构仍优先按子任务拆分。
|
||
- 新增发布约定:凡后端代码或数据库迁移发生改动,完成编译/测试后必须继续执行当前环境对应的热部署/重启/重载步骤,确认服务已加载新版本;若当前机器不是部署环境、缺少权限或不具备热部署条件,必须在结果中明确说明未执行原因与阻塞点,禁止默认省略。
|
||
- 下面各节中大量 `新增/更新/移除` 清单用于保留“当前架构库存”和关键入口索引,不等同于运行时主规范;行为约束与禁止项仍以 `AGENTS.md` 为准。
|
||
|
||
## 2. 项目定位
|
||
- 项目名:`PMFlow / Neural Sync`
|
||
- 形态:AI 原生项目管理系统(多租户 + 角色权限 + SSTC 工作流)
|
||
- 技术栈:
|
||
- 后端:`FastAPI + SQLAlchemy + Alembic`
|
||
- 前端:`React + TypeScript + Vite + Tailwind + Radix + React Query`
|
||
|
||
## 3. 顶层目录(精简版)
|
||
```text
|
||
AIProjectManger/
|
||
├── AGENTS.md # Agent 执行规则(建议优先维护)
|
||
├── CLAUDE.md # 当前架构说明与运行边界
|
||
├── start.sh / stop.sh # 一键启动/停止入口
|
||
├── docker-compose*.yml # 容器编排
|
||
├── mdproject/ # 执行计划与任务清单(中文为主)
|
||
├── backend/ # FastAPI 后端
|
||
├── frontend/ # React 前端
|
||
├── scripts/ # 根目录运维脚本
|
||
└── docs/ # 额外文档
|
||
```
|
||
- 详细架构库存已迁到 [`docs/architecture/ARCHITECTURE_INVENTORY.md`](/Users/yuuuu/Documents/AIProjectManger/docs/architecture/ARCHITECTURE_INVENTORY.md)。
|
||
- `docs/architecture/` 当前包含:`MASTER_CONTRACT.md`、`RUNTIME_GUARDRAILS.md`、`CODE_REFERENCE_INDEX.md`、`API_CONTRACTS.md`、`DATAFLOW.md`、`TASK_BRIEF_TEMPLATE.md`、`ARCHITECTURE_INVENTORY.md`
|
||
- `docs/superpowers/plans/` 保存实现计划,`docs/superpowers/specs/` 保存需求/方案规格,`docs/task_briefs/` 保存任务包产物与验收截图。
|
||
|
||
## 4. 后端结构(`backend/`)
|
||
```text
|
||
backend/
|
||
├── app/
|
||
│ ├── api/ # 路由层(canonical 入口优先使用 *_api/ 子包)
|
||
│ ├── core/ # 配置、日志、启动与核心能力
|
||
│ ├── dependencies/ # 鉴权/租户等依赖注入
|
||
│ ├── middleware/ # 请求中间件
|
||
│ ├── models/ # SQLAlchemy 模型
|
||
│ ├── schemas/ # Pydantic 模型
|
||
│ ├── services/ # 业务服务(已目录化收敛)
|
||
│ ├── config/ # 配置与 prompt
|
||
│ └── utils/ # 通用工具
|
||
├── alembic/ # 数据库迁移真源
|
||
├── scripts/ # 后端运维/修复脚本(含历史 backfill / requirement-plan 修复)
|
||
├── tests/ # 后端回归测试
|
||
├── requirements.txt
|
||
└── Dockerfile
|
||
```
|
||
- 当前后端重点入口优先看:
|
||
- `backend/app/api/` 下的 `*_api/` 子包与聚合 router
|
||
- `backend/app/services/ai_pmo/`(AI PMO 主链、Mounted Runtime、semantic context)
|
||
- `backend/app/services/adaptive_rag_service/`(只读问答主链;`mixin_query_route_gateway.py` 负责 non-plan `query.answer` 的 internal/external/uncertain 来源合同归一化、contract 审计与显式来源回复合同;`mixin_answer_retrieval.py` 现已把 `route_mode=external` 接到独立外部查询主链;internal 路径新增 `internal_query_context.py` 里的 `InternalContextPacket` 作为 `Operation Contract -> Target Resolver -> Query DSL Plan -> 受控执行器 -> semantic facts 优先 -> verifier` 的运行时单一真源)
|
||
- `backend/app/api/rag_api/routes_route_governance.py`(manager-only 的 route/context 治理接口:`/rag/query-route-governance/summary|items|items/{id}`,只读暴露 `query_route_memories` 的 summary/list/detail)
|
||
- `backend/app/services/external_query_service/`(external `query.answer` 主链:`External Query Planner -> External Query Gateway -> External Provider Registry -> MCP 优先 -> bounded fallback live search -> verifier -> ExternalContextPacket -> ExternalAnswerPresenter`;其中 `schemas.py` 负责结构化 plan/evidence/context packet,`presenter.py` 负责 external-only 回答生成)
|
||
- `backend/app/services/mcp_config/`(MCP 模板接入中心:catalog、bundle 持久化、后端直连 runtime probe / Microsoft Learn 检索桥接、Local Bridge 接入说明与本机确认状态)
|
||
- `backend/app/services/semantic_fact_service/`(semantic facts 读模型、八类业务对象统一抽取/失活、ORM 提交钩子入队、治理看板查询)
|
||
- `backend/app/api/semantic_facts_api/`(semantic facts 治理后台接口:overview / objects / detail / reextract / backfill)
|
||
- `backend/app/api/mcp_api/`(MCP 模板接入中心后台接口:catalog / servers / validate / confirm-client-apply)
|
||
- `backend/app/services/llm_service/`(显式 `routing_meta` 协议)
|
||
- `backend/app/services/integrations/feishu_integration_service/`(飞书入站与卡片回调)
|
||
- `backend/app/services/signal/`(信号接入、编排、planner、repair)
|
||
- 本轮新增的问答路由审计存储为 `backend/app/models/query_route_memory.py`,通过 `backend/alembic/versions/20260415_add_query_route_memories.py` 建表;只用于 route audit / feedback 回灌 / 离线评估,不做在线自动调参。
|
||
- 本轮新增的语义事实读模型为 `backend/app/models/semantic_fact.py` 与 `backend/app/models/semantic_fact_extraction_run.py`,通过 `backend/alembic/versions/20260415_add_semantic_facts.py` 建表;用于内部查询的 facts-first 命中与异步抽取审计。
|
||
- 本轮新增的外部查询 fallback 与展示回归测试位于 `backend/tests/test_external_query_planner.py`、`backend/tests/test_mcp_external_query_bridge.py` 与 `backend/tests/test_adaptive_rag_mainline_contract.py`;它们一起锁定“Query Route Gateway 不再跑 runtime probes、External Query Planner fallback 不再按对象重分类、external answer presenter 不再回流 `industry_trend/external_trend`、external freshness follow-up 不再靠硬编码词表”。
|
||
- 详细目录迁移、兼容壳清理与新增模块清单见库存文档。
|
||
|
||
## 5. 前端结构(`frontend/`)
|
||
```text
|
||
frontend/
|
||
├── e2e/ # Playwright 真实浏览器 E2E 用例
|
||
├── src/
|
||
│ ├── api/ # 接口封装
|
||
│ ├── pages/ # 页面级组件(已目录化)
|
||
│ ├── components/ # 通用组件与 SSTC/Inbox 共享组件
|
||
│ ├── hooks/ # 自定义 hooks
|
||
│ ├── lib/ # 通用工具
|
||
│ ├── stores/ # 状态管理
|
||
│ ├── router/ # 路由
|
||
│ └── types/ # TS 类型定义
|
||
├── package.json
|
||
├── playwright.config.ts
|
||
└── vite.config.ts
|
||
```
|
||
- 当前前端重点入口优先看:
|
||
- `frontend/src/api/`(统一 API 封装)
|
||
- `frontend/src/pages/inbox/`(消息台)
|
||
- `frontend/src/pages/ai-steward/`(AI 管家)
|
||
- `frontend/src/pages/ai-config/mcp-config/`(AI Config -> Governance Tools 下的 MCP 模板接入中心)
|
||
- `frontend/src/pages/query-route-governance/`(AI Config -> Governance Tools 下的 route/context 治理页)
|
||
- `frontend/src/pages/semantic-facts-board/`(AI Config -> Governance Tools 下的 semantic facts 治理页)
|
||
- `frontend/src/api/queryRouteGovernance.ts`(route/context 治理页前端 API)
|
||
- `frontend/src/pages/scheduler-center/`(Mounted AI Console)
|
||
- `frontend/src/components/sstc/`(SSTC 工作流组件)
|
||
- 页面目录化、Mounted AI Console、Inbox、AI Steward 与 Recipes/Projects/Users 等模块化拆分的详细库存见库存文档。
|
||
|
||
### 5.1 `frontend/src/components/sstc/` 目录说明(模块化拆分后)
|
||
- `SSTCWorkspace.tsx`:SSTC 工作区主容器(组装各阶段组件)
|
||
- `useSSTCWorkspaceOrchestration.ts`:工作区编排 Hook(状态聚合、请求编排、事件路由)
|
||
- `sstcUtils.ts`:SSTC 工具函数(数据转换、状态判断、通用 helper)
|
||
- `SSTCSignalStagePanel.tsx`:信号阶段面板
|
||
- `SSTCCharterStagePanel.tsx`:宪章阶段面板
|
||
- `SSTCTaskStagePanel.tsx`:任务阶段面板
|
||
- `SSTCExecutionBoardPanel.tsx`:执行看板阶段面板
|
||
- `SSTCReleaseStagePanel.tsx`:发布阶段面板
|
||
- `SSTCReviewStagePanel.tsx`:复盘阶段面板
|
||
- `SSTCTaskCreateDialog.tsx`:任务创建弹窗
|
||
- `SSTCReleaseCreateDialog.tsx`:发布创建弹窗
|
||
- `SSTCReviewCreateDialog.tsx`:复盘创建弹窗
|
||
- `AIVisibilityPanel.tsx`:AI 可视化信息面板
|
||
- `FeedbackSummaryCard.tsx`:反馈中心摘要卡片(任务阶段/执行看板复用)
|
||
- `SSTCGlobalHeader.tsx`:SSTC 全局头部
|
||
- `SSTCStageNav.tsx`:阶段导航
|
||
- `SSTCChainView.tsx`:链路视图
|
||
- `SSTCRiskFloatPanel.tsx`:风险浮层
|
||
- `SignalContentHoverCard.tsx`:信号内容悬浮卡片
|
||
- `charterModules.ts`:宪章模块配置与映射
|
||
|
||
### 5.2 修改前必须执行 `FIND_USAGE` 的 SSTC 组件清单
|
||
- `SSTCWorkspace.tsx`
|
||
- `useSSTCWorkspaceOrchestration.ts`
|
||
- `sstcUtils.ts`
|
||
- `SSTCCharterStagePanel.tsx`
|
||
- `SSTCSignalStagePanel.tsx`
|
||
- `SSTCTaskStagePanel.tsx`
|
||
- `SSTCExecutionBoardPanel.tsx`
|
||
- `SSTCReleaseStagePanel.tsx`
|
||
- `SSTCReviewStagePanel.tsx`
|
||
- `SSTCReleaseCreateDialog.tsx`
|
||
- `SSTCReviewCreateDialog.tsx`
|
||
- `SSTCTaskCreateDialog.tsx`
|
||
|
||
## 6. 运行命令(高频)
|
||
### 根目录
|
||
```bash
|
||
./start.sh dev # 推荐:docker-dev 热更新模式
|
||
./stop.sh dev
|
||
./devops/tunnel/start.sh # 公网穿透启动器(独立入口)
|
||
./scripts/start_model_probe.sh # 独立模型连通性检测(中文日志)
|
||
```
|
||
|
||
- 启动入口收敛:仅保留 2 个用户入口
|
||
- 正常启动器:`./start.sh`
|
||
- 公网穿透启动器:`./devops/tunnel/start.sh`
|
||
- 运行脚本、模型探针、契约校验与 E2E 工具清单已迁到 [`docs/architecture/ARCHITECTURE_INVENTORY.md`](/Users/yuuuu/Documents/AIProjectManger/docs/architecture/ARCHITECTURE_INVENTORY.md)。
|
||
- 当前新增的 requirement-plan 历史修复工具位于 `backend/scripts/repair_requirement_plan_history.py`,默认 dry-run,仅在显式 `--apply` 时写回 `mounted_draft_workspaces / mounted_topic_workspaces`。
|
||
|
||
### 前端
|
||
```bash
|
||
cd frontend
|
||
npm run dev
|
||
npm run build
|
||
npm test
|
||
npm run e2e:feishu
|
||
```
|
||
|
||
### 后端(本地直跑)
|
||
```bash
|
||
cd backend
|
||
pip install -r requirements.txt
|
||
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
||
```
|
||
|
||
## 7. 团队维护建议(简版)
|
||
- 规则变更:只改 `AGENTS.md`
|
||
- 结构变更:同步改 `CLAUDE.md` + `docs/architecture/ARCHITECTURE_INVENTORY.md`
|
||
- 运行边界 / 已知 runtime 假设变更:同步改 `AGENTS.md` + `docs/architecture/RUNTIME_GUARDRAILS.md`
|
||
- API/契约变更:后端 `schemas` + 前端 `types` 同步更新
|
||
|
||
## 8. 服务边界约束(禁止越界)
|
||
- 当前必须立即遵守的摘要规则以 `AGENTS.md` 第 8 节为准。
|
||
- 长运行边界、跨链路守门细节、失败语义和已知 runtime 假设已迁到 [`docs/architecture/RUNTIME_GUARDRAILS.md`](/Users/yuuuu/Documents/AIProjectManger/docs/architecture/RUNTIME_GUARDRAILS.md)。
|
||
- 当前最重要的摘要只保留:
|
||
- 写操作必须经 Alembic / 受控执行器 / outbox / 审计日志,禁止业务路径直写或同步直发。
|
||
- 用户可见核心业务内容禁止 fallback、stub、模板句冒充成功;失败必须显式失败或标记待确认。
|
||
- MCP 模板接入中心只保存模板参数、命令预览、runtime probe 和手动确认状态;`backend_direct` 模板可由 PMFlow 后端直连(远程 `streamable_http` MCP 或内建 `backend_adapter` runtime),`stdio` 模板只能走 Local Bridge / 兼容 MCP host;禁止从服务端直写宿主机 `~/.codex/config.toml` 或替客户执行本机命令。
|
||
- 运行时业务动作归因统一走“对象/上下文绑定 -> `SemanticContextPacket` -> `SemanticDecision` -> gatekeeper”。
|
||
- `backend/app` 运行时代码禁止恢复散落的中文关键词、正则、`looks_like_*`、`*_HINTS/*_KEYWORDS` 业务拍板逻辑。
|
||
- `llm_service` 只认显式 `routing_meta` 协议,不再靠函数名或 hint 推断 tier / contract / fallback。
|
||
- 内部只读查询必须走 `Operation Contract -> Target Resolver -> Query DSL Plan -> InternalContextPacket -> 白名单受控执行器 -> semantic facts 优先 -> verifier`,其中 mainline 要先做 packet 预检,`query_semantics` 只作上游 scratchpad/兼容镜像并且只允许单点兼容写回;禁止继续充当 internal executor 或 verifier 的运行时真源,同时禁止自由 SQL 和无证据脑补。
|
||
- `semantic_facts` 自动抽取统一走 ORM 提交钩子 -> `ingest_events(channel=semantic_fact_extract)` -> 统一 worker,支持 `project/task/signal/document/user/requirement/release/review` 八类对象;禁止在各路由散落手工 enqueue。
|
||
- AI Steward、Requirement Plan、Signal Source、AdaptiveRAG 等核心链路的详细 guardrails 统一以 `RUNTIME_GUARDRAILS.md` 为准。
|
||
|
||
## 9. 新增代码的参考模式
|
||
- 详细的接口、页面与服务参考入口已迁到 [`docs/architecture/CODE_REFERENCE_INDEX.md`](/Users/yuuuu/Documents/AIProjectManger/docs/architecture/CODE_REFERENCE_INDEX.md)。
|
||
- 当前只保留高价值摘要:
|
||
- 新增后端接口:优先参考 `backend/app/api/sstc_api/` 的结构
|
||
- 新增前端 API 调用:优先参考 `frontend/src/api/sstc.ts`
|
||
- 新增数据库表:参考 `alembic/versions/` 最新 migration
|
||
- 新增飞书事件处理:参考 `backend/app/services/integrations/feishu_integration_service/`
|
||
- 更细的 AI Steward / RAG / AI PMO / Signal / SSTC / 前端页面入口索引统一以 `CODE_REFERENCE_INDEX.md` 为准
|
||
|
||
## 10. 幂等与事务约束
|
||
- 所有入站事件必须经过 `ingest_events` 幂等去重
|
||
- 飞书回复必须经过 `feishu_reply_outbox`,禁止同步直接发送
|
||
- 飞书回复发送幂等:`reply_hash = MD5(source_message_id + reply_text)`,同租户下 `status=sent` 的相同哈希不得重复发送
|
||
- 跨表写操作必须在同一个数据库事务内完成
|
||
|
||
## 11. 已知 BOUNDARY(不要幻构行为)
|
||
- 详细已知运行边界与环境假设统一维护在 [`docs/architecture/RUNTIME_GUARDRAILS.md`](/Users/yuuuu/Documents/AIProjectManger/docs/architecture/RUNTIME_GUARDRAILS.md)。
|
||
- 当前高价值摘要只保留:
|
||
- 飞书回调字段可能缺失文件名/大小,仅保证 `attachment_id/key/type` 可用。
|
||
- 真实飞书网页 E2E 依赖本机已登录的 Chrome/Feishu 会话,结果校验统一走数据库探针。
|
||
- 路由配置唯一真源固定为 `backend/.control_plane/pmflow-routing-rules.json`;请求超时统一以 `LLM_REQUEST_TIMEOUT` 为准。
|
||
- World Model 静态层已接入 Redis 缓存(`wm:static:{tenant_id}:{project_id}`,TTL 600s),写操作后主动 invalidate,动态层不缓存。
|
||
- `signal_sources` 仅作为 AI Steward 创建结果区的内联展示;项目看板与 SSTC 信号阶段统一只读正式 `Signal`。
|
||
|
||
## 12. 技术债务清单
|
||
- [x] `mixin_auto.py` `_safe_int` NameError:已通过显式导入 `_safe_int` + 回归测试锁定,避免后续共享导出调整导致运行时未定义
|
||
- [x] AI 入口主链已统一:飞书长连接(`capture_from_feishu`)、`/ai-pmo/process-text` 与 `/rag/ask` 已统一收敛到 `AIPMOKernelService.process_ingress` 主链;`/rag/ask` 通过 `rag_ask_contract.build_kernel_ingress_kwargs` 透传 RAG 上下文(`session_id/new_session/thinking_mode/action_mode/...`),query 执行后由 `build_rag_response_payload` 保持 HTTP 响应兼容,回归由 `test_rag_route_contract.py`、`test_ai_pmo_qa_http_mainline_e2e.py`、`test_ai_pmo_ingress_mainline.py` 锁定
|
||
- [x] 飞书入口层耦合已收敛:飞书真实入口已拆为三段职责链(预处理 `mixin_receive_prepare.py` / capture 执行 `mixin_receive_capture_flow.py` / 编排 `mixin_receive.py`);`mixin_receive.py` 不再混合传输解析、附件标准化、capture 异常兜底与收尾回执逻辑,分层边界通过 `test_feishu_receive_orchestration_contract.py` 锁定
|
||
- [x] `task.create` 已升级为一等 typed intent:`IntentResolver/RouteResolver` 新增 `task.create` 常量与 `task.create` 路由族;TypedExecutor 已接入任务落库执行(含 `project_id`/任务标题槽位守卫、对齐 Charter 校验、`persist_task` 写入);`WorkflowRegistry`、`ReplyRenderer`、`followup` 校验与草稿确认闭环已纳入 `task.create`;并补 `test_ai_pmo_task_intent_contract.py` 回归锁定
|
||
- [x] `task.create` 已接入消息级幂等账本:Feishu `source_message_id/feishu_message_id` 作为 `task.create` 账本 key,重复确认只回放同一结果,不再重复落库;回归由 `test_feishu_pipeline_queue_contract.py` 锁定
|
||
- [x] `signal_source.onboard` 已接入消息级幂等账本:TypedExecutor 以 `source_system + source_message_id` 作为 onboarding ledger key,重复提交只回放同一结果,不再重复跑信号源接入编排;回归由 `test_ai_pmo_signal_source_onboard_contract.py` 锁定
|
||
- [x] AdaptiveRAG 职责已完成首轮收敛:`answer_question` 入口已分层为 `prepare runtime` 与 `base mainline` 两段,写确认逻辑通过 `_should_trigger_write_ack_gate` 独立门控;基础问答主路径不再与写确认判断混写在同一函数体。分层契约由 `test_adaptive_rag_mainline_contract.py` 锁定(read 绕过 ack、write 命中 ack、feishu write 维持主链)
|
||
- [x] 执行层已形成统一执行账本与参数来源约束:ingress 执行路径统一通过 `KernelIngressStorageMixin` 生成 `execution_result.action_contract`(固定 `param_source=decision.execution_plan.actions+workflow_route+execution_result`)并写入 `operation_execution_ledger`(`applied/pending_manual/pending_confirmation/failed`);`mixin_auto.py`、`mixin_prepare_manual.py` 的 `operation_code` 日志来源已对齐 `action_contract`,回归由 `test_ai_pmo_execution_ledger_contract.py` 锁定
|
||
- [x] QA/RAG 路由契约双轨已收敛:`/ai-steward/rag/ask` 兼容入口已移除,问答统一收敛到 `POST /rag/ask`;参数构造与 tenant 解析收口在 `backend/app/api/rag_ask_contract.py`,前端 `FloatingQAChat` 与 Context Cache API 目录均已对齐,`backend/tests/test_rag_route_contract.py` 与 `backend/tests/test_context_cache_profile_catalog.py` 已锁定回归
|
||
- [x] 三模式交互上下文基线已显性化:`/rag/ask`、QA session detail 与 session state replay 现统一透出 `route_decision / clarification_code / clarification_candidates / answer_mode / grounding_status / evidence_pack`;前端 `FloatingQAChat` 新增 `QAConversationStatusBar` 与 `QAResponseMetaCard`,显式展示当前对象、来源模式、证据状态与澄清按钮;`/ai-pmo/process-text` 与 `GET /ai-pmo/work-items` 现同步投影 `plan_mode / plan_status / requirement_plan_context_summary` 到 Inbox 展开区,回归由 `test_ai_pmo_qa_http_mainline_e2e.py`、`test_ai_pmo_ingress_mainline.py`、`FloatingQAChat.test.tsx`、`InboxListItem.test.tsx` 锁定
|
||
- [x] AI 管家浮窗交互已与 Grounding Runtime 对齐:回答区已切到 markdown 渲染,顾问标签升级为显式交互按钮;`consultant_mode_preference` 只用于 `/rag/ask` 内部重答,`允许执行` 明确交接到 `/ai-pmo/process-text`,避免 query/execute 边界回退到旧的一锅煮
|
||
- [x] Retrieval source registry / metadata 已统一:AdaptiveRAG 检索链已建立统一 source registry / metadata normalizer,`citations[]/sources_used[]` 直接消费标准字段 `source_type/source_id/chunk_id/target_url/project_id/updated_at/permission_scope/source_priority`;`doc/url/feishu/pmflow/graph/db` 的来源元数据与排序键已收口,并由 `test_rag_route_contract.py`、`test_adaptive_rag_mainline_contract.py` 锁定
|
||
- [x] 语义治理 baseline 已清零:`backend/app` 运行时代码中的 `looks_like_* / *_HINTS / *_KEYWORDS` 残留已清空,主链统一改为对象/上下文绑定 + `SemanticContextPacket -> SemanticDecision -> gatekeeper`;`scripts/semantic_lint_baseline.txt` 已清空,并由 `scripts/semantic_lint.py` 与 `backend/tests/test_semantic_lint.py` 做仓库级守门
|
||
- [x] 结构化 runtime 收口回归已补齐:`backend/tests/test_runtime_structured_semantics_contract.py` 额外锁定 `backend/app` 运行时代码里 `_is_question_like / _is_project_lookup_question / _is_capability_question / classify_intent_complex` 等旧语义拍板残留不得回流;`backend/tests/test_feishu_pipeline_queue_contract.py` 同步覆盖 `followup` 线程锚点优先与 signal capture 不再依赖问句词法兜底
|
||
- [ ] 历史 Feishu 队列 / `feishu_items` 兼容链仍未完全退场:飞书真实入口、卡片动作、文本 queue followup,以及 `project_knowledge_graph` 的主增量/API 命名都已切到 `work_item` 主链;当前剩余债务主要是 `feishu_items` 存量读链路、历史 pending 事件兼容消费,以及 legacy `feishu_delta` 证据/回放兼容壳。后续需在历史存量清空后正式封存该兼容层
|
||
- [x] AdaptiveRAG 向量检索 legacy fallback 已移除:`AdaptiveRAGRetrievalVectorMixin._retrieve_vector_context()` 现在只支持 PostgreSQL/pgvector 主路径;非 PostgreSQL 或 PG 查询失败时直接返回空结果,不再回退 Python 侧 legacy 扫描,边界由 `test_adaptive_rag_mainline_contract.py` 锁定
|
||
- [x] 历史 Alembic 链幂等性缺陷已修复:`add_users_table_rbac.py` 的 PostgreSQL ENUM 创建已改为显式创建 + 列类型 `create_type=False` 复用,`userrole/userstatus` 不再在同一条 migration 内重复建型;回归由 `test_add_users_table_rbac_migration.py` 锁定
|
||
- [ ] 食谱图片上传仍是示例桩实现:`backend/app/services/recipe/service.py` 仍以模拟 URL 代替对象存储,`POST /recipes/upload-image` 也还停留在示例接口形态;若该模块继续保留,需要补齐真实对象存储接入、租户隔离与统一 `{code,message,data}` 响应包络,否则应明确标注为非核心示例模块
|
||
- [x] LLM 运行时仍未完全收敛:`ai_service_core._invoke_with_retry` 与 `stream_chat` 已统一走 `llm_service`;旧 `_get_llm` 路径已显式禁用,并补回归测试锁定
|
||
- [x] QA 主链自动化测试覆盖已补齐:`backend/tests/` 已覆盖问答/RAG 主路径与关键场景;新增 `test_ai_pmo_qa_http_mainline_e2e.py` 通过 HTTP 层锁定 `/rag/ask` 的 `qa_readonly/mixed` 契约以及 `/ai-pmo/process-text` 的 `draft_pending_confirm` 主链返回,配合 `test_ai_pmo_ingress_mainline.py`、`test_ai_pmo_task_intent_contract.py`、`test_ai_pmo_tactical_brain_contract.py` 形成稳定回归基线
|
||
- [x] 飞书交互闭环已补齐:执行场景回执在 `draft_pending_confirm/pending_manual` 下优先生成按钮卡片并经 outbox 异步发送;`card.action.trigger` 已覆盖 `confirm/revise/cancel/continue` 回调分发,分别复用 `DraftConfirmHandler.handle_api_decision` 与 AI PMO `process_ingress` 主链继续执行;回调 HTTP 现在会同步返回 toast 反馈,确保点击按钮后至少有可见结果;`backend/tests/test_feishu_card_action_contract.py` 已补卡片构造与 `continue` 回归契约
|