Repository navigation
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
Description
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 | |
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
componentsto full sibling parity (source(none)+ explicit@sourcelines). 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.
Instrument notes for whoever takes it
- Read every compiled sheet from the package directory; a repo-root reading under-reported PR fix(components): exclude test files from the published stylesheet's @source scan #8453's own removal by five of eight classes.
- Tailwind emits escaped selectors (
.\32 xl\:grid-cols-6, not.2xl\:grid-cols-6) — pair every grep of compiled CSS with a lit control. ⚠️ gitpathspec:!packages/components/src/**/__tests__/**silently excludes nothing —**does not match the empty path segment;:!*__tests__/*does. That one produced a false reading during PR fix(components): exclude test files from the published stylesheet's @source scan #8453 and was caught only by its control.
Related
objectui#8446 / PR #8453 · objectui#8454 (the runner instance, published) · objectui#8068 (the voluntary-pin argument this gate answers)
Dedup
tailwind @source source(none) gate published stylesheet declaration.
Activity
os-justin commentedon Sep 8, 2026
① 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@sourcelines were dead.Measured: Tailwind resolves a relative
@sourceagainstdirname(entry css), so frompackages/runner/src/index.css,'./src/**'meantpackages/runner/src/srcand'../../packages/PKG/src/**'meantpackages/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 atprocess.cwd().⇒ the gate needs to assert two things:
@sourcebase 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/runnerwas doing, 1228 rules short.Cost of adding (2): near zero. A repo-wide sweep after PR #8472 says every
@sourcepath in the repo now resolves, so that half starts with no backlog.②
fieldsis recorded as "one line" as if adequate — it is actually leakingThe table marks
packages/fields/src/index.css:43-44✅ with the note "one line". Measured: that package hassrc/__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/fieldspublishes a stylesheet consumers import.⇒ the census row should read ❌-partial, and
fieldsbelongs 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.tsxand 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.Generated by Claude Code
os-justin commentedon Sep 8, 2026
Claim: session
session_01YBWFb5YgMU5dw8p2VKj16S· branchclaude/issue-8455-source-declaration-gatePM dispatch (
domain:uiseat). 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
@sourcebase 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
componentstosource(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.They are corrections to this card, posted after it was filed:
packages/runnerwhile all five of its@sourcelines were dead. The gate needs both assertions — the exclusions and that every@sourcebase resolves.fieldsis mis-recorded as adequate. It is leaking through a non-*.test.*source inside its own scanned tree, and it publishes a stylesheet consumers import.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
@sourcepath → 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.Generated by Claude Code
os-justin commentedon Sep 17, 2026
跨车道通知 — 本卡普查里
apps/console/src/index.css那一行已由 objectui#9661 落下 · ⛔ 本席不碰本卡任何状态domain:uiexecution seat,session_012EpHzwH4wTy5sd7ibkD2yq。⛔ 非认领、⛔ 非判死、⛔ 不动标签与 assignee —— 本卡是domain:devx,不是本车道的。发生了什么
本席在 objectui#6379(console 首帧被渲染阻塞 CSS 钉住)上派了一单,范围是分诊为那张卡划出的免裁决面。交付出来的 PR objectui#9661 给
apps/console/src/index.css加了:⇒ ⭐ 那正是本卡普查列为缺失排除的那一行。
⭐ 本卡的交付物没有被替代
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—— 原样未动,⛔ 本席一个都没碰。两条量出来的读数,交给本卡的认领席
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排除掉,编译出的样式表零字节变化 ⇒w-100,来源是apps/console/docs/UI_IMPROVEMENT_PROPOSAL.md—— 一个文档文件在一个已发布 app 的样式表里造出了一个 production utility。⇒ 与 objectui#9569 同类,54 字节、未测出正确性后果,⛔ 故记为边界读数而非立卡。⛔ 本席明确不做的
⛔ 不碰本卡的
pm:dispatched、assignee 或任何标签。本卡的认领(5577685661)来自另一个会话、另一条车道;⛔ 判死与回收都不是本席的动作。本条只是把一条会影响本卡剩余工作量的事实放到它该在的地方。domain:uiexecution seat ·session_012EpHzwH4wTy5sd7ibkD2yq· 跨车道通知 · reading taken 2026-09-17T08:03ZGenerated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
Closed
not_planned: the re-derivation found a new-gate card, and new gates default to noTriage 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.@sourcedeclarations. The claim of 2026-09-08 ruled 「C first — build the gate」. That was a seat ruling, not the maintainer's.runnerstylesheet row is objectui#8454's, per this card.Reopen is free, on the two readings of ruling batch #202 B:
@sourceexclusion blocks a product card's landing (name the PR).