机械护栏
父级:structure
把"用机械约束取代社会性争论"做成实体。它已经从几个 linter 长成了 infra/scripts/ 下的 55 个 check-* 条目 —— 45 道守卫加 10 道自检(2026-09-07 数的),全部挂在同一个 make lint 后面(最快的检查排在最前)。make lint 由 CI 和 pre-push 钩子跑全量(266c9c945,2026-09-06,lefthook.yml);pre-commit 按子项目分区 —— 每个容器一个按 glob 门控的块,一次提交只为它碰到的部分付费,check-secrets 和 env-lint 常开(487c8412c,2026-09-06)。分成五个家族:
1 · 结构 —— 两个收口。 一个能力能做什么、以及它能反过来要什么,各自只从一个地方过;内核不持有任何能力,也没有解封的办法。六道闸门,多数是棘轮。→ convergence-inbound-and-outbound
2 · 分层。 go-arch-lint 的组件箭头;check-domain-acyclic(域依赖图必须无环);check-domain-facade-boundary(一个域的实现只能经它的门面够到);check-domain-layering(每个有面的域内部锁死 DDD 层序);check-routes-not-imported(routes 是最顶层);check-infra-not-domain;check-internal-dirs(internal/ 下只允许三种目录)。→ domain-facade-and-ddd-layout、backend-domain-modules
3 · 形状,不只是箭头。 check-routes-cyclo ≤ 3 —— 面和门面只许声明与委派;check-boundary-thin(53733b661,2026-08-01 —— 门面只许放别名和重导出,dispatcher 里不许出现带 json tag 的结构体或 schema 字面量);check-max-lines;no-nil-container(集合返回空集合,绝不返回 nil);fieldalignment。圈复杂度看不见"一个边界正在长出域的形状的第二份拷贝",所以形状要被直接闸住。
4 · 每个界面原语只有一个源头。 十二道闸门:一个下拉、一种文本输入、一个遮罩、一种小节标题、一种空态、一处层级声明、三种时间写法、一个语料地址来源 —— 外加 sm-* 类名必须真存在、Tailwind 任意值里不许插值、选文件的按钮不许由操作系统画、会被切的预览卡切口处必须有续读信号。→ one-source-per-ui-primitive
5 · 我们发出去的东西,和我们说的话。 check-knobs-reachable(产品读的每个开关,在我们发出去的那套栈上必须设得了 —— 代码里有、部署里够不着的开关不算开关);check-redis-bounded;check-search-index-shipped;check-secrets(没有密钥离开这台机器);check-no-raw-http(所有出站 HTTP 经 internal/httpx);check-connector-boundary(凭据不离开保险库);backend-no-mock;check-doc-make-targets(文档里用代码体印出来的 make X 必须真能跑);check-tool-paths-exist;check-instructions-name-sure-tools(能力的常驻说明书里不许点名一个可能不在场的工具);check-no-impl-words-at-visitor;check-css-parses;check-i18n-keys(每个 locale 都得带齐每个 key);check-verify-items(真环境审计台账必须合式)。2026-08-30 之后新进两道:check-microsite-imports-declared(bd45353f4,2026-08-31;随 microsites 改名 e7fe80e91 一起改名 —— 面板上宣称能 import 的每个 @standmeet/* 包,builder/vendor/ 里必须真有)和 check-prod-ports-bound-local(fc841f41f,2026-09-01 —— 渗透测试发现 db / redis / minio 发布在 0.0.0.0 上之后,发出去的 compose 里每个内部端口都必须绑 127.0.0.1)。
另有十个专门攻击那四十五个 —— 种下被禁的东西、断言变红、再删掉。→ a-gate-that-cannot-go-red
和这个仓库自身的 pre-commit 钩子是同一种直觉——也是 owner 的 gatekeeper-not-driver 哲学的工程化落地:让非法状态变得不可表达,而不是在评审里争论它。要如实说的那条代价是粒度:一道比它所禁之物更粗的闸门,会把能工作的行为也一起挡掉,而且挡的时候 CI 是绿的(one-source-per-ui-primitive)。