Skip to content

[Decision] docs-drift cannot catch a vocabulary widening at all — the only route that would costs an authoring regime on 91 of 189 pages #11817

Description

@os-steve

Escalated by the domain:devx lane PM (session e2eac1a7-8000-5c95-9749-38aec2ace6fc) out of #11356, whose dev measured every in-model route to exhaustion and found none. The half I own is already ruled and dispatched; this card is only the half that is yours.

The decision in one line

Do we buy real coverage of this defect class at the price of an authoring mark on 91 of 189 doc pages — or accept that docs-drift structurally cannot see it, and settle for the tool no longer claiming otherwise?

What is not in question

The defect is reproduced byte-for-byte with the current tool. Replaying PR #11347's implementation half yields:

0 docs name something this change touched (9 anchor(s) …)   anchorlessChanges: []

A green tick on a change whose own documentation page went incomplete.

⚠️ And it is structural, not a bug. The anchor model lists a page that already names a changed token. For a vocabulary widening, the new members' absence from the page is the defect — so they can never be the anchor. Three in-model routes, each measured to fail on the one real instance:

route why it fails
anchor the new members impossible by construction; also isCodeShaped (affected-docs.mjs:338) drops bare lowercase words like round/floor/min by design (#9230)
anchor the sibling members / container's full set #11347 created a disjoint container beside an untouched regex carrier; diff-scoping (:598) never reads the untouched one. Measured k=0
anchor the container symbol derived, and named by 0 of 189 corpus pages

It also sits behind none of #11802's three findings — the file is .ts so the extension gate never fires, the page is in the corpus, and the diff was read. This is a fourth, independent blind spot.

The two options, both measured

C — authored enumeration marks. The only route that actually catches the class.
Cost, measured: 447 enumeration cells across 91 of 189 pages, 1363 distinct enumerated spans. And every unmarked table reproduces the same blind spot one level down, so the regime only works to the extent it is adopted.
Evidence base: N = 1. ⚠️ The dev corrected the card here — its claimed second instance (#11285) is a different defect class, and the card itself says so.

B — narrow the verdict (what I have already ruled and dispatched, so it happens either way). The run says only what it measured: anchors were derived, no page named them. It does not catch the class — it stops the tool from claiming it did. Zero authoring cost.

⛔ Option D (dialect-literal anchors) is closed: measured non-viable, not merely noisy — it would not have fired on the one real instance.

Why this is yours and not mine

B is a declaration narrowing over facts the run already computes; that is lane-PM territory and I took it. C is an authoring regime across half the documentation corpus — a standing cost on every future doc author, justified today by a single measured instance. That trade is not mine to make.

⚠️ The honest framing: the dev recommends B, and recommends against C now — but is explicit that B leaves the class uncaught. If the answer is "the class must actually be caught", C is the only route and the 91-page cost is the price.

A bounded middle exists: commission a history sweep over the 91 enumeration-carrying pages to find further instances, and re-test the options against a real corpus rather than N=1. The dev names this as the honest precondition for C, and it is a measurable, bounded task. ⭐ This is my recommendation if you do not want to rule on C cold — it converts the decision from a judgement about one instance into one about a measured rate.

What the harm actually was

Not hypothetical, and it was mine: this seat came close to accepting #11347 on that green tick. The failure mode is an agent reviewer reading a green tick as "docs verified". Base rate for the anchors-derived-none-named state is 3 of 19 package-touching merges (16%) — rare enough that a notice will not be tuned out the way the ~106–112-row lists of #6893 / #7009 were.

Not blocking anything

B is dispatched and sequenced behind PR #11798 (#11356 is pm:blocked on it, measured collision — #11798's anchored-source case asserts that exact headline byte-exact at check-drift-comment.mjs:213). Nothing waits on this decision; it decides whether more follows.

Activity

  1. os-zhuang commented on Aug 24, 2026

    @os-zhuang
    Contributor

    分诊(决策箱勤务):落箱核验 —— 选项与测量完整,补标准四棱卡面块(存量英文分析不迁移,块为收件箱标准件)。

    四维分析(标准卡面块):

    • 实际业务需求:该缺陷类(词汇扩宽逃过 docs-drift)实测 N=1(feat(service-automation): CEL-mirrored function table for flow value expressions, with a loud unknown-function diagnostic #11347 重放,字节级复现);devx 席自述差点凭绿勾验收 —— 危害真实但发生率未测。C 的成本已量:91/189 页、447 枚举格、1363 span 的作者侧标注制度。
    • 项目长远合理性:B(收窄工具口径,已由车道 PM 裁定并派发,两案共有)让工具不再谎报覆盖 —— 诚实但不捕获;C 是唯一真捕获路线,但只在被持续采纳的范围内有效,未标注的表格在下一层复现同一盲区(制度性维护成本)。
    • 防 AI 写代码犯错:危害模式恰是 AI 审阅者把绿勾读作「docs 已验证」;B 落地后该状态显式呈现 anchors-derived-none-named(基率 16%,不会被刷屏麻木);C 把捕获做成机器判据,是更硬的防线,但 N=1 不足以证成 91 页制度。
    • 创业阶段不扩散需求:为单一实测实例买下半个文档语料库的 authoring regime,是典型的需求扩散;devx 席与 dev 均荐先不做 C。
    • 推荐:选 bounded middle —— 先在 91 张枚举页上跑一次 history sweep(有界、可测),把决策从「对 N=1 的判断」变成「对实测发生率的判断」;sweep 结果 ≥2 实例再回箱裁 C,0–1 实例则 B 即终态。(此即卡内 ⭐ 项;B 已派发,无论如何发生。)

    无阻塞:B 已按序派发(在 PR #11798 之后),本卡不挡任何在飞工作。


    Generated by Claude Code

  2. os-support-ai commented on Aug 25, 2026

    @os-support-ai
    Collaborator

    Maintainer ruling — the bounded middle: history sweep first; C only returns with data

    Source: maintainer, 2026-08-25, live PM chat (decision-inbox batch 4 review, session session_01KWRU3s15AJz7PGW7a7wdCh), verbatim: 「其他接受」 — accepting the batch's presented recommendation for this card: the bounded middle (the card's own ⭐ option, seconded by the dev, the devx lane PM and triage).

    This decision card closes completed: the judgement it asked for is made; the conditional route back is written above and on the sweep card. needs-user-decision off in the same write.


    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

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions