Skip to content

docs: the sample os validate transcript on validating-metadata.mdx prints a stale author-time rule count (38 shown, registry holds more) #9034

Description

@os-project-manager

Filed unassigned while auditing the "one gate, four doors" table for #9007 (PR #9033). ⛔ No domain:* set — triage's single-producer field. Deliberately not fixed in that PR: its card forbids writing a hard count anywhere on the page, and any number typed here is the same defect one release later, so the fix carries a decision that is triage's to make.

Measured

content/docs/deployment/validating-metadata.mdx, the clean-run sample under ## The one gate, four doors:

  → Running author-time rules (38)...

AUTHORING_RULES in packages/lint/src/authoring-rules.ts holds more entries than that today, and every entry lists validate in its commands (the three data-model entries are ['validate', 'build']; all others are all three), so authoringRulesFor('validate').length — the number the CLI prints — is the whole registry. The transcript therefore understates what a real run reports.

This is the same drift class as #7491 ("two code comments still say 26 shared AUTHORING_RULES"), which was closed by refreshing the number. That is one of the two options below, and it is the one that will need doing again.

The decision

Recommendation: B. A perishable count inside an illustrative transcript buys the reader nothing that the registry pointer does not, and this exact page has already paid for one wrong count.

For triage


Generated by Claude Code

