EFFICIENT 系统
一套多租户的轮毂轮胎 ERP 与电商平台 —— 一个 Django 后端、一套共享 React UI kit、五个门户、一个店面、一个带 MCP server 的 Rust CLI,以及一个 iOS 端。我负责的是它们下面那一层:每个仓库都要读的工程契约,以及让仓库真正守住契约的 agent 工作流。
- Agentic 工程 · Harness 与 skills
- 2026
- 团队平台 · 我负责的那层
- 公开
十五个仓库, 一本规则书。
一个 Django 后端服务五个门户、一个店面和一个 CLI,硬性的数据隔离是产品约束而不是工程偏好 —— 所以租户在中间件里就定了,早于任何能碰到 ORM 的代码。而这个宽度的平台,失败总发生在接缝上:同一条约定被写下四遍,跑偏三个方向,最后没人说得清哪份是对的。Harness 的回答是每条规则只存在一次、任何仓库都不许复制;skills 回答另一半 —— 让 agent 去读规则、去检查仓库,而不是背诵其中任何一个。
- Agent Skills · Claude Code · Python · Django · React
- Platform
我在这里负责什么
EFFICIENT 是团队的系统,其中大部分不是我做的。后端、各个门户和店面属于做它们的人。我负责的是它们共同依赖的那一层:装着工程契约的 efficient-harness,以及执行这份契约的 agent 工作流 skills。这一页就按这个顺序讲 —— 先讲架构,因为契约只有对着它治理的东西才读得懂,然后才是契约本身。
平台,以及它下面那一层
15 个仓库
后端持有领域与权限的真值,每个客户端消费它的契约,而不是重述一遍。shell 是各门户共用的 UI kit。Harness 完全不属于运行时 —— 没有东西 import 它,也没有东西部署它。它只是被读。
一次请求怎么走
一个进程,两种协议
Caddy 终结 TLS,交给一个 ASGI server —— gunicorn 配 uvicorn worker —— REST 和 WebSocket 在同一个进程里跑。请求属于哪个租户是在中间件栈里决定的,早于任何碰 ORM 的代码:第四个中间件把 Host 解析成 public schema 里的一行,然后设置 Postgres 的 search_path。认证发生在更后面、在视图内部,因为 DRF 跑在 Django 中间件之后 —— 所以租户范围永远不是「你是谁」的函数。
一个租户,一个 schema
隔离边界
硬性的数据隔离是产品约束,不是工程偏好:没有共享表。一个 Postgres,一个装租户注册表的 public schema,每个客户一个 schema,由中间件按域名选中。这个模型坚决不肯混淆的是租户和公司实体 —— 租户是客户、是隔离边界;公司实体是租户内部的法人实体,一个租户可以有很多个。把两者混为一谈,等于把默认公司当成租户键,而这条边界一旦丢了就找不回来。
不靠轮询的实时
信号 → 一次广播 → 每个标签页
门户里没有任何轮询。一次 ORM save 触发信号,模型不在实体映射表里就直接丢弃,活下来的按请求去重 —— 同一个事务里存一次和存四十次,产出的都是一次广播,而且要等响应提交之后才发出。消费端故意做得很笨:它只知道一个租户组,转发一条三个字段的消息,剩下的由客户端决定该让什么缓存失效。
Harness 的三个基本想法
为什么规则书自己也需要规则
每条规则只存在于一个文件里,带一个稳定 ID、一个 MUST/SHOULD 级别、执行它的证据,以及它的来源。ID 在改名或废弃之后永不复用,所以一年前的审计结论今天仍然能对上号。
仓库不把规则拷进来。它的 AGENTS.md 指向一个同级 checkout,agent 读之前必须 fetch 并要求 HEAD 等于 origin/main —— checkout 脏了或者分叉了就报告出来,绝不悄悄使用。把规则复制进仓库,正是规则书腐烂的方式。
它自己的 CI 会检查每条规则的元数据是否齐全、索引和目录树是否双向一致、ID 是否唯一、每个来源 ID 是否能在标准目录里解析。它同时拒绝存放状态:版本、豁免、带日期的合规证据都属于审计产出,不是 Harness 的内容。
一条规则怎么到达 agent
Pointer 模型
优先级从左到右,永不反转:用户高于仓库,仓库高于 Harness,Harness 高于 agent 自己的默认行为。检索到的内容 —— issue 正文、网页、文档 —— 都是数据,无法授予它本来没有的权限。
这份契约,用数字说
直接来自仓库
八个插件,八条边界
每个插件拒绝做什么
audit —— 只读检查
从 Harness 读取期望状态,检查真实的 checkout,报告两者之间的差。它绝不会为了迁就现状去改 Harness,也绝不动手修 —— 正是这条分界让审计还是审计。
contract —— 跨仓库的机器契约
OpenAPI 变更、权限 codename、实体标识、生成的客户端。只改一次源头,然后按依赖顺序验证每个消费方;绝不手改生成产物。只报告漂移而不修复,那是 audit 的事。
workspace —— checkout 与工具链
本地 Git 状态,以及仓库声明自己需要的工具。明确不管数据库和运行中的服务 —— 那是另一套生命周期、另一套失败模式,混在一起就是一个命令长成没人能审的东西的开始。
dev、environment、release、ui、knowledge
写代码时的关卡;本地数据与租户;已构建产物的晋级发布;对照共享 kit 的 UI 规整;以及脱敏、带出处、绝不自动发布的经验沉淀。插件是一个主题,不是一个筐。
这个闭环
期望状态、当前状态,以及差
这就是整个方法,它的价值在于它拒绝合并的那部分。报告差异和消除差异是两个 skill、两份产出 —— 因为一个既能报告又能修改的工作流,早晚会把标准改成它看到的样子。
怎么写一个该触发时才触发的 skill
一个在错误 prompt 上触发的 skill,比一个永远不触发的更糟 —— 因为读者分不清这是工作流没做好,还是它本来就不该出现在这里。所以每个 skill 都带一个 eval 文件:必须触发的 prompt,和必须不触发的 prompt,中英文都有,每条都写明期望的行为,由 CI 打分。真正起作用的是那些「不该触发」:ui:normalize 不能闯进只做审计的请求,contract:evolve 不能闯进不改契约的重构,workspace:doctor 不能闯进任何会改状态的操作。这些用例就是把边界写成可执行的东西 —— 而边界只有这一种形态,能熬过一年的变更。
更多作品


