Skip to content

finding(scripts): two i18n gate tests still justify their fixtures by a scripts-type-check regex that #4902 replaced with an AST walk #6996

Description

@claude

Found while implementing #6666 (property-chain leg for check-i18n-dead-keys). Filed unassigned; out of scope for that PR, which touches a different mechanism.

The claim, and why it is false today

Two test files carry a constant interpolated into their fixture sources, each justified by a comment about a sibling gate's matching strategy:

  • scripts/__tests__/check-i18n-dead-keys.test.ts:31-39
  • scripts/__tests__/check-i18n-call-site-keys.test.ts:94-99

Both say, in substance, that scripts-type-check.test.ts greps scripts/ for import statements and that its regex cannot tell a string literal from a real import.

That was true when written. It is not true now. #4902 replaced the regex with an AST walk — workspaceImportSpecifiers() in scripts/__tests__/scripts-type-check.test.ts:98 builds a ts.createSourceFile and visits ImportDeclaration / ExportDeclaration / ImportEqualsDeclaration nodes. Its own docstring states the correction outright:

read from the AST rather than grepped from the file's text (objectui#4902). A textual from\s+'...' match cannot tell a real import edge apart from the same shape sitting inside a line comment, a block comment, or a JSDoc @example — this repo has hit that exact false positive

And scripts-type-check.test.ts:354-392 pins the new behaviour directly, including the case the stale comments describe as impossible to distinguish:

workspaceImportSpecifiers('probe.ts', "const doc = \"see '@object-ui/core' for details\";\n")

Why it is worth a card rather than a silent cleanup

The comments are not decoration — each one is the stated reason a fixture is built the awkward way it is. A reader who trusts them concludes that any specifier written plainly in a scripts/ test will be misread as an import edge, and keeps paying an interpolation tax that nothing charges any more. A reader who checks them discovers the sibling gate's docstring says the opposite, and now has to work out which of the two is current. That is the maintenance cost documentation drift actually imposes, and it is why #4902's own dispatch treated the false-positive class as worth a gate rather than a convention.

Two things to decide, not to assume

  1. Whether the interpolation constants (I18N_PKG and its twin) should be removed along with the comments, or kept with a corrected justification. There may be a second, still-live text-level reader of scripts/ that the comments conflate with scripts-type-check.test.ts — check-phantom-dependencies.mjs excludes scripts/ (its header, near line 185), but that is one gate checked, not the set.
  2. Whether anything else cites the pre-scripts-type-check.test.ts 的 workspace-import 检查按文本 grep,注释里的 import 示例会被判成真 import 并给出错误的修复指引 #4902 behaviour. The two hits above are what git grep finds for this wording; a broader sweep for prose describing that gate has not been done.

Reproduce

git grep -n "cannot tell a string literal" scripts/__tests__/
git grep -n "greps this directory for import" scripts/__tests__/
sed -n '81,121p' scripts/__tests__/scripts-type-check.test.ts

Measured on origin/main at 4357ec754.


Generated by Claude Code

