LeadOps Portal
覆盖资格判断、审批、自动化、事故与报告的多租户运营界面。
我独立定义产品,设计架构与数据边界,规划并复核实现,设计验收策略,并负责最终交付。
- 角色
- 独立产品负责人兼工程师
- 证明能力
- 这个案例证明了从多租户、人工审批到工作流运营、事故处理、报告和安全公开演示目标的端到端产品责任。
- 技术
- TypeScript · Next.js · Node.js · PostgreSQL
背景
自动化代理机构可能从多个来源接收线索,借助提供商完成资格判断,请求人类决定,继续工作流,同时还要向每个客户解释事故和结果。这些不是互不相关的页面,而是一个租户、权限、重试和报告必须保持一致的运营闭环。
LeadOps 是这个闭环的作品集产品快照。我独立定义产品,设计架构和数据边界,规划并复核实现,设计验收策略,并负责最终交付。
问题
脆弱的实现会把租户选择当成界面过滤,让自动化提供商成为最终决策者,并且只报告正常路径。这样一来,跨租户错误、过期审批、回调风暴和缺失结果都难以发现和恢复。
这个产品让租户上下文贯穿请求和持久化边界,把审批记录为耐久的人类决定,并把耗尽重试的后台任务转化为可见事故。独立公开演示目标已经准备好使用纯合成数据展示 Dashboard、Leads、Automations、Approvals、Incidents、Reports、Clients 和 Settings。在该目标中,/approve/demo-token 只改变浏览器状态,所有 /api/* 返回 404,登录页回到演示工作区,而且不部署 Worker 或生产提供商。
这个案例证明什么
- 产品责任可以把业务流程与数据、界面、可靠性和发布边界连接起来。
- 多租户与审批是系统属性,而不是实现完成后附加的标签。
- 有价值的演示可以在没有生产数据和外部副作用的前提下设计。

关键约束
决定实现形态的约束
- 租户隔离必须贯穿请求、持久化、后台任务和报告,而不只是界面上的工作区选择器。
- 资格判断和自动化可以提供建议或继续工作,但不能覆盖重要的人工决定。
- 公开产品演示必须有价值,同时不能暴露客户数据、提供商凭据或真实 API。
核心决策
选择、替代方案与代价
让租户上下文贯穿整个系统
- 背景
- 只有界面过滤仍可能让 API、持久化、Worker 或报告发生跨租户访问。
- 选择
- 把租户身份纳入请求处理和租户范围数据访问,并采用面向 RLS 的持久化边界。
- 放弃方案
- 只在界面过滤; 在产品模型稳定前就为每个演示租户建立独立数据库
- 代价
- 每条数据路径都需要明确范围,但隔离因此成为架构不变量,而不是展示约定。
把审批建模为耐久记录
- 背景
- 工作流内存里的布尔值无法解释谁做了决定、令牌是否过期或回调能否继续。
- 选择
- 使用明确审批记录、一次性令牌、不可变决策历史和回调门。
- 放弃方案
- 只在 n8n 内暂停; 只凭邮件点击继续,不记录决策边界
- 代价
- 流程状态更多,但人的决定变得可检查、可测试。
架构与失败行为
责任、输入、输出与失败行为
- 01
线索接入
在租户上下文中接收签名且幂等的线索事件。
- 输入
- 线索来源事件
- 输出
- 租户范围的线索与接入记录
- 失败
- 签名无效、重放或冲突时在资格判断前失败。
- 02
资格判断
规范评分结果,同时保持提供商可替换且只提供建议。
- 输入
- 线索事实与提供商配置
- 输出
- 规范化建议
- 失败
- 提供商失败保持可见,绝不会成为已确认决定。
- 03
人工审批
在工作流继续前持久化重要决定。
- 输入
- 建议与一次性审批令牌
- 输出
- 不可变决定记录
- 失败
- 过期或重复令牌不能静默继续自动化。
- 04
工作流运营
以重试与事故创建运行回调和耐久任务。
- 输入
- 已批准工作与 outbox 任务
- 输出
- 交付、回调与事故状态
- 失败
- 耗尽重试后进入事故,不会消失。
- 05
报告
在同一租户边界内展示结果和健康状态。
- 输入
- 产品与运营记录
- 输出
- 可审计报告与关注队列
- 失败
- 缺失结果保持为未完成,不推断成功。
失败模式
失败如何被发现、限制和升级
| 触发 | 发现与响应 | 副作用与人工边界 | 状态 |
|---|---|---|---|
| 签名接入事件被重复提交。 | 签名、重放与幂等检查识别重复。 返回已有结果,或拒绝冲突载荷。 | 不会重复资格判断和工作流任务。 冲突进入运营复核。 | 已验证 |
| 审批令牌过期、重复使用或与已有决定相反。 | 令牌和不可变决策状态检查拒绝转换。 保留已记录决定并停止回调。 | 自动化无法覆盖人的决定。 授权操作人员必须建立新的复核路径。 | 已验证 |
| 提供商或回调在有界重试后仍不可用。 | 耐久任务达到配置的尝试上限。 创建带结构化失败上下文的事故。 | outbox 身份与尝试记录限制重复交付。 运营人员可以在事故流程中检查、暂停或重试。 | 已验证 |
| 公开演示访问者尝试调用 API。 | 演示 middleware 匹配所有 /api/* 路由。 在边界返回 404。 | 不部署 Worker、数据库、邮箱、AI、n8n 或遥测服务。 无需介入;访问者继续使用合成产品界面。 | 已设计 |
项目证据
证据及其验证范围
架构
LeadOps 在请求处理和持久化中传递租户上下文,而不是只把租户作为界面筛选器。
使用合成数据的作品集实现。LeadOps README——系统亮点审批记录与令牌约束自动化回调,工作流无法静默绕过人的决定。
作品集实现与验收策略。LeadOps README——系统亮点验证
仓库记录产品、持久化、工作流与运营边界的本地验证方法。
本地验证;不代表真实生产流量。LeadOps README——本地验证安全
仓库把作品集源码条款与第三方依赖许可证分开说明。
仓库级许可证披露。LeadOps README——源码条款真实状态
已经实现、没有声称和仍需完成
- 运行状态
- 作品集快照
- 数据
- 所有截图和准备中的演示目标都使用确定性合成数据。
- 外部集成
- 仓库定义了提供商与工作流边界;公开演示禁用 API,也不部署 Worker。
- 收入声明
- 不声称真实生产客户流量或客户收入。
- 源码
- 公开源码
- 生产前工作
- 仍需验证公开地址、独立安全/合规审查、提供商配置和运营责任。
作品集快照: 其中数据均为合成数据。该仓库不声称存在生产部署、真实客户流量或客户收入。
复盘与下一优先级
有效的选择
把审批和事故处理设计为产品界面,使可靠性同时对运营人员和评审者可见。
会改变什么
如果重做,我会更早定义公开演示隔离目标,让每项功能从一开始就有安全证据模式。
下一优先级
- 部署纯 Web 目标并完成匿名 API 关闭 smoke test。
- 增加独立复核的租户隔离威胁模型。
- 在扩大自动化前,先在预发布环境验证一个真实提供商集成。
现在不做:在一个代理机构工作流证明运营与支持模型前,不值得先构建大型集成市场。