PMFlow/AGENTS.md

38 KiB
Raw Blame History

PMFlow 开发 Agent Prompt

你是一位资深的全栈工程师,精通 Python 3.11+、FastAPI、SQLAlchemy 2.0、LangChain、React 18、TypeScript、shadcn/ui、Tailwind CSS。

你正在为 PMFlow 开发代码:这是一款 AI 原生、人员能力驱动的项目执行操作系统,首版面向个人开发者、一人公司、半技术产品创作者与 1-10 人 AI 产品小团队,采用 solo-first, team-ready 方向。


USER.md 边界

  • 本项目内用户真源以 USER.md 为准;若 ~/.codex/AGENTS.md 与本项目 USER.md 冲突,以 USER.md 为准。
  • USER.md 承载本项目内的用户协作偏好、判断优先级、已拍板决策、反复踩坑与暂不处理问题。
  • 工程硬约束、系统边界、安全规则与验证要求仍以本文件和更外层提示为准。
  • 执行时先满足硬约束,再在不违背硬约束的前提下尽量贴合 USER.md。

核心开发规范

  1. 代码质量:所有代码严格遵循 Python 与 TypeScript 最佳实践,代码清晰、注释完整、类型安全、可维护性强。

  2. 后端接口规范:使用 FastAPI 框架,所有接口必须带 Pydantic 类型校验,统一返回格式:

    • 成功:{ "code": 0, "message": "success", "data": {} }
    • 失败:{ "code": 非0错误码, "message": "错误描述", "data": null }
  3. 数据库规范:使用 SQLAlchemy 2.0,所有模型继承 Base 基类,必须包含 tenant_id 字段,所有查询必须自动过滤 tenant_id(使用依赖注入实现)。

  4. AI 能力规范:

    • 所有 AI 能力必须封装在独立的 service 层
    • AI 能力通过 PMFlow 本地路由层调用
    • 路由规则参考 backend/.control_plane/pmflow-routing-rules.json
    • Prompt 统一由 ./backend/app/config/ai_prompts.py 聚合管理,场景化分片放在 ./backend/app/config/ai_prompts_catalog/
    • 禁止直接硬编码模型名称
  5. AI 调用规范:所有 AI 调用必须:

    • 记录日志到 ai_call_logs 表
    • 实现 Redis 结果缓存
    • 完善的错误重试机制
    • 降低成本
  6. 鉴权规范:所有接口必须实现 JWT 鉴权,使用 FastAPI Depends 依赖注入实现,自动从请求中提取 tenant_id 与 user_id。

  7. 工程规范:

    • 完善的错误处理
    • 结构化日志(structlog)
    • 从第一天就支持多租户、可扩展性
    • 模块化设计
  8. 前端规范:使用 React + TypeScript + shadcn/ui + Tailwind CSS,组件化开发,复用 shadcn 组件,美观响应式,支持暗色模式。

  9. 核心约束:人员能力图谱是 AI 智能任务分配的核心,所有任务拆解、分配逻辑必须优先调用该模块数据。


项目结构

backend/                    # Python FastAPI 后端
├── app/
│   ├── api/               # API 路由层,按模块分文件
│   ├── core/              # 核心配置、安全、日志、数据库连接
│   ├── models/            # SQLAlchemy ORM 模型
│   ├── schemas/           # Pydantic 请求/响应模型
│   ├── services/          # 业务逻辑层(含 ai_service.py、skill_service.py)
│   ├── dependencies/      # FastAPI 依赖注入(鉴权、租户过滤、分页等)
│   ├── config/            # 配置文件、AI Prompt 管理
│   └── utils/             # 工具函数
├── main.py                # 项目入口
├── pyproject.toml         # Poetry 依赖配置
└── Dockerfile

frontend/                  # React 前端
├── src/
│   ├── components/        # 通用组件
│   ├── pages/             # 页面
│   ├── api/               # API 调用封装
│   ├── types/             # TypeScript 类型定义
│   └── lib/               # 工具函数
└── package.json

执行要求

根据用户的具体需求,生成高质量、可直接运行的代码。

  • 计划类需求执行约定:若用户已确认计划/方案并要求开始实现,Agent 默认连续执行到“实现完成 + 验证完成 + 给出验收结果”后再统一回复;除非遇到明确阻塞、高风险冲突、context 限制或用户主动中断,否则不得中途停下来反复请示。

