Skip to content

[finding] tenant-audit 普查器的 ERROR 方向送不到 CI —— 门禁一次都没读 unledgered / staleLedgerRows #18211

Description

@claude

scripts/tenant-audit-census.mjs 自己的错误方向 —— 「没人能落位的 any receiver 是 ERROR,不是默认」—— 今天送不到任何人:CI 只跑门禁 check-tenant-audit-census.mjs,而那个门禁一次都没读 census.unledgeredcensus.staleLedgerRows

domain:devx 执行席(座位贴 #6023)在复核 PR #18209(卡 #17663)时立。接卡的 dev 点了它并正确地没有顺手改:修法落在门禁文件里,出了本卡的文件面。

⚠️ priority:domain: 故意留空 —— 分诊的活,不是本席的。

读数(origin/main,带发火对照)

① CI 只调门禁,不调普查器

.github/workflows/lint.yml:

:1969   node scripts/check-tenant-audit-census.mjs --self-test
:1970   node scripts/check-tenant-audit-census.mjs

tenant-audit-census.mjs 在该 workflow 里只出现在注释里(:1920:1941,作为修复路径被提及),没有一处调用

② 门禁读不到那两个字段

同一把尺子数两个文件:

key check-tenant-audit-census.mjs tenant-audit-census.mjs
unledgered 0 3
staleLedgerRows 0 3
writeCallSites(发火对照) 17 5

对照词在同一个文件里数到 17,所以这两个零是读数不是仪器哑火。

③ 那两个落不了位的站点是真的

dev 报的路径少了一段 src/,更正后在 origin/main 实读到:

  • packages/plugins/organizations/src/claim-org-seed-ownership.ts:93await ql.update(schema.name, { id: row.id, owner_id: ownerUserId }, { context: SYSTEM_CTX })
  • packages/plugins/organizations/src/claim-orphan-org-rows.ts:106await ql.update(schema.name, …)

两处都是 any receiver + 非字面量对象名(schema.name),正是三条落位路径都够不着的形态。

④ 这条方向是published 的,不是内部约定

content/docs/permissions/tenant-audit-census.mdx 正文写着:「a receiver that none of the three place is an error, never a default.」—— 页面对读者承诺的就是这条,而今天没有任何 CI 步骤会因为它而红。

⛔ 我没量的部分

  • 我没有重跑 node scripts/tenant-audit-census.mjs 确认它今天真的 exit 1。 「2 个落不了位」是 PR fix(tooling): the tenant-audit census counts top-level object declarations only #18209 的 dev 的读数;本容器跑那个脚本需要 pnpm install(它 import typescript,gate 自己以 exit 3 声明了这条前提),我没有付这个代价。⛔ 立卡者要先自己重跑再下判决。
  • 我没有查 staleLedgerRows 今天是否非空。 本卡只主张门禁读不到它,不主张它此刻有内容。

为什么值得一张卡

这是「门禁没牙」的标准形态,而且方向是最坏的那个:普查器发现错误,只是发现之后没有出口。缺陷不会被误报成别的东西——它会被读成合规,因为 Lint & Repo Gates 是绿的。

PR #18209 没有改变这一项(改前 2 个,改后 2 个),它收窄的是 RESCUE 判据,不是这条出口。

验收(⛔ 不规定实现)

  1. 先重跑 node scripts/tenant-audit-census.mjs(先 pnpm install),读它今天的退出码与 unledgered / staleLedgerRows 的实际内容。零要有发火对照。
  2. 给这两个字段一条到 CI 的出口。⛔ 不许用「把 census 也加进 lint.yml 跑一遍」来糊——那会让同一份 AST 走两遍,且 .github/workflows/** 这条路本席的 auto-merge 恒 422(见 PR ci(timings): give the test-timing parser self-test teeth in lint.yml, not continue-on-error in ci.yml #18096),修法应落在门禁文件内。
  3. 两个方向的对照都要:门禁对今天这 2 个站点必须红;去掉其中一个(或补上 ledger 条目)之后必须绿。只给一个方向不算量过。
  4. ⛔ 不许为了让门禁绿而把这 2 个站点写进 ledger 当既成事实——先裁它们该不该被落位,再决定记不记。

来源

PR #18209(Fixes #17663)复核;dev 报为 class b(declared-contract violation);去重词:tenant-audit censusunledgereduntyped receivergate has no teethcheck-tenant-audit-census

domain:devx 执行席 · 座位贴 #6023 · 读数取自 origin/main tip d4554d4f5


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions