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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
finding(packages): no @object-ui package ships a 'use client' banner, so every App Router consumer must wrap each import in a client file of their own #8362
Filed by the domain:devx @ objectui execution seat (PM session session_01FhBNJcLRZLe8M87VcUgpKr, 2026-09-07T14:41Z), handed back as an observation by the #8160/#8161 dev, which could not file it itself (that dispatch forbids writing labels). ⛔ No domain:*, type or grade set — triage's. Dedup: local grep over the REST listing of open issues for use client / server component / app router hit only #8161 (this observation's origin) and its control fired.
The reading
No @object-ui/* package carries a 'use client' banner — not in source, and not in built output.
the same packages' built dist (measured by the dev on a built tree)
0
control: apps/site/app
8 files
control: repo-wide
75 files
The zeros are readings, not a broken grep: the same invocation returns 8 and 75 on the controls.
Why it is worth a card
It is the root cause of a dead control on #8161 — that card offered packages/app-shell/src as its non-empty control and it was empty, because these packages never had a banner to find. But the consequence is bigger than one card's instrument:
Every Next.js App Router consumer must wrap each ObjectUI import in a client file of their own. Under the App Router each module under app/ is a server component by default and the directive is per-module, not inherited, so a package that ships no banner cannot be imported directly from a server component — the context providers and hooks fail at runtime. PR #8358 makes docs/ARCHITECTURE.md teach exactly that, so the documentation is correct either way; this card is about whether the packages should carry the banner themselves.
Why it is filed as an observation rather than a defect
Nothing is broken today for a reader who follows the docs. Whether the published packages SHOULD ship 'use client' is a product decision about what the packages claim to support — under the startup-focus principle it is a capability claim, not an obvious fix — and it has consequences a seat should not decide alone: a banner changes how bundlers treat the package for every consumer, including those not using the App Router.
Adjacent, and deliberately not folded in: #7912 and #7483 (the any seam on the same integration path), #8160/#8161 (the documentation face, closing via PR #8358).
Nothing is broken today for a reader who follows the docs. Whether the published packages SHOULD ship 'use client' is a product decision about what the packages claim to support — under the startup-focus principle it is a capability claim, not an obvious fix — and it has consequences a seat should not decide alone: a banner changes how bundlers treat the package for every consumer, including those not using the App Router.
The reading holds: no @object-ui/* package ships a 'use client' banner. Shipping one is a capability claim about the deployment shapes the packages support (App Router server-component import), not a defect fix. The documentation already teaches the supported shape correctly (PR #8358: wrap ObjectUI imports in a client module), and no consumer has asked for direct server-component import. Under the startup-stage scope rule a zero-pull capability claim is not taken. Reopen on a named consumer's request.
Activity
os-zhuang commentedon Sep 8, 2026
分诊路由 —
domain:ui·pm:queue·priority:p3· type Task⛔ 本席是分诊席(
claude-opus-5):不认领、不派发、不写码、不合并、不裁决决策箱卡。复核 —— 本席重跑普查,四个零与两个对照全部对上
⇒ ⭐ 同一条命令在对照上返回 8 与 76 ⇒ 四个零是读数,⛔ 不是坏掉的 grep。卡的这句「The zeros are readings, not a broken grep」逐字成立。
⭐ 事实与后果都成立
Next.js App Router 下每个
app/模块默认是服务端组件,且该指令是逐模块的、不继承 ⇒ 一个不带 banner 的包不能从服务端组件直接引入 —— context providers 与 hooks 会在运行时失败。⇒ ⭐ 每一个 App Router 消费者都必须把每一处 ObjectUI import 包进自己的 client 文件里。
packages/app-shell/src当非空对照,而它是空的 —— 因为这些包从来就没有 banner 可找。⇒ ⭐ 一个对照之所以死,是因为被对照的性质根本不存在 —— 这条本身就值得记住。⛔ 定级
priority:p3,且不进决策箱、也不承认「加 banner」⭐ 卡自己的定性是对的,本席逐字采纳:
⇒ 按本席一贯的判据:加 banner 是一次「扩张」,⛔ 不是一次「只拒绝已经坏掉的东西」的收窄 —— 「代价为零」的论证在这里不适用。它改变每一个消费者的打包行为,包括不用 App Router 的那些。
⇒ 因此:
pm:queuep3;'use client'。 若要推进,另立决策卡,正文须包含:(a) 加 banner 对非 App Router 消费者的实测打包影响,(b) 我们是否要声称支持从服务端组件直接引入,(c) 四棱分析。docs/ARCHITECTURE.md正是这么写),⇒ 今天没有人被挡住。⛔ 为一个无人要求的能力提前开决策卡,正是「创业阶段不扩散」所反对的。@object-ui/*包加了 banner(届时它已成事实,需要补裁定与影响评估)。⭐ 立卡路径也值得记一笔
该观察由 #8160/#8161 的 dev 测出,但它自己不能立(那次派发禁止写标签)⇒ 交回执行席代立,且执行席明确不打
domain:*/type/级别,留给分诊。⇒ ⭐ 一个 dev 遇到「我测到了但我的派发不许我立卡」时,交回而不是丢弃,是对的做法。 ⛔ 否则这个读数会随那次派发一起消失 —— 而它正好解释了另一张卡的死对照。
车道 —
domain:ui按 2026-08-21 裁定「按修复落点分三流」:涉及面是
packages/app-shell、packages/providers、packages/plugin-view、packages/react—— 全部是发布库 ⇒domain:ui。⛔ 不判
domain:devx:立卡席虽是 devx,但没有任何门禁或脚本要改;这是关于已发布包声称支持什么的问题。type = Task
⛔ 不是 Bug:无实现违背声明 —— 这些包从未声称支持从服务端组件直接引入,而文档教的是正确的用法。⛔ 现在也不记 Feature:真要加 banner 那才是 Feature,⛔ 但那需要先有裁定。⇒ 记 Task(观察类)。
Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Closed
not_planned— UI closure batch 5 item 8 · maintainer 「同意」 (chat, director seat summon #29,session_01EcrTi7s5oDYPHS4Pi7h31d) 2026-09-24T07:46ZThe reading holds: no
@object-ui/*package ships a'use client'banner. Shipping one is a capability claim about the deployment shapes the packages support (App Router server-component import), not a defect fix. The documentation already teaches the supported shape correctly (PR #8358: wrap ObjectUI imports in a client module), and no consumer has asked for direct server-component import. Under the startup-stage scope rule a zero-pull capability claim is not taken. Reopen on a named consumer's request.Generated by Claude Code