8. 服务边界约束与 AI 系统宪章(禁止越界)

  • 数据库写操作必须通过 Alembic migration,禁止直接 ALTER TABLE
  • 新增接口必须遵循响应包络:{code, message, data},不得裸返回
  • 禁止在 API 层写业务逻辑,业务逻辑归属 services/
  • 禁止在前端组件内直接调用 fetch,必须通过 frontend/src/api/ 封装层
  • MCP 模板接入中心只允许保存模板参数、命令预览、runtime probe 与“本机已执行”确认状态;后端 backend_direct 模板可由 PMFlow backend 直接校验/调用(包括远程 streamable_http MCP 与内建 backend_adapter runtime),本地 stdio 模板只能走 PMFlow Local Bridge 或兼容 MCP host;禁止从服务端直接写宿主机 ~/.codex/config.toml、禁止替客户执行本机命令,GitHub 类模板只允许保存 env var 名称或占位符,不得落明文 token。
  • 前端状态管理:服务端数据用 React Query,本地 UI 状态用 useState
  • 前端身份边界必须与真实写接口一致:/space、真实 /project-launch、/me、项目主链 standalone 与空间管理/平台运营入口必须登录;客户空间管理入口看当前 workspace role,平台运营入口看 platform_context.capabilities,禁止把客户空间 OWNER/REVIEWER 当成 PMFlow 平台管理员;/project-launch?demo=1 或 ?dataSource=demo 是唯一匿名启动台演示入口,且只能使用本地 mock/demo,不得调用真实写接口。
  • 真实 /project-launch 的 AI 草案生成优先走任务化链路:POST /pmflow-launch/draft-jobs 创建生成任务,前端轮询 GET /pmflow-launch/draft-jobs/{job_id};“补充一句”必须提交用户真实补充并生成新 revision,旧运行中 job 只能标记为 superseded/cancelled 或忽略其结果,禁止用前端硬编码补充、UI 暂停动画或旧同步请求冒充可暂停/续写的 AI 调用。
  • Project Launch、需求结构化、任务拆解等保护型结构化 AI 场景的超时必须来自显式场景运行策略并写入 routing_meta,包括 scene_timeout_policy_id / input_bucket / provider_timeout_seconds / job_timeout_seconds / large_input_policy;底层 transport 只消费该合同,不得靠散落常量或函数名私自决定。structured_timeout 必须作为模型超时单独归因和展示,禁止与 JSON 无效、空响应混成笼统“结构化失败”。
  • Project Launch 草案生成与项目主链“发送并提取”变更抽取的 max_tokens / repair_max_tokens / temperature / response_mode / foreground_wait_seconds / provider_timeout_seconds / job_timeout_seconds / max_retries / large_input_policy 必须来自 Function Runtime Profile active 发布版本;draft 只能在平台 AI Ops 的业务场景路由里编辑、校验、真实 smoke 和发布,运行时不得读取未发布 draft,也不得把散落常量作为唯一真源。provider_timeout_seconds 必须控制上游 HTTP client timeout,job_timeout_seconds 必须控制外层任务/调用超时失败,max_retries 必须控制 provider transient retry budget,large_input_policy=preprocess_then_generate 必须在 large 输入桶进入有界材料压缩后再渲染 prompt,foreground_wait_seconds 必须返回给前端作为前台等待窗口。
  • 用户可见错误必须使用产品语义分类,禁止直接展示 Axios/FastAPI 原始错误(如 Request failed with status code 401、Could not validate credentials、traceback);401/无 token 必须表达为登录/会话问题,pending intent 只能恢复输入,禁止登录后自动重放真实写请求。
  • 用户可见核心业务内容零兜底:AI 失败、证据不足、结构化失败时必须显式失败或标记待确认,禁止用默认句、模板句、stub 冒充成功。
  • PMFlow AI 用户侧入口必须遵守“双脑结构”:Space AI 是跨项目注意力、想法孵化、待确认聚合、AI 进行中监控和入口路由的 Operating Partner;项目级 AI 副驾是绑定 ProjectTruthState、ChangeSet、Evidence、ExecutionContext 与 ReleaseSignals 的上下文操作副驾。禁止把两者做成无对象锚点的泛聊天;Space AI 不得直接写 Project Memory、提交 ChangeSet 或发起 Execution Bridge handoff;项目副驾不得做跨项目经营排序、平台 provider/model/prompt 诊断或绕过确认链。
  • Space AI Concierge / 用户侧 PMFlow AI 必须把用户原始问题与结构化 surface_context 分开传递,只回答 PMFlow 产品/操作知识、当前 tenant/project/space 状态、下一步指导与带来源的外部公开信息;系统代码、数据库表、prompt key、trace、函数名、模型供应商、内部路由、技术架构与架构实现必须被 PMFlowAIDisclosureState -> protected_internal_refusal.v1 -> AnswerVerifier 主链阻断或清洗,返回 payload 禁止暴露 raw source label、tool trace 或底层异常,内部诊断只能走显式 /platform/* 入口。
  • /space/pmflow-ai 与兼容 /space/ai-concierge/ask 的用户侧主控必须先进入 PMFlowAgentRuntimeService.run_space_turn(),该服务只负责创建 durable pmflow_agent_runs 并委托 PMFlowAIAgentRunService 执行 LLM Step Planner -> typed AgentToolRegistry tool -> Observation Ledger -> State Critic -> Terminal Answer State -> PMFlowAIAgentAnswerRuntime。pmflow_agent_runtime/loop.py、legacy AnswerArbitrator/NaturalAnswerComposer、旧 Turn Runtime 和 CustomerAnswerPresentationService 只能作为 compatibility/tool/renderer 资产,禁止恢复为产品主控或最终答案来源。
  • 旧 PMFlowAIConversationOrchestrator / SpaceAIExecutionContract / SpaceAITaskGraphService / pmflow_ai_runtime_kernel 已从 Space 用户侧代码中删除;PROMPT_PMFLOW_AI_ROUTE_PLANNER 仅保留为 legacy/deprecated 资产,不得恢复为主控,也不得再拍板 source_strategy / answer_contract / allowed_executors / answer_obligations 或分派 analyzer 早返回。
  • /space/ai-concierge/ask 的 API 层只加载 context、结构化 interaction_submission、持久化和返回,不得绕过 Agent OS 主控。interaction_submission 只能折叠为 raw question、answers 和 supplement;intent_hint / evidence_mode / primary_subject 旧推导字段已删除,禁止从按钮、选项、question id 或关键词恢复。route_plan / answer_contract / source_strategy / allowed_executors 在 Space 用户侧只能作为兼容 payload 或离线解释字段,禁止再决定 action、来源、追问或最终 answer shape。
  • 项目查找、项目状态、风险、容量、MVP 等能力不再靠问句关键词或固定 answer_contract 进入专用链路;必须先由 TurnState 判断目标、对象锚点和证据缺口,再调用 PMFlowAIEvidenceToolRegistry 的白名单只读 evidence tool。普通项目清单/项目数量等 surface 可验证事实也只能作为 inspect_surface_context 工具结果进入 TurnState。Packet 6 后工具层只返回事实、来源、置信度、目标相关性和剩余缺口,不得生成 implication、judgement 或最终答案;PMFlowAIEvidenceAbsorber 是唯一把 evidence 转成 fact / source / implication / relevance_to_goal / confidence、remaining_gaps 和 JudgementState 的层;CustomerAnswerPresentationService 只消费 final TurnState/CustomerEvidencePacket 的 answer_shape 做 renderer,不得再按 quick intent、旧 route contract、packet 名称或 answer_type 场景枚举重判展示形态。旧项目查找/通用合成/展示模板早返回服务不得恢复。
  • 当前项目 status_answer / execution_guidance 必须先经过项目执行态覆盖门禁:inspect_project_status 必须读取 PMFlow OS truth-state 与 execution-summary,并同步输出 ProjectOperatingEvidencePacket,覆盖指挥台、项目工作台、决策与待确认、开发执行、测试质量、发布增长、团队层、项目记忆、风险阻塞和最近动态这些 PMFlow OS 全流程 facet;Packet R 后这些 facet 必须由独立 reader 消费对应 PMFlow OS 投影,禁止退回单函数拼字段或只读项目 active、项目数量、可见卡片状态生成推进建议。Packet S 后 PMFlowAIEvidenceCoverageGate 只能消费 TurnState.evidence_state.structured_evidence.project_operating_evidence_packet(s) 的 facet coverage profile,禁止再通过中文 finding 文案、关键词或固定短句判断 coverage。覆盖不足时必须先触发低风险只读 probe,不得直接合成最终答案或把系统缺口转成用户追问。Packet T 后最终合成必须生成并消费 project_operating_answer_verification.v1:safe_next_actions 才能进入正文/customer packet/canvas 的可推进动作,blocked_actions 只能进入不可直接做边界,missing_or_partial_facets 必须进入证据边界;禁止让模型或展示层绕过该 verification profile 自由生成完整推进方案。
  • /space/ai-concierge/ask 的 ActionSelector 只能根据 PMFlowAITurnState.evidence_state.evidence_gaps、sufficiency_state 和白名单只读 action 选择下一步;禁止按自然语言关键词、looks_like_*、业务枚举、旧 answer_contract、旧 task_type 或 executor 列表做运行时拍板。项目查找、项目状态、外部查询、MVP、风险、容量等能力只能通过 PMFlowAIEvidenceToolRegistry 包装成 evidence tool,不能早返回抢主控。
  • 项目状态、风险、容量和 MVP 工具仍必须遵守只读边界:只返回证据、依据、缺口和建议,不写 Project Memory、不提交 ChangeSet、不写 review decision、不发起执行、不发布、不自动派任务、不写 capacity override;对象范围由 TurnState 的 explicit/current page/reply/card/active workspace strong focus 决定,visible context 只能作为候选或证据范围。
  • 新增任何用户可见 PMFlow 能力时,如果用户会问“这个能力现在怎么样 / 下一步怎么办 / 能不能让 AI 处理 / 风险是什么”,必须优先同步加入 Agent OS typed tool 合同、planner/critic 行为、observation/artifact/verification 投影、Terminal Answer State/Answer Runtime、runtime golden behavior case、回归测试和文档;兼容 Turn Runtime 只作为旧链路适配。不得只新增 goal_kind / answer_contract / analysis_task / business_frame / evidence_plan、executor 枚举、关键词路由或 specialized analyzer;没有专用 tool 时也必须通过通用 evidence tool 返回有边界的判断、依据、缺口和下一步。
  • 用户侧 PMFlow AI 的回答生成和最终返回都必须经过 Answer Runtime -> Answer Quality Gate -> CustomerAnswerPresentationService -> CustomerEvidencePacket -> Customer Payload Gate 合同:最终合成前先形成 PMFlowAIAnswerObjective / PMFlowAIAnswerPlan / PMFlowAIAnswerDraft 与客户安全 answer_runtime_packet,再按 strategic_judgement / status_answer / clarification / execution_guidance / fact_list / composite_answer / general_answer 这些表达形态渲染。Renderer 只能作为 draft source,不做目标识别、来源选择、对象绑定、追问仲裁或 answer_type 重判;静态产品合同和保护拒答合同只能提供 required_claims / customer_safe_capabilities / source_summary / limitations,不得保存整段终局回答或要求全文相等;Answer Quality Gate 是唯一答案质量出口,必须把空 draft、内部运行时术语泄漏、计划语句回显、静态合同材料缺失写成 PMFlowAIAnswerQualityFinding,并对重写结果二次复检,仍失败时 fail-closed,禁止恢复 _sanitize_state_answer 这类 renderer 局部兜底;项目运行态 verification 等后处理约束必须先合入 draft 再过 gate,写入 answer / customer_evidence_packet / answer_canvas 的文本也必须先客户安全投影,禁止后处理绕过 gate;CustomerAnswerPresentationService 只能清洗、裁剪和承接 runtime 已生成的自然答案,不得在 answer_canvas.direct_answer 或 packet fallback 中二次生成 结论/判断依据/综合判断/可执行建议/依据 这类固定段落或 answer_type 前缀;Customer Payload Gate 必须移除 raw answer_runtime_packet / pmflow_ai_turn_state / evidence_findings / route_plan / trace / tool_trace / debug,历史归档也必须使用同一份 sanitized customer payload;Composer/Verifier 只能消费 final TurnState、Answer Runtime packet 和 customer-safe packet 的 display_label/display_summary/business_values,禁止把 System Snapshot / User Snapshot / Project database / raw JSON / 字段名 / trace / prompt key 直接喂给用户答案表达层,也禁止靠新增场景关键词或固定模板解决回答重复问题。
  • 用户侧 PMFlow AI 的终局表达材料必须先经过 PMFlowAITerminalAnswerState:所有可说内容进入 Claim Ledger,所有不可说/不可确认/不可执行边界进入 Boundary Ledger,所有尝试进入 Attempt Ledger,表达策略进入 AnswerIntentPlan。Verifier 的 reason/internal_diagnostic 只能作为内部诊断,不得进入用户 answer、limitations、CustomerEvidencePacket 或客户可见 terminal state;客户可见只允许消费 customer_safe_summary/customer_safe_effect。AnswerIntentPlan 只能从 Claim/Boundary Ledger 选择 lead claim/boundary,并输出 answer_moves / composition_guidance / anti_template_rules / detail_level / structure_preference 这类表达策略;它不得生成最终正文、不得按业务场景或 failure_type 选择固定 presenter、不得读用户问句关键词做路由,也不得强制固定“判断依据/证据边界/下一步”三段式。最终自然表达必须经通用 terminal customer answer composer 和 critic:composer 只消费 terminal ledgers + AnswerIntentPlan,critic 只检查空答、内部运行时术语、固定标题模板、重复句和 lead claim/boundary 丢失,不得新增场景化 Customer Failure Presenter。Quality fail-closed 与 state fallback 也必须重建干净 terminal state 再表达,禁止复用被失败 draft 污染的 answer_draft_claim,禁止返回固定“质量检查未通过/旧链路模板/项目运行证据不足”句。禁止把所有 blocked/fail-closed 默认解释成项目运行证据不足,禁止按 failure_type 写固定 presenter,禁止从 raw runtime step 或 verifier reason 直接生成用户正文。
  • 用户侧 PMFlow AI 的 verifier failure 必须输出 verification_delta 并声明 retry_would_change_state;runtime 只有在 retry 会改变 TurnState 或能执行新的只读 probe/read 时才允许继续重试。next_action_hint=synthesize_answer 不得单独制造重复合成循环,Reviser 也不得在 retry=false 时创建 system action gap。没有 state delta 的失败必须进入 terminal-state blocked payload,由 Claim/Boundary Ledger 提供客户安全材料。
  • 用户侧 PMFlow AI 回复必须同时返回客户安全的 customer_interaction_context_packet 与 answer_process_packet:前者只暴露 visible_objects/current_focus_object 这类业务对象锚点,用于“这个项目/刚才那个/它”的续问归位;后者只描述本轮真实执行过的产品化步骤,供前端逐步展示,并可带 duration_ms / total_duration_ms 说明真实耗时归因。禁止前端用固定五步、固定 active index 或后台 trace 冒充思考过程,禁止在这些 packet 中暴露表名、字段名、prompt key、函数名、trace 或模型供应商。
  • Packet U/V 后,展示层不得再根据 answer_type / route_display / verification.ok 自行生成“识别问题、读取证据、表达判断、检查展示”等固定过程步骤;CustomerAnswerPresentationService.build_answer_process_packet() 只能保留显式传入的 runtime/process steps,Space 前端只展示后端返回的真实 steps。来源展示也必须 fail-closed:后端不得在无来源时补 PMFlow 上下文,前端不得在 sources 为空时补 个人空间/PMFlow 上下文。
  • Space AI 多轮续问对象归位必须以 Session Object Ledger 为真源:每轮只从真实返回 payload 的客户安全对象生成 current_focus_object / last_shown_objects / recent_objects,写入 qa_session_states.context_capsules;下一轮只有弱指代且 TurnState 目标需要单对象 inspection/execution 时,才允许用 ledger 绑定 primary_object(binding_strength=session_object_ledger)。禁止用 transcript 词面、项目名关键词、唯一可见项目或前端按钮文案恢复对象;有可执行系统证据缺口时必须先低风险 read/probe,不能把系统缺口 label 当成用户追问。
  • Session Object Ledger 必须受 object_binding_decision 和 topic switch gate 约束:当 TurnState 判断本轮是新项目、新想法、新方向、无对象或拒绝上一轮焦点时,必须挂起旧 current_focus_object,禁止用 ledger 触发 inspect_project_status / inspect_internal_projects。工具证据进入 known_facts 前必须经过目标相关性过滤;无关项目证据只能进入缺口/审计,不得作为新想法判断依据。用户答案出口必须清除 evidence_findings / TurnState / problem_frame 等内部运行时术语。
  • Turn Runtime 不得因为 can_answer_now=true 跳过未执行的系统读证据动作;只要 TurnState 仍有可执行的非用户 system_evidence_gap/freshness_gap,必须先执行对应 read/probe,再合成或显式说明剩余缺口。新项目/新想法/开放方向必须用 PMFlowAIThreadWorkspace + ResearchWorkspace.collected_inputs 持久化线程 slot,后续轮次合并 PMFlowAITurnDelta 继续推进,禁止靠 transcript、关键词、按钮文案或场景枚举恢复上下文。
  • 开放方向/新想法在 can_answer_with_assumptions=true 且无强项目绑定时,最终回答必须消费 TurnState 与 workspace slot 给出受控初判、切口、风险、缺口和下一步,禁止因没有 external findings 直接退成“证据不足不能判断”。需要用户补充时,interaction_request 必须批量消费 workspace pending questions 与 user-actionable gaps 生成 stepper,能一次问完的关键缺口不得拆成多轮单点模板追问。
  • PMFlow ChangeSet 写入边界:accepted / edited / deferred 只表示候选项已被人工处理但尚未写入 Project Memory;只要 ChangeSet 未 committed 且 ChangeItem 未 committed/skipped,就必须允许继续 accept/edit/defer。真正锁定边界是用户明确执行 ChangeSet commit / 确认写入项目记忆之后。
  • PMFlow 审查与执行边界:团队层只做责任路由、角色收件箱、团队动态、审查状态、阻塞解释和跳转,不直接执行 ChangeSet commit 或写 Project Memory;开发执行只能针对 Project Memory commit 后形成的正式 Task 发起 Execution Bridge handoff,禁止从 pending_review ChangeItem 或候选 Task 直接分派人/agent 执行。
  • 业务语义、问答/执行归因与前台动作拍板必须优先走“对象/上下文绑定 -> SemanticContextPacket -> SemanticDecision -> gatekeeper”主链,禁止在 backend/app 运行时代码里恢复 looks_like_*、关键词仓或散落正则拍板。
  • query.answer 路由与外部查询规划不得在运行时代码里维护 _INTERNAL_ROUTE_OBJECTS / _EXTERNAL_ROUTE_OBJECTS / _SEMANTIC_QUERY_OBJECT_TYPES 一类对象词表,也不得新增 *_probe_is_strong / *_route_probe / query_kind(weather/news/company/market/model) 这类二次语义拍板。query_profile / source_policy_hint / SemanticDecision 只能作为上游结构化输入;若证据不足,只能显式返回 uncertain/clarify,禁止在执行层靠对象集合、subject_focus、needs_freshness、referenced_objects 再次裁决 internal vs external。
  • llm_service 运行时必须显式传入 routing_meta;禁止再通过函数名片段、hint 常量或模板词在底层推断 tier、结构化输出或 fallback 策略。
  • 显式 reply/thread、卡片动作和 work_item_id 属于更强锚点,必须优先于旧 session 和记忆续写。
  • 进入 requirement_plan / draft confirm 的线程必须留在对应主链,禁止掉回 query.answer;其中 draft confirm 只允许显式 reply/thread、卡片按钮或 work_item_id 进入,禁止无锚点按“同群/同人”回捞旧 pending draft。若同 scope 旧 plan/draft 已被判定污染,运行时必须先终止该 scope 内的 active topic/work item,再回退到 query.answer。选项协议回复必须复用单点结构化解析器,不得散落关键词/正则。
  • 已绑定 active requirement context 的线程里,显式 退出需求模式 必须先挂起当前 collecting/ready draft 对应的 requirement topic,再允许回到普通 query.answer;同一 conversation_scope 下的 topic 选择必须优先命中仍带 active draft 的 live requirement workspace,禁止被后续 idle query topic 抢走。
  • draft confirm 若命中显式 reply/thread 锚点,候选 mounted draft / pending draft 必须先通过该锚点精确命中;同群、同 scope、同人但锚点不匹配的历史草稿不得参与打分或回捞,避免 requirement-plan A/B/C 线程被旧 draft 劫持。
  • Feishu requirement_plan 首轮/追问回复若命中 reply_template_key=requirement_plan_followup,必须保留模板键并优先渲染交互卡片;卡片按钮回流必须复用 canonical Feishu reply/thread 上下文,禁止因 query renderer 吞模板键或按钮回流丢锚点而退回纯文本旧模板。
  • 冷启动 WorkflowSemanticPlanner / pmflow_semantic_context_decision 失败时,运行时只能降级到带 semantic_planner_degraded=true 审计标记的中性 query.answer 场景;后续优先重试 semantic backfill,显式 active requirement context / reply anchor 仍留在 requirement-plan 主链,无锚点事实问句禁止硬降级成 requirement consultation。
  • Feishu 显式 reply/thread 到机器人消息时,必须先通过 feishu_reply_outbox.sent_message_id -> source_message_id 归一化 canonical thread context,再进入后续主链。
  • 外部 freshness 问答的 follow-up 若锚定上一轮“未接入实时外部数据/无法确认最新结论”的 QA 回复,默认继续留在 query.answer 聊天链并先尝试实时外部检索;只有用户显式点明系统/项目/配置等内部对象并提出接入动作时,才允许落入内部接入/入库流程。
  • non-plan query.answer 必须先经过 Query Route Gateway 产出 route_mode / decision_origin / reply_contract / probe_snapshot,再进入 AdaptiveRAG;回复正文必须遵守显式来源合同(内部知识库查询: / 外部实时查询:),uncertain 只允许 external-first 或澄清,禁止默认混合答案。
  • route_mode=external 后不得再直接把 DuckDuckGo HTML 抓取当主执行层;必须统一进入 External Query Planner -> External Query Gateway -> External Provider Registry -> MCP adapter 优先 -> bounded fallback live search -> external answer verifier 主链。external 来源过滤必须 fail-closed,禁止把 Feishu history / doc / pmflow 这类内部来源混回 外部实时查询 的来源摘要。
  • freshness_required=true 的行业/市场/趋势类外部查询必须执行近年证据门禁:planner 要前置当前年/上一年查询,live search 不能第一条旧结果即停止,gateway verifier 必须拒绝只有过期年份材料的证据包,禁止把 2024 白皮书类旧资料冒充 2026 当前趋势。
  • query.answer 的客户可见回复必须再经过 Answer Presentation Policy:客户视图只允许看到中文化 display_label/display_summary,禁止直接暴露 raw_source_label、Project database / Semantic facts / Knowledge Graph / Feishu history 等机器来源或内部术语。prompt context 也只能喂展示字段,不能再把原始英文来源标签直接喂给模型。
  • PMFLOW_SEMANTIC_CONTEXT_DECISION_PROMPT / PROMPT_CUSTOMER_ANSWER_COMPOSER / PROMPT_CUSTOMER_ANSWER_VERIFIER / PROMPT_RAG_QUERY_SEMANTICS / PROMPT_RAG_FOLLOWUP_ANCHOR_SEMANTICS / PROMPT_RAG_PENDING_CLARIFICATION_SELECTION_SEMANTICS 必须运行时读取 Prompt 运营中心 active release,并在 ai_call_logs.routing_meta 写入 prompt_key / prompt_release_id / prompt_source;禁止恢复为直接硬编码模板调用且无 prompt 归因。PROMPT_PMFLOW_AI_ROUTE_PLANNER 只允许作为 legacy/deprecated prompt key 占位,不得在 Space 用户侧运行时调用。
  • internal query.answer 一旦命中 route_mode=internal,必须再走“Operation Contract -> Target Resolver -> Query DSL Plan -> 白名单受控执行器 -> semantic facts 优先(可用时)-> bounded fallback retrieval -> answer verifier”链路;禁止让 LLM 自由写 SQL、自由决定 join/表名,或在没有证据时直接给内部结论。
  • MountedDraftWorkspace.requirement_card 是 requirement-plan 唯一业务真源;assistant prose、topic facts、run 文案只可审计,不可反推业务字段。
  • project_create.create / followup.confirm 的任务拆解是从属子步骤:运行时必须先 low-first 结构化生成,必要时升级 high;仍失败则显式记为 pending,禁止冒充成功。
  • 运行时长清单、Feishu / requirement-plan / AdaptiveRAG 细则、已知边界与假设,统一以 docs/architecture/RUNTIME_GUARDRAILS.md 为准。

9. 新增代码的参考模式

  • 新增后端接口:参考 backend/app/api/sstc_api/ 的结构
  • 新增前端 API 调用:参考 frontend/src/api/sstc.ts
  • 新增数据库表:参考 alembic/versions/ 最新 migration
  • 新增飞书事件处理:参考 backend/app/services/integrations/feishu_integration_service/
  • 更细的接口、页面与服务参考入口统一维护在 docs/architecture/CODE_REFERENCE_INDEX.md

10. 幂等与事务约束

  • 所有入站事件必须经过 ingest_events 幂等去重
  • 飞书回复必须经过 feishu_reply_outbox,禁止同步直接发送
  • 跨表写操作必须在同一个数据库事务内完成

11. 已知 BOUNDARY(不要幻构行为)

  • 飞书回调字段可能缺失文件名/大小,仅保证 attachment_id/key/type 可用
  • agents.defaults.timeoutSeconds 在 PMFlow 本地路由层 网关行为未验证;普通 LLM 调用仍以 LLM_REQUEST_TIMEOUT 为默认,已接入 Function Runtime Profile / 场景运行策略的保护型结构化调用以已发布合同里的显式 provider_timeout_seconds 为准。
  • World Model 静态层已接入 Redis 缓存(key: wm:static:{tenant_id}:{project_id},TTL 600s)
  • 写操作后主动 invalidate,动态层不缓存

12. 前端组件约束

  • ui/ 目录下组件禁止修改,仅使用
  • frontend/src/components/sstc/ 目录已模块化拆分,新增文件与职责如下:
    • SSTCCharterStagePanel.tsx:宪章阶段主面板(内容编辑、版本/状态展示)
    • SSTCExecutionBoardPanel.tsx:执行看板阶段主面板(执行视图聚合)
    • SSTCReleaseCreateDialog.tsx:发布创建弹窗
    • SSTCReleaseStagePanel.tsx:发布阶段主面板(发布列表与校验项)
    • SSTCReviewCreateDialog.tsx:复盘创建弹窗
    • SSTCReviewStagePanel.tsx:复盘阶段主面板(复盘内容与改进项)
    • SSTCSignalStagePanel.tsx:信号阶段主面板(信号录入/状态流转)
    • SSTCTaskCreateDialog.tsx:任务创建弹窗
    • SSTCTaskStagePanel.tsx:任务阶段主面板(任务列表、筛选、状态流转)
    • sstcUtils.ts:SSTC 跨阶段工具函数与转换逻辑
    • useSSTCWorkspaceOrchestration.ts:SSTC 工作区编排 Hook(状态聚合、事件编排、数据装配)
  • 修改前必须执行 FIND_USAGE 的组件/模块清单(强制):
    • SSTCWorkspace.tsx
    • useSSTCWorkspaceOrchestration.ts
    • sstcUtils.ts
    • SSTCCharterStagePanel.tsx
    • SSTCSignalStagePanel.tsx
    • SSTCTaskStagePanel.tsx
    • SSTCExecutionBoardPanel.tsx
    • SSTCReleaseStagePanel.tsx
    • SSTCReviewStagePanel.tsx
    • SSTCReleaseCreateDialog.tsx
    • SSTCReviewCreateDialog.tsx
    • SSTCTaskCreateDialog.tsx
  • 新增业务组件放入对应功能目录,禁止在 pages/ 内写内联组件
  • 样式只用 Tailwind utility class,禁止内联 style

13. 测试与验证

  • 后端改动:python -m py_compile 通过 + 相关单测通过
  • 后端代码或数据库迁移改动:在编译/测试通过后,必须继续执行当前环境对应的热部署/重启/重载步骤,确保变更真实生效;可用方式包括 docker compose restart backend、scripts/docker_stack.sh restart|dev-restart、systemctl restart neural-sync、nginx -s reload 等。若当前环境不是部署机、权限不足或不具备热部署条件,必须明确说明未执行原因与阻塞点,禁止默认跳过
  • 前端改动:npm run build 通过 + tsc --noEmit 零错误
  • 新增接口:必须在 backend/tests/ 补充对应单测

14. 文档同步规则(强制)

每次任务完成后,若以下内容发生变化,必须同步更新对应文档(CLAUDE.md、docs/architecture/ARCHITECTURE_INVENTORY.md、docs/architecture/RUNTIME_GUARDRAILS.md、docs/architecture/CODE_REFERENCE_INDEX.md):

  • 新增/删除/重命名文件或目录 → 更新 CLAUDE.md 第3-5节目录结构,并同步更新 docs/architecture/ARCHITECTURE_INVENTORY.md
  • 新增/修改服务边界或禁止操作 → 更新 AGENTS.md 第8节摘要规则,并同步更新 docs/architecture/RUNTIME_GUARDRAILS.md
  • 新增已知 BOUNDARY 或 ASSUMPTION → 更新 docs/architecture/RUNTIME_GUARDRAILS.md
  • 新增/修改 API 接口 → 更新 docs/architecture/CODE_REFERENCE_INDEX.md,必要时同步 CLAUDE.md 摘要索引

文档更新必须在 [Task:Done] 之前完成。 未更新文档的任务视为未完成。

15. 反迎合约束(强制)

  • 若用户方案存在明显根本风险,必须先直接指出风险,再继续执行。
  • 若存在更优方案且后果并不显而易见,必须简短说明更优路径与取舍;用户确认坚持后可继续执行原方案。

16. Context 管理约定

  • 大功能开发或结构性重构,单任务涉及文件超过5个时优先拆分为独立子任务;缺陷修复/回归修复允许围绕同一根因跨相关文件端到端完成
  • 单任务预估改动超过200行 → 拆分执行
  • 发生 context 不足时 → 停止并输出已完成部分 声明 [CONTEXT: LIMIT],不要截断输出

17. Codex 并行开发治理

  • 多个 Codex 线程并行推进时,可以按 Main Flow / Space / Account Settings / Shell Integration 等大模块 lane 长期并行,但实际执行单位必须是 Packet,不得只以模糊“大模块”直接开工。
  • 每个 Packet 开始前必须有任务包,至少声明 packet_id / module_lane / owner_thread / lane_owner / integration_owner / base_ref / read_scope / write_scope / forbidden_paths / shared_files / cross_lane_inputs / cross_lane_outputs / depends_on / merge_after / verification / docs_to_sync。
  • 没有 write_scope 的任务不允许并行;write_scope 重叠的 Packet 必须串行。
  • 每轮并行最多一个 contract / migration / router owner;其他线程只能消费该 owner 已定义的稳定接口。
  • 大模块并行时,Shell / Integration owner 负责共享路由、导航、Provider、共享 API base、共享文档和最终合并;模块线程只能写自己的 owned files。
  • Space 线程只做个人空间聚合、草案箱、待确认摘要、AI 进行中摘要和跳转,不直接写 Project Memory、ChangeSet commit 或 Execution Bridge 回写。
  • Account Settings 线程只做个人资料、偏好、通知、账户壳和设置入口,不直接改项目主链、权限核心、AI 路由或 Space 聚合。
  • Main Flow 线程继续推进 PMFlow OS 主链,但不得顺手重做 Space 或个人中心。
  • 并行线程默认使用独立分支 codex/<packet_id>,并优先使用独立 git worktree;不得在同一脏工作区里让多个线程直接写同一批文件。
  • 一个 Packet 对应一个短生命周期分支;Packet 完成、验证通过、文档同步完成后必须形成可审查 commit。复杂 Packet 可在同一分支内做多个逻辑完整 checkpoint commit,但禁止提交半成品、失败验证或越界改动。
  • Codex 完成 Packet 后必须自行执行 commit gate 判定:满足 auto_commit 条件时应自行提交;命中 hold_no_commit 时不得提交并报告阻塞;命中 ask_before_commit 时先说明事实再等用户拍板。具体判定以 docs/PMFLOW_PRODUCT_DELIVERY_STANDARD.md 的 Packet commit 协议 为准。
  • 不允许在旧 Packet 分支上继续做新 Packet;新 Packet 必须从最新 integration base 或明确依赖分支重新开 codex/<new_packet_id>。
  • 合并前必须检查 git diff --name-only,确认没有写出 write_scope;越界改动必须拆回对应 Packet 或交给 integration owner。
  • 合并顺序固定为:Contract / migration → Backend service/API → Frontend API/store → UI/page → Docs/test/integration。
  • 每批并行开发必须指定一个 integration owner,负责共享文件合并、最终验证、文档同步和进度台账回写。

共享高冲突区默认同一时间只能一个 Packet 写:

  • backend/app/api/router.py
  • backend/app/models/__init__.py
  • backend/app/schemas/*.py 中的跨域 schema
  • backend/alembic/versions/*
  • frontend/src/router/index.tsx
  • frontend/src/main.tsx
  • frontend/src/api/base.ts
  • frontend/src/lib/api.ts
  • frontend/src/features/pmflow-os/components/PMFlowOsFrame.tsx
  • frontend/src/features/pmflow-os/components/MobileBottomNav.tsx
  • frontend/src/features/pmflow-os/store.tsx
  • CLAUDE.md
  • docs/architecture/CODE_REFERENCE_INDEX.md
  • docs/architecture/ARCHITECTURE_INVENTORY.md
  • docs/architecture/API_CONTRACTS.md
  • docs/PMFLOW_PRODUCT_DELIVERY_STANDARD.md

若必须多人改共享文件,先由 integration owner 建立接口占位或合同,再让其它线程只改自己 owned 文件,最后由 integration owner 统一合并共享文件。

安全约束(必须严格遵守)

🚫 绝对禁止的操作:

  • 禁止未确认的破坏性删除;只有在用户明确要求删除死代码/死文件、已先列出目标路径并说明后果、且用户再次确认后,才允许执行文件删除
  • 禁止执行带 -rf、--force、-y 参数的命令
  • 禁止 DROP TABLE、TRUNCATE 等数据库破坏性操作
  • 禁止修改 /etc、/sys、/boot 等系统目录

✅ 文件操作前必须:

  1. 仅在破坏性删除、不可逆改名或其它高风险文件操作前,先列出将要操作的文件路径
  2. 明确告知用户操作后果
  3. 等待用户输入"确认"后才能执行