产品设计准则
本目录回答"用户看到什么" — 功能规格、业务规则、schema 设计理由、AI prompt 设计。
这页是 Retaintive 团队以后做产品 / 系统 / AI workflow 设计时的默认工作方式。
核心原则:
不要一上来问 AI “prompt 应该怎么写”。Prompt 只是系统的一层。真正长期稳定的东西是 schema、API、state transition、database transaction 和 audit trail。
一句话原则
AI 应该帮我们理解语义,不应该成为系统状态的 source of truth。
系统的 source of truth 应该是:
核心架构模式: Code as Guardrail, AI as Judgment
以后所有 AI workflow 默认按这个模式设计:
也可以理解成:AI 做 judgment,code 做 authority。
所以 prompt output 不应该是“最终事实”,而应该是一个 typed proposal。真正改变 contacts / tasks / contact_timeline / calls / messages / leads 的动作,必须经过代码层的 schema validation、policy guard 和 transaction。
推荐顺序
1. Schema-first: 先定义业务对象
先问:
- 这个系统里真正稳定的 business objects 是什么?
- 哪些是 source of truth?
- 哪些只是 projection / view / cache / audit feed?
- 哪些字段表达当前状态,哪些字段表达历史事件?
Task 领域的 selected Target:
Task V3 已是选定的产品与领域 Target。术语和目标边界以 Task V3 Product / Domain Contract 为准;merge、deployment、TEST acceptance 与 PROD readiness 分开看 Task V3 Rollout 状态快照。Target 不表示代码已部署、通过 TEST 或向 PROD 开放;当前 schema、config 与 runtime 行为仍须从 live evidence 复核。
Task V2+ 工程审计与实施基线 保留为历史审计和兼容背景,不再是当前实施路线。
工程实现上,Schema-first 还意味着 schema 要尽量是机器可读 contract,例如 Drizzle schema、OpenAPI spec、GraphQL SDL、Zod / JSON Schema。它不只是文档描述,还应该能驱动类型、校验、mock、测试或 SDK。
不要把所有东西都塞进一个字段。比如:
这些不是同一个概念。
2. API-first: 再定义别人怎么读写
设计时要假设未来不只有当前前端会用这套数据。还可能有:
- internal services
- dashboard
- OAuth API
- CLI
- third-party integrations
- customer-owned AI agent
- Codex / Claude Code 这类 agent
所以 API 返回必须是机器可读的 typed objects,不要要求调用方解析 prompt 文本或 timeline JSON。
问设计时,应该问:
GET一个对象时,外部调用方能不能一眼看懂当前状态?- 它能不能看到最近发生了什么?
- 它能不能知道下一步应该做什么?
- 它能不能区分 progress 和 final outcome?
- 它能不能安全地提交一次 update / close / progress event?
目标 API 应该像这样分层(不是当前 live endpoint 清单):
如果 API 会被多个消费者使用,需要有 versioning strategy。比如 v3 API 不能随意 breaking change;如果对象语义要大改,应该新版本或兼容字段过渡。
3. State-machine-first: 先定状态变化规则
在 prompt 之前,先定义代码层允许哪些状态变化。
问:
- object 有哪些 lifecycle status?
- 哪些操作会改变 lifecycle?
- 哪些操作只是追加 progress?
- 什么情况下允许 close?
- 什么情况下必须 no-op?
- 人和 AI 同时操作时谁赢?
- DNC、wrong number、跨门店隔离这些硬规则在哪里执行?
例子:
避免用多个 boolean flag 表达状态。isOpen + isClosed + isAttempted + isResolved 这类设计会产生大量不可能组合。优先使用明确 enum lifecycle 和显式 transition。
代码层必须负责:
4. Prompt-last: 最后才设计 AI 输入输出
Prompt 的职责不是直接改变数据库。Prompt 应该在 schema/API/state machine 允许的动作空间里输出 proposal。
Prompt 可以做:
- 理解 transcript / SMS / notes
- 判断客户意图
- 判断 Task kind 和合理的 Next Action
- 判断 evidence 是否可能满足 Task Outcome contract
- 生成 suggested actions
- 给出 evidence 和 confidence
Prompt 不应该做:
- invent
taskId - 绕过 allowed enum
- 决定 transaction 是否成功
- 直接改 database state
- 把 Activity outcome 当 Task Outcome
- 忽略 store / DNC / idempotency / concurrency guard
AI action output 必须是 structured output,不要让 free text 决定系统动作。优先用 Zod / JSON Schema / OpenAPI schema 约束可选 action、enum 和字段。低置信度时不要自动写库,而是 no_op、needs_review 或进入人工确认流程。
目标 prompt output 应是 proposal,而不是 database row。示意:
代码收到 proposal 后再决定是否执行。
Engineering Guardrails
这些不是额外流程,而是防止 AI 系统变脆的底线。
问 AI 的标准方式
以后让 AI 帮忙做系统设计时,请直接复制下面这段作为开头:
判断一个 AI 方案是否靠谱
一个好的 AI 系统设计应该能回答:
如果一个方案只讲:
那通常还不够。它还没有进入真正的系统设计。
Retaintive 的默认设计口径
Retaintive 是 AI-native product,但不是 prompt-only product。
我们的默认架构应该是:
中文表达:
这就是以后做产品设计、prompt 设计、schema 设计、API 设计时的默认准则。