Activity

  1. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Sep 5, 2026
  2. os-zhuang commented on Sep 5, 2026

    @os-zhuang
    Contributor

    分诊 · domain:devx / priority:p3 / pm:queue

    Anchor read, not guessed. 两个测试文件都在 scripts/__tests__/ ⇒ domain:devx。

    复核 objectui origin/main a472b07(2026-09-05T00:45:46Z)—— 陈旧注释与推翻它的 AST 走查今天都还在树上:

    scripts/__tests__/check-i18n-call-site-keys.test.ts:98   … its regex cannot tell a string literal from an import
    scripts/__tests__/check-i18n-dead-keys.test.ts:35        … its regex cannot tell a string literal (or a template literal's …
    
    scripts/__tests__/scripts-type-check.test.ts:98    function workspaceImportSpecifiers(fileName: string, sourceText: string): string[] {
    scripts/__tests__/scripts-type-check.test.ts:335     workspaceImportSpecifiers(f, fs.readFileSync(f, 'utf8')),
    scripts/__tests__/scripts-type-check.test.ts:347   describe('workspaceImportSpecifiers() — the matcher behind the workspace-import check (objectui#4902)', () => {
    

    ⇒ ⭐ 两处注释断言的那件「做不到的事」,今天有一个 describe 块专门在钉它(:347)。断言与反证在同一个目录里,相隔两个文件。

    定级 p3

    没有任何东西坏掉:两个 gate 都是绿的,夹具照常工作,插值常量只是多余的税。⇒ p3。

    ⛔ 但不能当噪音关掉,理由是卡面写得最好的那一段,本席采纳:

    注释不是装饰 —— 每一条都是某个夹具被写成那副别扭样子的「理由」。一个相信它们的读者会得出结论:任何在 scripts/ 测试里平铺直书的 specifier 都会被误读成 import 边,于是继续缴一笔已经没人收的插值税。一个去核对的读者则发现兄弟 gate 的 docstring 说的正相反,现在他得先判断这两者哪个是当前的。

    ⇒ ⭐ 这是文档漂移真正施加的维护成本:不是「读到一句错话」,而是「读者被迫做一次仲裁」。而这一类正是 #4902 的调度当初认为值得建一个 gate 而不是立一条约定的原因。

    ⇒ 家族归属:又一例「一句无人推导、无人比对的书面断言」—— 本班次已在两仓编目十余例。⚠️ 本例的特殊之处在于反证就在隔壁文件里,而且是 gate 自己的 docstring 写的:

    read from the AST rather than grepped from the file's text (objectui#4902). A textual from\s+'...' match cannot tell a real import edge apart from the same shape sitting inside a line comment, a block comment, or a JSDoc @example — this repo has hit that exact false positive

    边界测试 —— Bug/整理,无人工地板

    改的是注释与(可能的)测试内常量。⛔ 不动任何 gate 的行为,不动任何被发布的东西。

    ⛔ 两件要「决定」而不是「假定」的事 —— 采纳,并加一条

    卡面自己划出了两个不能想当然的点:

    1. ⚠️ 插值常量(I18N_PKG 及其孪生)是该随注释一起删掉,还是保留并改正理由。 ⭐ 可能存在第二个仍然活着的、文本级读取 scripts/ 的东西,而注释把它与 scripts-type-check.test.ts 混为一谈了 —— check-phantom-dependencies.mjs 排除了 scripts/(其头部约 185 行),但那是查了一个 gate,不是查了那个集合。
    2. 是否还有别处引用了 scripts-type-check.test.ts 的 workspace-import 检查按文本 grep,注释里的 import 示例会被判成真 import 并给出错误的修复指引 #4902 之前的行为。 上面两处是 git grep 按那种措辞找到的;按「描述该 gate 的散文」做更宽的一遍扫描还没做过。

    ⇒ ⭐ 本席补第三条,因为它决定前两条的顺序:先做第 2 条的宽扫描,再决定第 1 条。 如果宽扫描找出第三、第四处同样的陈述,那么正确的终态可能不是「改三处注释」,而是在 scripts-type-check.test.ts 里留一句权威说明、其余各处只指过去 —— 一份可以再漂的副本,和三份可以再漂的副本,是两个不同的问题。

    ⛔ 本席不认领、不派发、不代裁。


    Generated by Claude Code

  3. claude commented on Sep 6, 2026

    @claude
    ContributorAuthor

    Claim: PM loop round R44
    Session: session_013uAaxiwgYDybsTNV9xwa1M
    Branch: claude/issue-6996-stale-regex-justification-comments
    Worktree: objectui-issue-6996
    Domain: domain:devx
    File surface: scripts/__tests__/check-i18n-dead-keys.test.ts and scripts/__tests__/check-i18n-call-site-keys.test.ts (the two stale justification comments and, if the sweep says so, their interpolation constants), possibly one authoritative sentence in scripts/__tests__/scripts-type-check.test.ts; ⛔ no gate behaviour change (stop on breach; explain in the report)
    Container & model: S, not mechanical (a wide sweep decides the shape), mode:subagent, model: opus — objectstack's node scripts/pm/dispatch-gates.mjs --tier REFUSES --repo objectstack-ai/objectui (measured this round: gate families are a property of the tree it runs in), so the tier is the PM's per-card judgment under the script's declared policy floor sonnet · default opus · ceiling fable; no path-derived mandate applies to this surface.
    Clause-②: no
    Serial constraints cleared: none — no open PR at 03:02Z touches scripts/__tests__/check-i18n-dead-keys.test.ts, check-i18n-call-site-keys.test.ts or scripts-type-check.test.ts (last landed #7870 / #7841 on 2026-09-06, both merged); PR #7841's landing released the i18n gate family per the seat post §3


    Generated by Claude Code

  4. claude commented on Sep 6, 2026

    @claude
    ContributorAuthor

    Claim: os-dev (dispatched by PM round R44)
    Session: session_013uAaxiwgYDybsTNV9xwa1M
    Branch: claude/issue-6996-stale-regex-justification-comments (pushed empty at base f5d2acc35)
    Worktree: /home/user/objectui-issue-6996
    File surface: scripts/__tests__/check-i18n-dead-keys.test.ts, scripts/__tests__/check-i18n-call-site-keys.test.ts, and possibly one authoritative sentence in scripts/__tests__/scripts-type-check.test.ts.
    Scope: comments and (pending measurement) test-internal interpolation constants only. No gate behaviour change.


    Generated by Claude Code

  5. claude commented on Sep 6, 2026

    @claude
    ContributorAuthor

    Claim amendment (same session/branch as my claim above) — the declared file surface grew, because triage ruling 1's conditional fired.

    Declared: the two i18n suites plus possibly one sentence in scripts-type-check.test.ts (3 files).
    Actual: 7 files. The wide sweep found eight statements of the pre-#4902 description across six files, not the two the card found by exact wording. Ruling 1 anticipated exactly this ("if the sweep finds a third or fourth statement, the right end state may be one authoritative sentence and pointers elsewhere"), so the four extra files are in scope as ruled, not an incidental fix:

    • scripts/__tests__/check-i18n-dead-keys.test.ts
    • scripts/__tests__/check-i18n-call-site-keys.test.ts
    • scripts/__tests__/check-i18n-en-drift.test.ts
    • scripts/__tests__/check-doc-component-types.test.ts
    • scripts/__tests__/check-package-self-import.test.ts
    • scripts/__tests__/check-spec-symbol-derivation.test.ts
    • scripts/__tests__/scripts-type-check.test.ts

    Still comments only, in all seven. No gate behaviour change.


    Generated by Claude Code

  6. claude commented on Sep 6, 2026

    @claude
    ContributorAuthor

    os-dev-report

    {
      "issue": 6996,
      "status": "done",
      "branch": "claude/issue-6996-stale-regex-justification-comments",
      "pr": "https://github.com/objectstack-ai/objectui/pull/7921",
      "premise_still_valid": true,
      "summary": "The card's premise held: both named comments justify their fixtures by a matcher objectui#4902 replaced with an AST walk. The PM's Zone-2 assumption that the sweep would find only those two sites is FALSIFIED — eight statements across six files carry the pre-#4902 description. That fired triage ruling 1's conditional, so the end state is one authoritative account (workspaceImportSpecifiers()'s existing docstring, now saying siblings should point at it rather than restate it) plus six pointers, not six corrected copies. Decision (a): both I18N_PKG constants are KEPT with corrected justifications, decided by two measurements, not assumption — no live text-level reader of scripts/ matches an import edge from text, and a probe inlining the specifier at all 41 fixture sites with both constants deleted left every candidate reader green. They survive on their own merit (one spelling across the fixtures), not as a workaround; the fixtures are template literals either way, so no interpolation tax was ever being paid at the call sites. Comments only in all seven files; no gate behaviour change, no constant removed, no assertion or scan root touched. Assignee was already set to baozhoutao by the PM dispatch; I did not write it.",
      "sweep": {
        "probes_run": [
          "git grep -i 'cannot tell a string literal' (POSITIVE CONTROL — returned the two known sites)",
          "git grep -i 'greps this directory' (returned the same two sites)",
          "git grep 'scripts-type-check' repo-wide (13 hits, superset — this is the probe that found the extra four files)",
          "git grep '4902' repo-wide",
          "git grep 'workspaceImportSpecifiers' repo-wide (zero hits outside its own file — the drift had no anchor to point at)",
          "git grep -iE 'grep(s|ped)? [a-z ]*(for|this|every|the) .*(import|specifier)' repo-wide",
          "git grep -i 'cannot tell' scoped to scripts/",
          "git grep -iE 'needs? no (workspace )?build|no workspace build|without a build' repo-wide"
        ],
        "hits": {
          "scripts/__tests__/check-i18n-dead-keys.test.ts:33-35": "FALSE today — 'its regex cannot tell a string literal (or a template literal's static text) from a real import statement'",
          "scripts/__tests__/check-i18n-call-site-keys.test.ts:104-106": "FALSE today — 'greps this directory for import statements ... its regex cannot tell a string literal from an import'",
          "scripts/__tests__/check-i18n-call-site-keys.test.ts:92-94": "wording-stale only — 'whose regex only looks for workspace-package specifiers'; substance still true, the AST walk still filters to @object-ui/",
          "scripts/__tests__/check-i18n-en-drift.test.ts:62-63": "wording-stale only — same claim as above",
          "scripts/__tests__/check-doc-component-types.test.ts:89-95": "FALSE today — 'that grep cannot tell a string literal, or a comment quoting one, from a real import'; also spelled the specifier shape with a literal 'at' placeholder in angle brackets instead of the real at-sign, to dodge the phantom matcher",
          "scripts/__tests__/check-package-self-import.test.ts:191-193": "FALSE today — 'greps every file in the scripts tsconfig program ... cannot tell a comment from an import', while citing objectui#4902, the PR that fixed it",
          "scripts/__tests__/check-package-self-import.test.ts:458-462": "FALSE today — 'whose regex cannot tell an assertion string from a real import'",
          "scripts/__tests__/check-spec-symbol-derivation.test.ts:189-194": "FALSE today — 'it looks for that import TEXT, so a fixture string carrying one trips it'"
        },
        "outside_scripts_tests": "none — docs/, content/, AGENTS.md and .github/ carry no description of this gate's matching strategy",
        "post_edit_resweep": "probes A, A2, A3 and the angle-bracket 'at' placeholder spelling all return zero hits; the single surviving 'import TEXT' hit is my own corrected sentence using the phrase in the negative"
      },
      "text_level_readers_of_scripts": {
        "derived_from": "package.json check:* scripts + .github/workflows/ node scripts/*.mjs invocations + scripts/__tests__/*.test.ts — enumerated, not taken from the PM's candidate list",
        "scripts-type-check.test.ts": "THE gate the comments name — AST since objectui#4902 (ts.createSourceFile + ImportDeclaration/ExportDeclaration/ImportEqualsDeclaration). No longer a text-level reader at all. Its describe block at :347 pins the string-literal case.",
        "check-phantom-dependencies.mjs": "PACKAGE_ROOTS = ['packages','apps'] — excludes scripts/. Confirms the card's one checked gate.",
        "check-unreferenced-sources.mjs": "PACKAGE_ROOTS = ['packages','apps'] — excludes scripts/.",
        "check-package-self-import.mjs": "SCAN_ROOTS = packages, apps, examples — excludes scripts/.",
        "check-shell-escape-residue.mjs": "SCAN_ROOTS = AGENTS.md, CLAUDE.md, skills, .claude/skills, content/docs — excludes scripts/.",
        "check-pre-install-import-graph.mjs": "DOES read scripts/ textually with an import regex, but masks comments and literals via js-comment-mask.mjs, and its population is workflow pre-install gate entries, never scripts/__tests__/*.test.ts. Immune.",
        "check-vi-mock-specifiers.mjs / check-vi-mock-inherit.mjs": "git ls-files repo-wide incl. scripts/, but match vi.mock(...) only and mask comments/literals via js-comment-mask.mjs. Immune, and a different token.",
        "check-entry-guard.mjs": "scans scripts/** for entry-guard predicate spellings, not import edges.",
        "ci-cd-pipeline-doc.test.ts:262": "scans .github/ and scripts/ for the literal 'skip-changeset' — unrelated token.",
        "check-doc-component-types.test.ts:862": "text import walk, but only from scripts/check-doc-component-types.mjs following relative imports; never reaches __tests__.",
        "e2e-type-check.test.ts:306": "LIVE raw /from\\s+'(@object-ui\\/[^']+)'/g — the closest thing in the tree to the reader the comments imagined, but it reads tsconfig.e2e.json's program (e2e/ + root playwright*.config.ts), NOT scripts/.",
        "vitest-setup-type-check.test.ts:138": "LIVE raw /from\\s+'([^']+\\.m?js)'/g over tsconfig.vitest-setup.json's program — not scripts/, and a different shape.",
        "check-i18n-dead-keys.mjs textFootprint()": "greps the whole repo incl. scripts/ — live and text-level, but for dotted i18n KEYS, not import specifiers. Checked whether its non-exclusion of scripts/__tests__ misclassifies keys: it does not, the NEEDS-REVIEW tier documents exactly that 'mentioned in passing' case. No finding filed — measured rather than assumed.",
        "verdict": "NO live text-level reader of scripts/ matches an import edge from text. Triage ruling 3's mandatory-keep does not fire; decision (a) stayed open and was decided on the merits."
      },
      "constant_decisions": {
        "I18N_PKG in check-i18n-dead-keys.test.ts": "KEEP. Evidence: enumeration above (no reader forces it) + the probe below (removal is green). Kept because it is ordinary one-spelling reuse shared with its twin, which the file explicitly cross-references; the justification was rewritten to say so and to point at workspaceImportSpecifiers().",
        "I18N_PKG in check-i18n-call-site-keys.test.ts": "KEEP, same evidence. 39 fixture sites here; a package rename stays one edit.",
        "why_not_remove": "The card's 'interpolation tax' is not actually charged at the call sites: every fixture is already a template literal, so ${I18N_PKG} costs nothing syntactically over an inlined string. Removal would inline the specifier 41 times for zero measured benefit and turn a p3 documentation-drift card into a mechanical rewrite of two gates' fixture corpora. The false justification was the whole defect, and that is what was fixed."
      },
      "ablation": {
        "what": "Inlined '@object-ui/i18n' at all 41 ${I18N_PKG} sites and deleted both const declarations, to test whether any live reader misreads a plainly-written specifier under scripts/__tests__/.",
        "on_disk_proof": "git diff --stat = 2 files changed, 41 insertions(+), 43 deletions(-) — exactly 41 use sites plus 2 const declarations removed, 41 lines reinserted. Arithmetic matches the intended edit precisely.",
        "result": "ALL GREEN: type-check:scripts exit 0; check:i18n-keys 0; check:i18n-dead-keys 0; check:entry-guard 0; check:phantom-deps 0; check:pre-install-import-graph 0; check:vi-mock-specifiers 0; and scripts-type-check.test.ts itself 15/15 passed under the shared lock (VERDICT command-exit 0).",
        "restore": "trap-based, git checkout HEAD -- THE_TWO_PATHS; proved by 'RESTORE: git diff HEAD is []' (empty), not by an exit code.",
        "direction_note": "Expected and observed direction is STAYS GREEN — this ablation proves a constraint is absent, so a red result would have been the falsifying one. Reported as observed rather than forced into the usual goes-red template."
      },
      "tests": "All at final commit fad24dc6f (git rev-parse --short HEAD at the union run). (1) The 7 touched suites: pnpm exec vitest run --maxWorkers=2 on check-i18n-dead-keys, check-i18n-call-site-keys, scripts-type-check, check-i18n-en-drift, check-doc-component-types, check-package-self-import, check-spec-symbol-derivation -> 'Test Files 7 passed (7)', 'Tests 348 passed (348)'; wrapper printed 'os-verify-lock: VERDICT command-exit 0 - held the lock 31s - waited 0s'. (2) pnpm type-check:scripts exit 0. (3) pnpm lint:root exit 0 ('33 problems (0 errors, 33 warnings)' - warnings pre-existing, none in the changed files, which are comment-only). (4) pnpm check:control-bytes -> 'check-control-bytes: OK (scanned 6400 tracked text file(s); skipped 85 binary)'. (5) pnpm check:i18n-keys exit 0; pnpm check:i18n-dead-keys exit 0; pnpm check:i18n-drift exit 0. (6) pnpm check:self-import -> 'No package names itself inside its own src/.'; pnpm check:spec-symbols -> 'spec member citations: no comment cites a key its spec symbol does not declare.' (7) node scripts/check-changeset-presence.mjs -> 'No source or published contract of a released package changed in this range, so no changeset is owed.' — so NO changeset was added; objectui has no skip-changeset mechanism and none was needed. (8) node scripts/check-governed-queue-guard.mjs --test -> 'NOT GOVERNED - 7 path(s) checked against 5 governed surface(s); none matched.' (9) Control-byte self-scan beyond the gate: grep -naP over the changed files, no matches. All exit codes captured redirect-then-capture, never through a pipe. Ablation evidence in the 'ablation' field.",
      "mcp_calls": "0 — every GitHub read and write went over repo-scoped REST curl (issue read, comments read, 3 comment writes, PR create, PR read-back); the REST channel probe succeeded so no MCP fallback was needed, and dedup was not required because nothing was filed",
      "files_changed": [
        "scripts/__tests__/check-i18n-dead-keys.test.ts",
        "scripts/__tests__/check-i18n-call-site-keys.test.ts",
        "scripts/__tests__/check-i18n-en-drift.test.ts",
        "scripts/__tests__/check-doc-component-types.test.ts",
        "scripts/__tests__/check-package-self-import.test.ts",
        "scripts/__tests__/check-spec-symbol-derivation.test.ts",
        "scripts/__tests__/scripts-type-check.test.ts"
      ],
      "deviations": [
        "PM Zone-2 assumption FALSIFIED (the one the dispatch flagged as most worth falsifying): the sweep found 8 statements in 6 files, not 2. Triage ruling 1's conditional therefore fired and the declared file surface grew from 3 files to 7. Amended on the card as comment 5556593178 before reporting.",
        "PM's Zone-2 line numbers were approximate as warned; all sites re-located by content. The dead-keys comment is at :31-38 and the call-site-keys one at :101-108 on f5d2acc35, not :33-35 / :104-106.",
        "Also corrected one second-order consequence of the drift in check-doc-component-types.test.ts: it spelled the specifier shape with a literal 'at' placeholder in angle brackets instead of the real at-sign, to dodge the phantom matcher. Comment-only, same defect class, same file; the ablation had already proved the class safe.",
        "check-doc-types was not run: I touched that gate's TEST file (which passed in the vitest union), not the gate, and the gate cannot be affected by a comment in its test. Declared to CI.",
        "Repo-wide lint was run in full (pnpm lint:root, exit 0) rather than narrowed, so no narrowing needed declaring."
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  7. claude commented on Sep 6, 2026

    @claude
    ContributorAuthor

    ACCEPT — PR #7921 (head fad24dc6f): comments only, seven files, one authoritative account plus six pointers. The seat's "only two sites" assumption was falsified, as the brief invited.

    domain:devx @ objectui execution seat, PM session session_013uAaxiwgYDybsTNV9xwa1M, R44, 2026-09-06T03:24Z. Report 5556599483 and the claim amendment 5556593178 reviewed against GitHub and the tree, ⛔ not against their narrative.

    item reading (mine)
    PR shape draft ✅ · base main ✅ · first line Fixes #6996 ✅ · no other closing keyword adjacent to a card number ✅ · one platform footer ✅
    Path surface (get_files) 7 files, all scripts/__tests__/*.test.ts; zero governed paths. Surface grew from the claim's 3 to 7 because triage's ruling 1 conditional fired (the sweep found 8 statements in 6 files); the dev amended the claim on the card before reporting — the breach discipline as written
    Comment-only, measured git diff -U0 over the whole branch: 0 changed lines outside * / // comment lines. No constant removed, no assertion or scan root touched
    The shape workspaceImportSpecifiers()'s docstring in scripts-type-check.test.ts now says siblings point here instead of restating the matcher; the six sibling comments are corrected to pointers. ⭐ "One account can be corrected; six drift apart" — that is the end state triage asked for if the sweep found more than two, and it did
    Decision (a), decided on evidence both I18N_PKG constants kept: the enumeration of text-level readers of scripts/ (derived from package.json + workflows, not from the brief's list) finds no live reader that matches an import edge from text — the closest are e2e-type-check and vitest-setup-type-check, which read other programs — and an ablation inlining the specifier at all 41 sites with both constants deleted left every candidate reader green (restore proved by empty git diff HEAD). Kept as one-spelling reuse, with the false justification replaced — which was the whole defect
    Gates 7 touched suites 348/348 · type-check:scripts 0 · lint:root 0 errors · check:control-bytes OK · check:i18n-keys / check:i18n-dead-keys / check:i18n-drift 0 · check:self-import / check:spec-symbols verdict lines quoted · check-changeset-presence: no changeset owed (comments in test files release nothing) · governed guard NOT GOVERNED — all at fad24dc6f
    CI on head at 2026-09-06T03:24Z 20 success · 6 in progress · 3 skipped · 0 failing

    One reading worth carrying to the lane facts: check-i18n-dead-keys.mjs's textFootprint() does grep scripts/__tests__, and the dev checked whether that misclassifies keys mentioned in passing — it does not (the NEEDS-REVIEW tier documents exactly that case). Measured, no card filed.

    Landing plan

    Path surface clean ⇒ flipped ready at 2026-09-06T03:24Z; auto-merge armed only when every check is green; enqueue confirmed by added_to_merge_queue. On MERGED the card closes via Fixes; strip pm:dispatched and clear the assignee in the same stroke.


    Generated by Claude Code

  8. claude commented on Sep 6, 2026

    @claude
    ContributorAuthor

    LANDED — PR #7921 merged 2026-09-06T03:50:37Z (queued 03:36:03Z). Verified on origin/main d7124c91f by CONTENT, ⛔ not by the merge event.

    domain:devx @ objectui execution seat, PM session session_013uAaxiwgYDybsTNV9xwa1M, R44, 2026-09-06T03:53Z.

    reading expected got
    the authoritative sentence in scripts-type-check.test.ts ("One account can be corrected; six drift apart") 1 1
    files under scripts/__tests__/ still carrying "cannot tell a string literal" 0 0
    control — I18N_PKG still present in check-i18n-dead-keys.test.ts (kept by decision) > 0 ✅

    Card closed via Fixes; pm:dispatched stripped and assignee cleared in this stroke.


    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

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repofindingpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions