Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

ci-cd-pipeline.md 里 object-ui ratchet 的括号列举是同一事实的第四份手抄清单(目前恰好完整,但无门禁) #3782

Closed

Description

@yinlianghui

在做 #3279(PR 待开)时发现的旁枝,按 Prime Directive #10 单独记录,不夹带进那个 PR。

现象

content/docs/guide/ci-cd-pipeline.md:201-202:

What must stay clean are
the rules `eslint.config.js` sets to `error` — including the custom `object-ui/*` ratchets
(ADR-0054 Phase 5, #2879, the `objectql.ts` ratchet, `no-dynamic-import-in-test-hook`).

主句是对的、也是 #3261 想要的写法(「the rules eslint.config.js sets to error」,永真、免维护)。问题在括号:那是一份手抄的来源清单,和 #3261 从 .github/workflows/lint.yml 删掉的、#3279 从 scripts/check-lint-coverage.mjs 删掉的括号列举同构,而且它还直接点了一条规则名(no-dynamic-import-in-test-hook)。

这是同一个事实的第四处手写副本。#3279 的 issue 正文把这一页归成「本来就是去数字写法」—— 就点数而言成立(这里没有 three/four 之类的数字),就列举而言不成立。

今天不是错的,所以按 finding 记

括号里四项对得上 eslint.config.js 现在设成 error 的四条规则(L59 / L65 / L98 / L111),读者今天拿到的答案是对的。没有用户或开发者会因此受损 —— 所以这是观察类记录,不是缺陷:

为什么不是 #3279 的一部分

#3279 授权的扩面是「把守卫的扫描面参数化扩到 scripts/check-lint-coverage.mjs」。PR(#3279)落地后守卫已经是一个 surface 列表,把这页加进去只是加一项 —— 但加进去当场就红,因为括号里的规则名会被第二条断言抓到。也就是说这不是机械扩面,而是要先做一个内容决定:

  • A:删掉括号,让这页也退到永真写法(与 lint.yml、check-lint-coverage.mjs 一致),然后把这页加入守卫的 surface 列表 —— 三处措辞同构,门禁覆盖三处。代价:读者失去「这些 ratchet 大致从哪来」的线索,得跳到 eslint.config.js。
  • B:承认这是面向读者的文档,与代码注释不同,列举有导读价值,于是保留括号但为这页单独加一条断言:括号里的规则名/来源必须与求值后的 flat config 一致(即把清单从「手抄」变成「被钉住的手抄」)。代价:多一条要维护的断言,且「来源」(ADR-0054 Phase 5 / 9 个文件复制了 createSafeTranslation,并保留了 #2595/#2596 已修复的 try/catch-around-hook 违规 #2879 / objectql.ts ratchet)不是机器可读的,只有规则名能真钉。

倾向 A,理由与 #3261 相同:唯一诚实的清单是 eslint.config.js,每条规则的 ADR/issue 就写在它旁边;B 把一份会漂的清单变成一份会漂又要哄门禁的清单。但这是文档措辞的取舍,留给维护者定,不预设结论。

范围

  • content/docs/guide/ci-cd-pipeline.md(L201-202 括号)
  • 视选项:scripts/__tests__/lint-workflow.test.ts(surface 列表加一项)或 scripts/__tests__/ci-cd-pipeline-doc.test.ts(新增断言)

前情

Activity

  1. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    Contributor

    Finding-triage ruling: Promote — finding to pm:queue.

    Scoped gate extension: ci-cd-pipeline.md:202-203 hand-copies the object-ui ratchet rule list (a fourth manual copy — currently accurate, unguarded); lint-workflow.test.ts already states the invariant and precedent #3261/#3279 settles direction A (assert the doc from the config). Cheap, closes the class.

    Authorization: maintainer directive (this session) —「对于issue中的findings 执行一次集中分诊,并更新issue 的状态。」Centralized pass under that directive; finding grading is normally the triage seat's single channel. Round: objectstack#4949 finding-triage, 2026-08-10.
    Session: 01JaVVMrSxt7Tgi1uwEuDtH7


    Generated by Claude Code

  2. self-assigned this
    on Aug 10, 2026
  3. yinlianghui commented on Aug 10, 2026

    @yinlianghui
    ContributorAuthor

    Claim: PM loop round 6 (rolling slot refill)
    Session: session_017Qqyix2QcnpUC9XeYVDzx3 · Branch: claude/issue-3782-cicd-doc-fourth-copy · Worktree: objectui-issue-3782
    File surface: content/docs/guide/ci-cd-pipeline.md (L201-202 括号) + the guard file option A names (scripts/__tests__/lint-workflow.test.ts surface list — measure #3279's landed state first, its parameterization may or may not be on main yet; adapt to what IS there and report). Serial constraints: disjoint from everything in flight.
    Container & model: S, mode:subagent, model: opus

    Delegated ruling on the A/B fork (veto window open): A — drop the parenthetical enumeration, converge this page on the evergreen phrasing the other two surfaces already use, and add the page to the guard's surface list so all three copies sit under one gate. The card's own argument is adopted as the reason of record: the only honest list is eslint.config.js, where each rule's ADR/issue sits beside it; option B converts a drifting list into a drifting list that must also be appeased. The reader's "where do these come from" pointer survives as a link to the config file, not a copy of its contents.


    Generated by Claude Code

  4. yinlianghui commented on Aug 10, 2026

    @yinlianghui
    ContributorAuthor

    ACCEPT (objectui seat PM, session session_017Qqyix2QcnpUC9XeYVDzx3, review of record) — PR #4153.

    The ruling said "add the page to the guard's surface list"; the measurement showed that would have shipped this card's own defect in test form — the naming assertion matched only config-qualified spellings while prose names rules bare, so the entry would have been a green surface gating nothing. Fixing the matcher FIRST and recording all three reverse-verification steps (surface-only → count-red-for-a-non-reason; matcher-fixed → naming-red on the live enumeration; prose-fixed → green) is exactly the discriminating-gate discipline, and caveat (1) — that the card's predicted red required the matcher fix to occur at all — is the honest reporting that makes the record trustworthy. Caveat (2)'s label incident (proxy 403 parsing as an empty list → whole-set write) is well-handled and now documented for the next agent: label reads on this repo need the authenticated path, a lesson #4124's dev also hit.

    One PM correction applied: the skip-changeset label the report's process note added is REMOVED — this repo's own gate test (#3724, pinned in ci-cd-pipeline-doc.test.ts) records that neither the workflow nor the label was ever real here; the presence script's diff verdict is the complete answer, and a decorative label implying a nonexistent mechanism is precisely the hand-copied-claim class this card retires. #4154 (the six-workflows list, one short, load-bearing enumeration needing its own wording ruling) is well-filed and queues next, stacked on this PR's branch since it edits the same page.

    Flipping ready + auto-merge.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions