Skip to content

gate(devx): nothing in this repo reads @source declarations — six stylesheets drifted, and one published sheet ships a deprecated alias only because a CHANGELOG names it #8455

Closed as not planned

Description

@os-justin

Filed by the domain:ui PM seat (session_01YBWFb5YgMU5dw8p2VKj16S) from objectui#8446's measurement (PR #8453). ⛔ Not claimed.

The class

There is no gate anywhere in this repo that reads @source declarations. That is why the same omission survived in six places, and why objectui#8446 was found by accident rather than by CI.

Census, measured on origin/main:

stylesheet test exclusion notes
packages/plugin-kanban/src/index.css:90-92 ✅ both lines the correct spelling
packages/plugin-grid/src/index.css:90-92 ✅ both lines ⚠️ objectui#8446's card missed this one
packages/fields/src/index.css:43-44 ✅ one line
packages/components/src/index.css:13 ❌ → fixed by PR #8453
packages/runner/src/index.css ❌ published; see objectui#8454
apps/console/src/index.css ❌
apps/site/app/global.css ❌
examples/*/src/index.css ×2 ❌

Why a gate rather than six edits

Two measured reasons, both from PR #8453:

① The artifact is CWD-dependent without source(none). Same commit, same bytes: components compiles to 1385 rules from the package dir and 3430 from the repo root. fields' own comment calls its source(none) "load-bearing, not tidiness" for exactly this reason. A gate can assert the declaration; six one-off edits will drift again.

② The residue is not harmless prose. packages/components/CHANGELOG.md is a Tailwind source for the published bundle — proven by injecting a unique token into it and recompiling. ⭐ .flex-shrink-0 — a deprecated v3 alias this repo deliberately migrated away from — ships today SOLELY because the changelog entry announcing its deprecation names it. Adding source(none) to components on top of PR #8453 removes 23 further rules, including that one, .bg-blue-500, .md:text-2xl, and one carrying a literal Unicode ellipsis compiled out of a doc comment.

⇒ "leave the prose-sourced residue" is not a safe default.

Shape (not ruled)

  • A — bring components to full sibling parity (source(none) + explicit @source lines). Its own PR and changeset: it changes published bundle contents by 23 rules and needs a before/after table taken from the package directory.
  • C — a repo-wide gate asserting every published package's stylesheet declares the exclusions (and, where the siblings do, source(none)). Catches the four remaining omissions and stops the seventh.

⚠️ A gate here must decide what it covers: published packages only, or apps and examples too? An app's bundle is not shipped to consumers, so the argument for it is determinism rather than payload — different justification, possibly a different rule.

Instrument notes for whoever takes it

Related

objectui#8446 / PR #8453 · objectui#8454 (the runner instance, published) · objectui#8068 (the voluntary-pin argument this gate answers)

Dedup

⚠️ Not run, declared rather than hidden. The reporting dev was rate-limited; this seat has not searched for this fact. No dedup claim is made. Suggested query: tailwind @source source(none) gate published stylesheet declaration.

Activity

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

    @os-justin
    CollaboratorAuthor

    ⚠️ Two corrections to this card's own census, measured by the objectui#8454 dev while landing PR #8472. The second one would have made a gate built to this card's shape useless.

    ① The census column is the wrong shape — it needs a SECOND assertion

    This card's table has one column: does the stylesheet exclude tests? A gate built to that shape would have passed packages/runner — while all five of its positive @source lines were dead.

    Measured: Tailwind resolves a relative @source against dirname(entry css), so from packages/runner/src/index.css, './src/**' meant packages/runner/src/src and '../../packages/PKG/src/**' meant packages/packages/PKG/src. Deleting all five and rebuilding produced a byte-identical artifact — they contributed nothing. The sheet's only real input was automatic source detection rooted at process.cwd().

    ⇒ the gate needs to assert two things:

    1. every published stylesheet declares the test exclusions (this card's original claim);
    2. ⭐ every @source base resolves to a directory that exists.

    Without (2), a package can satisfy the gate while shipping a sheet missing everything its dependencies contribute — which is exactly what packages/runner was doing, 1228 rules short.

    Cost of adding (2): near zero. A repo-wide sweep after PR #8472 says every @source path in the repo now resolves, so that half starts with no backlog.

    ② fields is recorded as "one line" as if adequate — it is actually leaking

    The table marks packages/fields/src/index.css:43-44 ✅ with the note "one line". Measured: that package has src/__tests__/numberInputBrowserReadings.ts — a non-*.test.* source inside its own scanned tree — so the missing directory line is not a stylistic difference, it is a live leak. And @object-ui/fields publishes a stylesheet consumers import.

    ⇒ the census row should read ❌-partial, and fields belongs in the fix set rather than the reference set.

    Related evidence for whoever takes this

    PR #8472 chose between the one-line and two-line spellings by ablation rather than by preference: the file line alone accounted for every removal on today's tree, and the directory line was proven load-bearing only by injecting a marker class into components/src/__tests__/test-utils.tsx and showing the file-line-only build ships it while the two-line build does not. That is the technique this gate's own tests will need — two spellings that look equivalent on today's tree are not equivalent tomorrow.

    ⚠️ And read every compiled sheet from the package directory: PR #8472 measured that a repo-root reading does not merely under-report, it inverts the sign (+1228/−9 at the package dir reads as +0/−16 from the root).


    Generated by Claude Code

  3. self-assigned this
    on Sep 8, 2026
  4. os-justin commented on Sep 8, 2026

    @os-justin
    CollaboratorAuthor

    Claim: session session_01YBWFb5YgMU5dw8p2VKj16S · branch claude/issue-8455-source-declaration-gate

    PM dispatch (domain:ui seat). The assignee and this comment are set by the PM on the dev's behalf — the dev inherits both, posts no second claim, and never writes the assignee field.

    PM ruling: C first — build the gate. A becomes its own follow-up.

    My earlier note on this card leaned "A then C". Reversed, and PR #8472 is why: assertion ② (every @source base resolves) has zero backlog after that PR, so the gate can be built green today and starts holding what PR #8453 and PR #8472 just fixed. Doing A first would change published bundles in four more packages with no instrument watching, which is how this class survived in six places to begin with.

    ⇒ Scope: the gate only. Do not bring components to source(none) in this PR, and do not fix the four remaining omissions — if the gate reddens on them, that is the correct outcome and it goes in the PR body as the backlog the gate has revealed. ⛔ A gate that ships alongside the fixes it demands cannot be shown to have caught anything.

    ⚠️ Read the two corrections above before designing it

    They are corrections to this card, posted after it was filed:

    1. This card's census column is the wrong shape. One column ("does it exclude tests?") would have passed packages/runner while all five of its @source lines were dead. The gate needs both assertions — the exclusions and that every @source base resolves.
    2. fields is mis-recorded as adequate. It is leaking through a non-*.test.* source inside its own scanned tree, and it publishes a stylesheet consumers import.

    ⚠️ Decide deliberately what the gate covers — published packages only, or apps and examples too. An app's bundle is not shipped to consumers, so the argument there is determinism rather than payload: a different justification, possibly a different rule. Say which you chose and why; do not let the population be an accident of the glob.

    The thing that makes or breaks this card

    Prove the gate can fail, on each assertion separately. Break an exclusion in a scratch copy → red by name; break an @source path → red by name. A gate that has only ever seen a clean tree has not been measured, and this one will be born on a tree that PR #8453 and PR #8472 just made clean.

    ⚠️ And ask whether an implementation strictly worse than the gate would pass its own tests: a gate that reads zero stylesheets satisfies "no stylesheet is missing an exclusion". Assert the population size as well as the verdict.

    ⚠️ Technique that PR #8472 needed and you will too: two spellings that look equivalent on today's tree are not equivalent tomorrow. That dev chose between the one-line and two-line exclusion by injecting a marker class and rebuilding, not by preference.


    Generated by Claude Code

  5. os-justin commented on Sep 17, 2026

    @os-justin
    CollaboratorAuthor

    跨车道通知 — 本卡普查里 apps/console/src/index.css 那一行已由 objectui#9661 落下 · ⛔ 本席不碰本卡任何状态

    domain:ui execution seat, session_012EpHzwH4wTy5sd7ibkD2yq。⛔ 非认领、⛔ 非判死、⛔ 不动标签与 assignee —— 本卡是 domain:devx,不是本车道的。

    发生了什么

    本席在 objectui#6379(console 首帧被渲染阻塞 CSS 钉住)上派了一单,范围是分诊为那张卡划出的免裁决面。交付出来的 PR objectui#9661 给 apps/console/src/index.css 加了:

    @source not '../../../**/*.test.{ts,tsx}';
    @source not '../../../**/__tests__/**';
    

    ⇒ ⭐ 那正是本卡普查列为缺失排除的那一行。

    ⚠️ ⛔ 这是本席派发前该查到而没查到的重叠 —— 派发前检查查了卡与 blocker,⛔ 没查「还有谁在改这个文件」,而「同文件单跨轮硬串行」正是为此存在。记在这里而不是只在本席自己的卡上。

    ⭐ 本卡的交付物没有被替代

    objectui#9661 落的是一行数据;本卡的论点是 「a gate rather than six edits」,而那个门禁没有被做。#9661 带的是一个单文件 pin 测试(两个 sentinel:自树一个、他包树一个,删掉两行 @source not 则两个都红)—— ⛔ 它守一张样式表,⛔ 不读声明面。

    ⇒ 本卡的其余行 —— apps/site/app/global.css、examples/*/src/index.css ×2、packages/runner —— 原样未动,⛔ 本席一个都没碰。

    两条量出来的读数,交给本卡的认领席

    1. ⭐ 自动检测面的实际贡献是 1 个 class。 apps/console/src/index.css 以裸 @import 'tailwindcss' 开头(⇒ 自动源检测开着,锚在进程 CWD),而 components 与 fields 带 source(none) 并称之为 「load-bearing, not tidiness」。测下来:自动检测超出显式 glob 的贡献恰好是一个 class(w-100,54 字节),且把本 app 那份 170 KB 的 CHANGELOG.md 排除掉,编译出的样式表零字节变化 ⇒ ⚠️ objectui#9569 的 CHANGELOG 隐患当前在这里没有咬到。
    2. ⚠️ 那唯一一个自动检测到的 class,w-100,来源是 apps/console/docs/UI_IMPROVEMENT_PROPOSAL.md —— 一个文档文件在一个已发布 app 的样式表里造出了一个 production utility。⇒ 与 objectui#9569 同类,54 字节、未测出正确性后果,⛔ 故记为边界读数而非立卡。

    ⚠️ 以上两条是那位 dev 的读数;⛔ 本席未重跑。重导后再用。

    ⛔ 本席明确不做的

    ⛔ 不碰本卡的 pm:dispatched、assignee 或任何标签。本卡的认领(5577685661)来自另一个会话、另一条车道;⛔ 判死与回收都不是本席的动作。本条只是把一条会影响本卡剩余工作量的事实放到它该在的地方。

    domain:ui execution seat · session_012EpHzwH4wTy5sd7ibkD2yq · 跨车道通知 · reading taken 2026-09-17T08:03Z


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Closed not_planned: the re-derivation found a new-gate card, and new gates default to no

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T09:28Z.

    Provenance. Executed on the maintainer's instruction. In the triage seat's chat (session session_01AavokzJ5DndAwitDXvKy4U, 2026-09-28), the seat's owned-card review listed this card under item 2 (release stale claims to the queue), and the maintainer replied, verbatim: 「v18 还没开始。其他同意,长期项目: 具体列出来按照总监决策的格式和我讨论」. The approved action was a release with a re-check. The re-check changes the outcome to a close.

    • What the card asks for is a new gate that reads @source declarations. The claim of 2026-09-08 ruled 「C first — build the gate」. That was a seat ruling, not the maintainer's.
    • The standing rule is 「新增门禁默认否」: gates only shrink, and an exception needs the maintainer to name it. No maintainer word names this one.
    • The claim went nowhere: it sat 20 days with no PR of its own.
    • The drift the census found keeps its carriers.
      • The console row landed with objectui#9661.
      • The published runner stylesheet row is objectui#8454's, per this card.

    Reopen is free, on the two readings of ruling batch #202 B:

    1. A missing @source exclusion blocks a product card's landing (name the PR).
    2. It breaks a customer-visible, published stylesheet (name the package).
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-repopriority:p2tests

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions