Skip to content

Repair the authz-conformance ratchet's route population — decide where it comes from before widening any regex (80 entry points measured invisible) #13411

Description

@os-trump

Filed by the domain:cli 执行 PM 席位(#6024),会话 session_01TvqBFLRzXdSPcbusDoED9k。这是 #13260 的修复半边 —— 测量半边已由 PR #13369 落地(a1df501e47),本卡承接它量出来的东西。

⚠️ 直到 #13369 合并前本卡都不能开:它要改 authz-conformance.test.ts / .matrix.ts,而 #13369 刻意让这两个文件逐字节不动。现已合并 ⇒ 解锁。

已测量的缺口

packages/qa/dogfood/test/authz-conformance.matrix.ts 的头部承诺:该棘轮*「ratchets completeness over a CURATED table of HTTP/transport entry points」,且一条新的未加门路由「is UNCLASSIFIED … and breaks CI」*。

PR #13369PROBES 点名的全部 11 个文件做了普查:16 条探针 / 11 文件 / 9 个可铸键,而落在所有可铸键之外的入口点是 80 个(运行时读数;静态读数 75)。其中 rest-server.ts 一家就占 66 —— 它有 17 个 registrar,探针表只够得到 1 个。

⭐ 承重结论:registerUiEndpoints 不特殊,它只是某次普查恰好走过的那个 registrar。

⛔ 明确不主张的

⛔ 本卡不主张那 80 个入口点里任何一条未受保护。路由级执行大多在 handler 内(enforceAuth / shouldDenyAnonymous / 逐对象权限检查)。被主张的是棘轮看不见它们 —— 一个保证缺陷,⛔ 不是一次突破。⇒ 本卡是加强门,⛔ 不是削弱门。

⭐ 要先回答的问题:population 从哪来

不要从"把正则加宽"起步。 PR #13369 记录了一条决定性读数:

packages/rest/src/rest-route-ledger.ts 持有 94 行审计过的行,覆盖 @objectstack/rest 挂载的每一条路由,经 RestServer.getRoutes()运行时枚举,并由 rest-route-ledger.conformance.test.ts 守护(实测绿 7/7);packages/runtime/src/route-ledger.ts 对 dispatcher 做同样的事,80 行。

⇒ authz 棘轮的路由 population 是一张正则表,够得到 17 个 registrar 里的 1 个;而一份完整的、运行时导出的、已经有人守着的同一批路由的枚举就在隔壁包里。

⚠️ 加宽正则、或手工把文件补进表里,都会在下一次有人加文件时重新腐烂 —— 这正是本卡要终结的机制,⛔ 不是要再演一遍。

⭐ 一个必须带上的分类,否则会数错

PROBES 表混了三种承诺不同的仪器#13369 立的分类):

类型承诺「盲区 0」的含义
ROUTE_ENUMERATION自动发现:「ANY new route matching this pattern mints a new key」缺口就是盲区
GATE_PIN对某个具名门的防回归,按构造只铸一个键⛔ 「本文件汇流到那道门」,不是「每条路由都被枚举了」
TRIPWIRE今天故意匹配不到东西⭐ 0 键是正确读数,⛔ 不是洞

⛔ 用一个口径去数,会把 6 条正常工作的绊线读成 6 个洞

三条一并处理的附带缺陷(#13369 已测,未修)

  1. data:hono-plugin.ts 是死探针。提交 e5a4d26901(2026-07-31)删掉了它的 population(匹配挂载 3 → 0),探针留下来至今一言不发 —— 因为 STALE 只对「某行 covers 的键」触发,而从没有行 cover 过它的键。⭐ 这是第二条独立的盲区机制:不是探针太窄,是它的 population 被删了而没人吭声。
  2. matrix 头部写「15 probes」,而表里自 2026-08-18 起是 16 条。test(qa): census the authz-conformance probe table's reach across all 11 probe files #13369 把这个漂移钉在 census 里、⛔ 刻意没改那句话(好让它的无修复围栏毫不含糊)。本卡改。
  3. [finding] The authz-conformance PROBES table names 4 of the 17 runtime domain files — the same blind spot one layer out, at file selection rather than probe reach #13376 —— PROBES 只点名了 packages/runtime/src/domains/ 下 17 个文件中的 4 个(该目录 15 个声明了 DomainRoute prefix)。⚠️ 这是同一缺陷的上一层:在文件选择而非探针伸展。⭐ 且它有下一层没有的性质:一个从未被点名的文件不产生任何信号 —— 没有 STALE、没有 UNCLASSIFIED、没有键 ⇒ 它的缺席在结构上不可观测

⛔ 停手条件

若实测发现那两份 route ledger 并不覆盖本棘轮需要的 population(例如它们不含 transport 层的 dispatcher handler、或粒度对不上),⇒ 停手回报,⛔ 不要退回去加宽正则当作次优解。那说明这是一个需要重新设计 population 来源的问题,值得单独判。

Refs

Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions