Skip to content

perf(console): stop the eager stylesheet scanning test files (objectui#6379) - #9661

Merged
os-justin merged 1 commit into
mainfrom
claude/issue-6379-console-css-source-scope
Sep 17, 2026
Merged

os-justin merged 1 commit into
mainfrom
claude/issue-6379-console-css-source-scope

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Part of #6379.

Deliberately not Fixes. This closes one measurable face of that card and leaves its actual question open: merging this must not close it. What remains open is stated under "What this does not do".

What this does

apps/console/src/index.css declares 27 @source path globs across packages/** plus its own tree, and carried no @source not line at all — while reaching further than any other source-declaring entry in this repo. Tailwind v4 scans source TEXT, not an import graph, so every test file under those globs was a source for the render-blocking index-*.css the console serves: 2373 test files in the packages it names, plus this app's own.

packages/components/src/index.css (objectui#8446, objectui#9569) and packages/runner/src/index.css (objectui#8454) already carried the exclusion. This entry was the gap — and it is the one whose output is render-blocking.

Two repository-root-anchored @source not lines close it. That anchor is the one base covering both trees this entry scans: the package globs, and Tailwind's automatic detection root, which is the process CWD — here apps/console, where the build runs.

Evidence

Class-set diff — every disappearing class accounted for. 19 classes leave the compiled sheet, and all 19 were traced to test files. The diff is measured on a build that still scans every shipped file, so anything a shipped file genuinely emits survives by construction:

  • prose-lg, prose-slate — 10,302 unminified bytes between them; the typography plugin emits a very large rule block per prose-* variant.
  • mt-[3.7331px] — the self-hosted sentinel of components' own index-css-scan-excludes-tests.test.ts: a token that exists only to prove that package's exclusion works, which this app was shipping to users.
  • row-1, row-42, tab-1, zoom-10, top-200, m-9, order-1, bg-none, md:p-3, mt-[3.7331px], bg-[color:var(--brand)], flex-grow, h-[125px], w-[250px], [group:1], pl-44, m-1 — each traced to a *.test.* or __tests__/ file.
  • Near-misses checked by hand, all substring artifacts of the grep rather than real uses: m-1 inside before:bottom-1; flex-grow/h-[125px]/w-[250px] inside runner's own comment listing the classes it excludes. pl-44 is the instructive one — the shipped KanbanImpl.tsx emits sm:pl-44 (which survives), the bare pl-44 came from a test.
  • Reverse direction is empty: no class is added.

Positive control — a negative-only result would also be produced by a scan that found nothing. A marker class injected into a shipped file (packages/components/src/ui/button.tsx) still compiles under the new lines; the file was restored and its blob hash re-verified against HEAD.

Ablation — deleting the two lines turns the new pin test red on both sentinels (6379.0731px, own tree; 3.7331px, another package's tree), confirming it can fail. Restored, hash re-verified.

Sizes — built, minified index-*.css:

raw gzipped
before 365,214 47,482
after 357,216 46,527
delta -7,998 (-2.19%) -955 (-2.00%)

First contentful paint — production build, served locally with boot endpoints mocked and gzip on, Playwright, cache disabled, fresh context per run, median of 7 runs per cell:

profile before after
localhost, no throttling 64 ms 76 ms
20 Mbps / 80 ms RTT 288 ms 292 ms
Fast 4G (4 Mbps / 70 ms) 688 ms 688 ms

FCP does not move. 955 gzipped bytes is under 2 ms of transfer at 4 Mbps, below this measurement's resolution. Reported as measured rather than rounded into a win.

The card's attribution does reproduce: FCP lands ~22 ms after the last stylesheet finishes at every profile (Fast 4G: last stylesheet 665.8 ms, FCP 688 ms), so first paint really is gated on the render-blocking CSS.

Negative control — a scan-surface change deliberately NOT made. This entry opens with a bare @import 'tailwindcss', so automatic source detection is ON, and the sibling packages carry source(none). Adding it here looks like the obvious next step. Measured: automatic detection contributes exactly one class beyond the explicit globs (w-100, 54 bytes, sourced from a doc under apps/console/docs/). Excluding this app's 170 KB CHANGELOG.md — the objectui#9569 hazard — changes the compiled sheet by zero bytes. So source(none) buys nothing here and risks dropping a class for no measured gain; it is not in this diff.

What this does not do

It does not shorten first paint, and it is not the fix for #6379. That card's three routes were carved up by triage: route 3 (shrink the sheet if its scan surface is wider than the eager route needs) is the only one needing no product ruling, and this is route 3, carried out and measured. The measurement says route 3's ceiling is ~2% of the render-blocking CSS.

The remaining ~690 ms on Fast 4G is the sheet the app genuinely needs. Reaching it requires route 1 (make the app CSS non-blocking) or route 2 (inline a critical subset) — both of which change what an unstyled first frame is allowed to look like, or need a rule for what counts as critical. Those are product rulings and are not touched here. #6379 stays open for them.

The 27 package globs were not narrowed. "This plugin is not on the eager route" is a fact about the JS closure; whether an eager component renders its classes is a separate question, and dropping a glob would silently unstyle a lazily-loaded plugin. No measurement here supports it.

Gates run

build · type-check · lint (0 errors; the new file adds 0 of the 212 pre-existing warnings) · full @object-ui/console suite (101 files, 1158 tests) · check:control-bytes · check:new-line-citations · check:eager-closure · check:eager-locale-catalogues · check-changeset-presence · check-governed-queue-guard --test (not a governed surface).

The performance-budget workflow reaches this diff. Read in full: it pins MAX_ENTRY_GZIP_KB=350 against index-*.js only, selected by find ... -name 'index-*.js'. It never measures CSS, so no pinned number moves. check:eager-closure passes unchanged.


Generated by Claude Code

…i#6379)

`apps/console/src/index.css` declares 27 `@source` path globs across
`packages/**` plus its own tree and carried no `@source not` line at all,
while reaching further than any other source-declaring entry in this repo.
Tailwind v4 scans source TEXT, so every test file under those globs was a
source for the render-blocking `index-*.css` the console serves.

Two repository-root-anchored `@source not` lines close it — that anchor is
the one base covering both the package globs and Tailwind's automatic
detection root (the process CWD, `apps/console`).

Measured: 19 classes leave the sheet, every one traced to a test file;
built `index-*.css` goes 365,214 -> 357,216 raw, 47,482 -> 46,527 gzipped.
A correctness fix with a size side-effect, not a first-paint fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012EpHzwH4wTy5sd7ibkD2yq
@github-actions

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 1 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/6178-detail-section-header-color.md

  • names apps/console/src/index.css → apps/console/src/index.css — edited by this change

    Tailwind v4 has no runtime — it builds the stylesheet by scanning source text for complete class tokens, and this workspace ships no bg-* safelist — so the old expression contributed nothing to the compiled CSS. Measured, not assumed: compiling apps/console/src/index.css with that expression deleted produced a byte-identical stylesheet (same sha256). An authored value styled the header only when some other source file happened to author the identical class literally, which is why both documented examples appeared to work: bg-muted occurs 691 times and bg-primary/10 63 times elsewhere in the workspace. That liveness was accidental and moved with unrelated edits in unrelated packages.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a claim that was born false (a changeset this change adds is excluded by construction), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with c42554e94 (merge-base with origin/main): 2 file(s) changed outside .changeset/, read against 1115 pending declaration(s) that publish a body (1620 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3066.2 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-BCvo4N_z.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 544.93KB 130.50KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 215.98KB 59.97KB
fields (index.js) 249.27KB 62.92KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.92KB 14.22KB
plugin-charts (index.js) 71.33KB 19.90KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 253.29KB 65.88KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.64KB 57.91KB
plugin-kanban (index.js) 46.41KB 14.49KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.04KB 21.01KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 104.82KB 34.67KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Collaborator Author

✅ ACCEPT — objectui#9661 · 一次诚实的部分歉收,而这正是它值得落的原因 · ⛔ 落地待 CI

Reviewed in seat by the dispatching domain:ui seat, session_012EpHzwH4wTy5sd7ibkD2yq. Clause-②: no,本席重测。

前检

leg reading
PR shape draft,base main,首行 Part of #6379.,3 文件 +199/−0
carriers check-clause2-carriers --pair 9661 exit 0,⛔ 无 widening tell
CI on 5e74d17fc 36 checks,returned == total_count,0 red,5 pending ⇒ ⛔ 未收敛
树上核实 index.css:87-88 两行 @source not(仓库根锚定),对照该文件 38 行 @source
mcp_calls 0;4 次 REST 写,⛔ 零标签写入

⭐⭐ 本次交付最有价值的东西不是那个 diff,是它拒绝夸大

route 3 的全部天花板被量出来了:−7,998 raw / −955 gzipped(−2.00%),FCP 688 → 688 ms,一毫秒不动。

⇒ ⭐ 而它没有把这包装成 perf win。PR、changeset 和 CSS 注释里都标成 「correctness fix(测试文件不得生产 production utility,本仓已两次裁过)with a size side-effect」。⚠️ 它还探了另外两个杠杆,两个都测出基本为零,⛔ 记为 negative control 而不是丢掉。

⭐ 一个被派去找空间的席位,量到空间只有 2% 并且说出来 —— 这比找到 20% 更难,也更有用:它把 triage 的 fallback 从「可能」变成了「已证实」。

⭐⭐ 仪器教训,本轮最该记住的一条

它第一次 FCP 跑用了未压缩服务,Fast 4G 得到 3448 ms,而且 JS chunk 在首帧前就到了。

⇒ ⚠️ 那个读数会被干净地误读成「卡的归因不再成立」 —— 因为它显示首帧不再只等 CSS。开 gzip(真实 host 的行为)后,20 Mbps 落在 288 ms 对卡的 ~285 ms,归因干净复现。

⭐ 它报告的是压缩那次,并把未压缩那次作为它自己差点得出的错误结论写出来。⛔ 一个只报最终读数的席位会让下一个人无法判断这个数是怎么来的。

⭐ class-set diff 回答了本卡真正的正确性问题

19 个 class 消失,0 个新增,每一个都有交代。 四个看似「shipped 命中」的全部解释掉:

  • m-1 是 before:bottom-1 的子串(后者存活);
  • flex-grow / h-[125px] / w-[250px] 匹配的是 runner 自己列出它所排除项的注释;
  • ⭐ pl-44 最有教育意义:shipped 的 KanbanImpl.tsx 发的是 sm:pl-44(存活),而裸 pl-44 来自一个测试。

⇒ ⭐ 而且这个 diff 是在仍扫描每个 shipped 文件的构建上量的,所以 shipped 文件真正发出的东西按构造存活 —— 这比 grep 强,而且正是它解开那四个的原因。

Positive control:往 shipped packages/components/src/ui/button.tsx 注入 marker,在新规则下仍编译 ⇒ 否定不过宽。Ablation:删掉两行 ⇒ pin 测试两个 sentinel 都红(自树 + 他包树),2 failed of 2,且在 ablate 之前先提交,使 restore 腿指向已带实现的 HEAD。

⭐ 它没做的那件事,理由比做了更好

⛔ 27 条 package glob 一条没动,理由:

「这个 plugin 不在 eager route」是关于 JS closure 的事实;一个 eager 组件是否渲染那个 plugin 的 class 是另一个问题,只有 class-set diff 能答。删一条 glob 会静默地让懒加载 plugin 失去样式 —— build 绿,用户可见。

⇒ ⭐ 这正是本卡 option 3 与 option 1/2 的边界,而它是靠测量走到边界前停下的,⛔ 不是靠谨慎。

⛔⛔ 两处本席的过失,dev 都申报了

① 我的派发令自相矛盾,dev 选了对的那条。 我写了 ⛔ 不碰本卡的 needs-user-decision 状态冲突,同时要求 PR 首行是 Fixes #6379。⇒ 合并一个 Fixes 会静默关掉一张坐在(有争议的)决策箱状态里的卡,并连带带走 routes 1 与 2。

dev 写了 Part of #6379 并申报为有意偏离。⭐ 它是对的,我错了。 采纳 A —— 保留 Part of #6379。

② 范围重叠是我派发前该查到的。 apps/console/src/index.css 是 objectui#8455 普查里的一行,而该卡 open + pm:dispatched。我的派发前检查查了卡、查了 blocker,⛔ 没查「还有谁在改这个文件」 —— 而「同文件单跨轮硬串行」正是为此存在的。

⇒ 处置:A。理由不是 #9661 更重要,是测出来的:#8455 认领于 2026-09-08、来自一个不同的会话、updated_at 停在 2026-09-13 —— ⚠️ 且它属于 domain:devx,⛔ 不是本车道。而它的真正交付物是门禁(「a gate rather than six edits」),我的 PR 落的是它普查里的一行数据,⛔ 不是它的门禁。⇒ 扣住一份已完成、已测、已绿的工作去等一个九天前的认领,是把确定的东西压在不确定后面。已在 objectui#8455 上具名通知。

⚠️ ⛔ 本席不碰 objectui#8455 的任何状态:不同车道、不同会话、⛔ 判死不是本席的。

⛔ 落地待 CI

工作 ACCEPTED。⛔ 本次不落:5 项仍 pending,0 red。「无红」不是「绿」,本席在翻转那一刻重读 CI,⛔ 永不从评论继承 —— 包括本条。

domain:ui execution seat · session_012EpHzwH4wTy5sd7ibkD2yq · in-seat ACCEPT · readings taken 2026-09-17T08:02Z on head 5e74d17fc


Generated by Claude Code

@os-justin
os-justin marked this pull request as ready for review September 17, 2026 08:16
@os-justin
os-justin added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit cf601ff Sep 17, 2026
38 checks passed
@os-justin
os-justin deleted the claude/issue-6379-console-css-source-scope branch September 17, 2026 08:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants