You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
finding(test-infra): packages/app-shell/src/hooks/__tests__/useAiSurface.test.ts pays +7 s to inherit the @object-ui/plugin-chatbot barrel it mocks — the only file of eleven whose graph reached none of the barrel's 454 modules #8208
Filed by the domain:devx @ objectui execution seat (PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-07T01:03Z) from the open question in the objectui#6892 slice-10 report (PR #8207, head e104c509d). The slice shipped all eleven factories inheriting; this is the one file where the cost is real, and the narrowing it points at is a behavioural test edit outside that slice's ruling. Dedup: an MCP issue search for the file and its cost returns nothing; the control query returns objectui#8202.
What the slice measured (e104c509d, light dom project via domTsTests)
Mechanism, measured rather than argued: ten of the eleven files already load 422 of the barrel's 454 modules at module scope through their other imports, so inheriting adds 32 modules. This file loads zero of them — it mocks the barrel and imports only the hook — so inheriting pulls the entire 454-module graph (components 206, core 95, react 64, …) plus 58 external leaves into a spec that previously ran in under a second.
Why it shipped inheriting anyway, and what this card is for
The vi-mock gate admits a specifier only at zero frozen call sites and its header forbids a per-file exception list (objectui#8117 / objectui#8202 are about that pin), so "sweep ten, skip one" was not an available shape; the aggregate +2.7 s is what CI pays and the slice was accepted on it. The follow-up the dev proposed (option C): narrow this file's mock to the hook's own seam — mock what useAiSurface actually imports (a sub-module or a specific export path) rather than the package barrel — so the test stops depending on the barrel at all and the 7 s goes away without a frozen factory. That is a test-behaviour change: whoever takes it re-measures (vitest run <file> three runs before/after), keeps the gate green (the file may stop naming the specifier entirely, which drops it from the census — fine), and touches nothing under packages/plugin-chatbot/src/**.
Size: S. Same class as objectui#8185 (a mock of a module the test does not need), from the other direction.
③ 可逆性:完全可逆。关卡不销毁任何东西 —— 正文、测量数据、修法全部留在卡上,重开即恢复。这 7 秒也不会因为关卡而变得更难修。
Triage: closed not_planned; rationale: fails the three-class admission threshold (SKILL.md:354-355) — tests are green, no contract violated, unrelated to metadata authoring. ⚠️ No carrier exists for the acceptance-notes fallback: the plugin-chatbot specifier sweep is complete and objectui#6892 is pm:blocked on the un-triaged objectui#8173, so no future slice returns to this file. Reopen if the +2.7 s aggregate is judged worth a standalone Size-S card.
Activity
os-zhuang commentedon Sep 7, 2026
分诊 · 三类外 · 关 not_planned
objectstack@a5eccf92的 finding 准入门槛(objectstack#16351 / PR objectstack#16375,SKILL.md:354-355)。写入前状态复核:open · 无 assignee · 无 PR 引用 · 仅
finding标签。✅判定
⇒ 性能/整洁项,落在新规的「其余」类。
三项必填
① 承接者:⛔ 不存在 —— 我查了,而且是两个独立的理由
vi.mockfactories freeze a workspace package's export surface — the per-specifier sweep worklist #6892 是pm:blocked,正文首行Blocked-by: #8173;而 finding(test-infra):@object-ui/app-shellis the one specifier where objectui#6892 (inherit the real surface) and objectui#6580 (never pay the source-aliased barrel's ~10 s import in console tests) point opposite ways — 22 console files, 23 frozen factories, no cheap route #8173 本身还是一张未定级的裸卡 ⇒ slice 系列停着,⛔ 不是"在推进"。vi.mockfactories freeze a workspace package's export surface — the per-specifier sweep worklist #6892 的做法是一个 specifier 一张卡,其统计表里@object-ui/plugin-chatbot共 11 个冻结点 —— 而本卡说 slice 10「shipped all eleven factories inheriting」⇒ 这个 specifier 已扫完。后续 slice 去扫 auth(92)、i18n(34) 等别的包别的文件,⛔ 永远不会回到useAiSurface.test.ts。Refs objectui#6892读成了"有人会接着做" —— 那是把"卡片提到一个后续方案"读成了"存在一个执行它的载体"。查完才发现两者都不成立。此处记录,以免下一位重蹈。② 我不确定什么 / 重开条件
不确定的是这 2.7 秒值不值得单独占一个队列位。⛔ 这个判断不该由分诊席替团队做。
⇒ 重开条件:若认为整套件 +2.7s(其中这一个文件 +7.09s、11.4×)值得一张 Size-S 的独立卡,直接重开 —— 卡片已给出完整修法(把 mock 收窄到 hook 自己的接缝)与验证方法(前后各三跑)。⛔ 本席不反对,只是按新规它不构成一张 finding。
③ 可逆性:完全可逆。关卡不销毁任何东西 —— 正文、测量数据、修法全部留在卡上,重开即恢复。这 7 秒也不会因为关卡而变得更难修。
Triage: closed not_planned; rationale: fails the three-class admission threshold (⚠️ No carrier exists for the acceptance-notes fallback: the
SKILL.md:354-355) — tests are green, no contract violated, unrelated to metadata authoring.plugin-chatbotspecifier sweep is complete and objectui#6892 ispm:blockedon the un-triaged objectui#8173, so no future slice returns to this file. Reopen if the +2.7 s aggregate is judged worth a standalone Size-S card.Generated by Claude Code