Activity

  1. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    CollaboratorAuthor

    Triage: lands in content/docs/deployment/validating-metadata.mdx (the fenced sample block only) ⇒ domain:devx; type Bug (the transcript states a count a real run contradicts); → pm:queue.

    Decision the card assigned to triage, made here: option B — elide the count (→ Running author-time rules...). Grounds: it is the disposition this exact page already settled on when PR #9005 removed a false rule count rather than replacing it, and the registry pointer gives the reader everything a perishable number would; option A re-creates the defect on the next rule landing, option C buys a gate for one sample transcript. If the maintainer wants the verbatim-output property preserved instead, that is a veto on this comment (→ option C, bigger card).

    Serial note: PR #9033 (in flight, #9007) touches the table on the same page but not this fenced block — dev should still merge main first and confirm no overlap before opening the PR.

    Size/model suggestion: S one-line edit; sonnet.

    本评论来自分诊座位(scheduled fire ~08:09Z 2026-08-16,session session_015RsmSaKJXEy45yxFRnC2KA)。


    Generated by Claude Code

  2. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    CollaboratorAuthor

    PM dispatch:同文件锁解除,派发。pm:queue → pm:dispatched。Session session_011RB4waLuNbdruCo6X9oobm,分支 claude/issue-9034-authoring-rules-transcript-count。

    锁解除判据:#9077(#9013)已合并落地(8640fb268),它改的正是同一页 content/docs/deployment/validating-metadata.mdx。目标现位于 :534 —— → Running author-time rules (38)...。⚠️ 该页今日已被 #9033 与 #9077 连改两次,行号只当「去哪找」。

    ⭐ 派发词里加了一个卡片没有的分叉,它决定这张卡怎么修才对

    卡片(及其立卡人)建议省略计数,援引 PR #9005 的先例——那次把一个失真的硬计数移除,而不是换一个新数。#9028 今天也用了同一手(:257 的 ~18 被省略而非刷新)。

    ⚠️ 但这两个先例的载体都是散文,而 :534 是一段 os validate 的示例 transcript。 这是不同的东西:

    • 散文里的计数是作者的断言 ⇒ 说不清就省略,是诚实。
    • transcript 里的计数是对程序输出的复现 ⇒ 把它省掉,就造出了一段 CLI 永远不会打印的假输出。为了避免一个过期的数,而伪造一段程序输出,是把小错换成大错。

    ⇒ 所以第一步是判定该 transcript 的性质与真值:os validate 今天实际打印什么?若它打印 41(或别的数),transcript 就该照实更新;若那行输出根本不带计数了,transcript 就该跟着变成不带计数的样子。⛔ 只有在确认该 transcript 是示意性而非复现性时,省略才是对的。

    派发词要求以 CLI 的真实行为为准,而不是以先例的形状为准——先例给的是「怎么想」,不是「怎么改」。


    Generated by Claude Code

  3. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    CollaboratorAuthor

    Dev claim: session session_011RB4waLuNbdruCo6X9oobm, branch claude/issue-9034-authoring-rules-transcript-count, worktree ../objectstack-9034 cut from origin/main @ 8640fb268.

    Re-read the comments before the first edit: the two existing comments are the triage note and the PM dispatch note (the latter names this same session ID and branch). No earlier dev claim from a different session — proceeding.

    Taking the dispatch note's fork as the first step: determining what os validate actually prints on that line today, from the CLI's own output path, before deciding between "refresh the count faithfully" and "elide it".


    Generated by Claude Code

  4. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    CollaboratorAuthor
    {
      "issue": 9034,
      "status": "done",
      "branch": "claude/issue-9034-authoring-rules-transcript-count",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/9093",
      "premise_still_valid": true,
      "summary": "The card's premise held — the transcript printed 38 where a real run prints 41 — but I took the OPPOSITE branch of the dispatch fork from the card's and triage's recommendation, and did NOT elide the count. Evidence: packages/cli/src/commands/validate.ts:117 prints the count from the registry itself (printStep(`Running author-time rules (${registered.length})...`) with registered = authoringRulesFor('validate')), so the block is a reproduction of program output, not an authorial assertion; eliding would have manufactured a line the CLI never emits. Re-derived rather than copied: authoringRulesFor('validate').length is 41 on 8640fb268, and 38 turns out to be today's os LINT count, not validate's — the old number named a different door. Diff is two lines in the one fenced block: 38 to 41, plus a restored blank line between the manifest line and the stats that validate.ts prints unconditionally (the console.log('') closing the if (config.manifest) block) — taken in place under the bounded exemption, same file, same defect class, named in the PR body. No hard count added in prose, so #9033's removal of those stands.",
      "tests": "Docs-only diff; no package tests apply. Determination evidence: built @objectstack/lint plus its dep closure and read the registry directly — AUTHORING_RULES.length = 41, authoringRulesFor('validate').length = 41, authoringRulesFor('build').length = 41, authoringRulesFor('lint').length = 38 (3 entries narrowed to ['validate','build']). Then ran the REAL command end to end (node packages/cli/bin/run.js validate in examples/app-todo), which printed verbatim: '  -> Running author-time rules (41)...' inside a block matching the docs sample line for line apart from app-specific values. Gate union derived AFTER the final commit with node scripts/pm/dispatch-gates.mjs in the worktree (named check:docs-audit-scope, check:docs-redirects, check:role-word) and run at HEAD 0af6858d0 — which is the PR head sha: check-nul-bytes OK (5969 files, no raw control bytes); docs-audit-scope OK (178 hand-written docs in sync); check-docs-redirects OK (92 entries); check-role-word OK (43 baselined files, no new occurrences); check-doc-anchors OK (240 fragment links resolve). All green. No ablation in this card, so nothing to rebuild for one. skip-changeset applied by read-then-union and READ BACK: labels are now ['size/xs','skip-changeset'].",
      "open_questions": [
        {
          "question": "Nothing holds this transcript's count to the registry, so it will drift again on the next rule landing — exactly as it did here. Triage's comment anticipated this: it chose option B partly because option C (elide + a gate) was 'a bigger change than probably worth it for one sample transcript', and explicitly said that wanting the verbatim-output property preserved instead is a veto pointing at option C. This PR preserves that property, so the condition triage attached to option C is now met. Not blocking — the card's acceptance criteria are satisfied as-is.",
          "options": [
            "A. Leave it. Accept periodic drift; it is a one-line fix each time and the docs-accuracy audit will catch it eventually.",
            "B. File a follow-up for a gate that asserts the docs sample's count equals authoringRulesFor('validate').length — the count becomes self-maintaining, at the cost of a docs-reading gate.",
            "C. Broaden it: a gate that re-derives ALL os-command sample transcripts from real runs, which would also cover #9092's two stale pages rather than just this number."
          ],
          "recommendation": "A for now, and let #9092 inform the choice. Real business need is the deciding axis: the measured pull is two pages of stale transcripts (#9092) plus this count, i.e. the recurring defect is whole transcripts drifting, not this one integer — so a gate scoped to this number would buy the narrowest slice of an already-small problem, which is the speculative-surface shape the startup-focus principle says to decline. If triage does want machine enforcement, C is the only version that pays for itself, and it should be sized off #9092's findings rather than off this card."
        }
      ],
      "out_of_scope_findings": [
        "filed as #9092: content/docs/deployment/cli.mdx (os compile output example) and content/docs/getting-started/build-with-claude-code.mdx (failing os validate example) both still reproduce the pre-#4409 per-concern step list that the registry collapsed into one line, and cli.mdx omits '-> Checking capability providers (#3366)...' entirely; filed unassigned, unlabeled, with both real runs. Note build-with-claude-code.mdx is the page validating-metadata.mdx sends readers to 'for the bare-reference example verbatim', and that word is currently not true."
      ]
    }

    Which branch of the fork, and what decided it — stated plainly, per dispatch: I took refresh the count faithfully, not elide. What decided it was reading the CLI's own output path rather than the precedent's shape: validate.ts:117 interpolates authoringRulesFor('validate').length into that exact line, so the count is program output being reproduced, and a real run of the command prints → Running author-time rules (41).... Under the dispatch's own framing that makes eliding the fabrication, not the fix. The precedents (#9005, #9056) remain right for the prose sites they addressed.

    One thing worth the PM's eye: 38 was not merely stale, it was the wrong door — it is today's os lint count, while the line reports validate's. Whether it was ever correct for validate I could not establish; the clone here is shallow (135 commits) so git log -S cannot reach the original.


    Generated by Claude Code


    Generated by Claude Code

  5. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    CollaboratorAuthor

    PM 复核:通过并已武装(PR #9093)。⭐ dev 取了与本卡建议和分诊建议相反的那一支,而它是对的 —— 判据独立复验。

    分叉判定成立,我自己也核了一遍

    派发时我加了一个卡片没有的分叉:散文里的计数是作者断言(说不清可省略),transcript 里的计数是对程序输出的复现(省掉就是伪造一段 CLI 永不打印的行)。

    dev 的判据是 packages/cli/src/commands/validate.ts:117;本席在 origin/main 上独立读到同一行:

    printStep(`Running author-time rules (${registered.length})...`)
    

    计数在运行时从注册表取。⇒ 这段是复现,不是示意 ⇒ 省略会造出程序永不输出的一行。它还把真命令端到端跑了一遍(node packages/cli/bin/run.js validate,在 examples/app-todo),拿到逐字的 → Running author-time rules (41)...。

    ⇒ 卡片与分诊建议的「省略」在这里是错的。先例给的是「怎么想」,不是「怎么改」 —— 这条今天第四次兑现。

    ⭐ 但最有价值的是:38 不是「过期的 41」,是另一扇门的数

    实测:authoringRulesFor('validate').length = 41 · 'build' = 41 · 'lint' = 38(3 条被收窄为 ['validate','build'])。

    ⇒ 那个 38 一直是 os lint 的计数,被印在了一段 os validate 的 transcript 里。它不是「随规则增长而失真」,是从一开始就名不副实。

    ⚠️ 这与本席自己在 #8965 上犯的错是同一个形状:我给 dev 的 flag 清单整份是另一个命令的。⇒ 「这个数看起来只是旧了」是最容易接受的解释,也最容易掩盖「它数的根本是另一样东西」。#9028 的 :257 是查不出数的什么所以省略;这里是查出来了、而且答案是「另一扇门」所以照实改。两种结局不同,方法是同一个:先查它数的是什么,再决定怎么动。

    diff 实核:1 文件、2 增 1 删 —— 计数一行,外加恢复 validate.ts 无条件打印的那条空行(同文件同缺陷类,已在 PR 正文点名)。⛔ 散文里未新增任何硬计数,#9033 的移除仍然成立。

    后续问题:采纳 A,并把选择权交给 #9092

    dev 问「没有东西把这个计数钉在注册表上,它还会漂」,给了 A(接受)/B(为这一个数加门禁)/C(把所有 os 命令样例 transcript 从真实运行重推)。

    采纳 A。 理由是它自己给的那条,本席同意:可测的复发面是「整段 transcript 漂移」,不是这一个整数 —— #9092 已经测出另外两页仍在复现 #4409 之前的分步清单,而 cli.mdx 还整条漏掉了 → Checking capability providers (#3366)...。为一个整数加门禁,买的是一个本来就不大的问题里最窄的一片。⇒ 若要机械化,只有 C 划得来,而且应当按 #9092 的发现来定尺寸,不是按本卡。

    ⚠️ #9092 里还有一条值得分诊注意:validating-metadata.mdx 把读者送去 build-with-claude-code.mdx「for the bare-reference example verbatim」——而那个词当前不成立。


    Generated by Claude Code

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

Metadata

Metadata

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions