Skip to content

fix(data-warehouse): show a catalog placeholder while new source loads - #105634

Merged
trunk-io[bot] merged 6 commits into
masterfrom
posthog/dwh-new-source-catalog-loading-skeleton
Sep 27, 2026
Merged

trunk-io[bot] merged 6 commits into
masterfrom
posthog/dwh-new-source-catalog-loading-skeleton

Conversation

@Gilbert09

Copy link
Copy Markdown
Member

Problem

Someone opening "New source" sees a blank page for several seconds before the connector catalog appears, and some of them leave rather than wait. Replay Vision scanner sessions on this flow caught it twice: one user waited on an empty page and closed the wizard, another got nothing past the layout shell.

The page renders one full-width LemonSkeleton while availableSourcesLogic loads. That is a 4px-tall bar on an otherwise empty page, and the request behind it carries over a thousand source configs.

Changes

  • The new-source page now keeps its title and shows a catalog-shaped placeholder while the connector list loads: the category sidebar, the search field, and a grid of tiles.
  • The placeholder reuses the catalog's own container and tile classes, so tiles do not shift when the real list lands. SourceCatalog exports those two class strings instead of holding them privately.
  • The embedded wizard (NewSourcesWizard) gets the same placeholder without the scene title.

No behavior changes. The loading branch is the only thing this touches.

Before

new-source-loading-before

After

new-source-loading-after

How did you test this code?

  • Rendered both stories in Storybook with a headless browser at 1100px and at the narrow scene width, and took the screenshots above. No page errors.
  • Ran the data warehouse frontend Jest suite locally. No new tests: the change adds no branch a test could assert beyond what the story already snapshots in visual review.

Release status

  • No feature flag controls this change

Automatic notifications

  • Publish to changelog?

Docs update

None.

🤖 Agent context

Autonomy: Fully autonomous

Agent: Claude Code, Opus 5

Opened from a sweep over Replay Vision observations of the data warehouse new-source onboarding flow. No duplicate: searched open PRs for the source catalog, the new source page and skeletons, and checked the maintainer's own open PRs. Nothing covers this loading state.

Skills invoked: /writing-ui-components, /writing-user-facing-copy, /writing-tests, /writing-code-comments, /writing-pr-descriptions.

CodeRabbit CLI was unavailable in this sandbox, so this PR opened without a local review pass.

Public artifact: the session material was customer session summaries. Nothing from them reaches the diff or this description, and the screenshots show placeholders only.

The new-source page rendered a single full-width LemonSkeleton bar while the
connector list loaded. With over a thousand source configs in that request, the
wait runs for seconds and the page reads as blank, so people leave before the
catalog arrives.

The page now keeps its title and renders a catalog-shaped placeholder: the
category sidebar, the search field, and a grid of tiles on the same layout the
real catalog uses.

Generated-By: PostHog Desktop
Task-Id: b66dd596-8579-45e2-9bb3-c2db018e2bcb
Copilot AI lite review requested due to automatic review settings September 24, 2026 02:10
@trunk-io

trunk-io Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

😎 Merged directly without going through the merge queue, as the queue was empty and the PR was up to date with the target branch - details.

@Gilbert09 Gilbert09 added the stamphog Request AI approval (no full review) label Sep 24, 2026 — with Talyn App

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

✅ Trunk lane — non-backend lane

This PR is assigned to the non-backend lane. It does not run backend Python tests and may merge in parallel with PRs in other lanes.

⚠️ Complexity (TypeScript) — 3 functions above the limit (max 19)

Cyclomatic complexity above the limit in changed typescript files (10 for production files, 15 for test files). Warn only: worth simplifying when you next touch these functions.

Function Location Complexity Limit
InternalSourcesWizard products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene.tsx:231 19 10
CDCSelfManagedSetupDialog products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene.tsx:415 15 10
SecondStep products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene.tsx:571 12 10
✅ Duplication (Python) — clean

New Python code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

✅ Duplication (TypeScript) — clean

New TypeScript code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

🚨 Comment density — 14% of added code lines are comments (11 of 76)

This section warns when comments are more than 3% of the code lines a PR adds, and alerts above 6%. Before agent-assisted PRs, the typical share was about 2%. Only full-line comments count. Docstrings, generated files, snapshots, migrations, and workflow files are left out.

Comments that restate the code, record how the change came about, or narrate the next line add noise for the next reader. Keep the comments that explain a reason the code cannot show, and remove the rest. See .agents/skills/writing-code-comments/SKILL.md for the house rules.

Files with the most added comment lines:

File Comment lines Added lines
products/data_warehouse/frontend/scenes/NewSourceScene/SourceCatalogSkeleton.tsx 6 37
products/data_warehouse/frontend/scenes/NewSourceScene/SourceCatalogSkeleton.stories.tsx 3 22
products/data_warehouse/frontend/scenes/NewSourceScene/SourceCatalog.tsx 2 9

This check does not block merging. It updates on every push and clears when the share drops.

✅ Bundle size — no change

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 68.88 MiB · no change

No file changed by more than 1000 B.

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

✅ Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.57 MiB · 22 files 🔺 +91 B (+0.0%) █████████░ 85.2% of 1.84 MiB
logged-out boot: index + App + bootApp (preloaded by every page, including /login)
src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
3.58 MiB · 628 files 🔺 +91 B (+0.0%) █████████░ 88.8% of 4.03 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
7.37 MiB · 2,326 files 🔺 +91 B (+0.0%) █████████░ 88.4% of 8.34 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/layout/navigation-3000/navigationLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/dashboard/dashboardLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/lemon-ui/LemonMarkdown/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/RichContentEditor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/CodeSnippet/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/index.tsx
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
854 B src/scenes/ChunkLoadErrorBoundary.tsx
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
Size File
301.8 KiB ../node_modules/.pnpm/posthog-js@1.434.14_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
267.6 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
100.4 KiB src/lib/api.ts
85.5 KiB src/products.tsx
69.1 KiB src/lib/lemon-ui/icons/icons.tsx
63.9 KiB src/lib/utils/eventUsageLogic.ts
38.7 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
33.9 KiB ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
28.3 KiB src/scenes/scenes.ts
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
301.8 KiB ../node_modules/.pnpm/posthog-js@1.434.14_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
271.7 KiB src/taxonomy/core-filter-definitions-by-group.json
267.6 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
100.4 KiB src/lib/api.ts
98.5 KiB ../packages/quill/packages/quill/dist/index.js
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
85.5 KiB src/products.tsx

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

✅ Toolbar bundle — eager 2.37 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.37 MiB · 19 files 🔺 +91 B (+0.0%) ████░░░░░░ 41.4% of 5.72 MiB
Deferred (lazy) 2.10 MiB · 44 files no change n/a — loads on demand
Loader dist/toolbar.js 1.2 KiB no change █░░░░░░░░░ 6.0% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
791.8 KiB dist/toolbar/toolbar-app-TDLXUZLE.css
650.8 KiB dist/toolbar/chunk-chunk-OLZXKW3U.js
483.6 KiB dist/toolbar/chunk-chunk-LP5DDLVQ.js
138.3 KiB dist/toolbar/chunk-chunk-FVYKO6VU.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
75.2 KiB dist/toolbar/toolbar-app-M6TDBA3J.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
35.6 KiB dist/toolbar/chunk-chunk-GL4SRUHV.js
21.0 KiB dist/toolbar/chunk-chunk-Z4YQYAC3.js
6.8 KiB dist/toolbar/chunk-chunk-DV7IWQNF.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

✅ Dist folder size — 🔺 +10.6 KiB (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 944.91 MiB · 🔺 +10.6 KiB (+0.0%)

✅ Playwright — all passed

All tests passed.

View test results →

@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

🦔 Hogbox preview · ✅ ready

▶ Open the preview

🔑 Login test@posthog.com / 12345678 (demo data)
🧩 Running this PR's backend and frontend, on the PostHog :master base
🔗 Link stable across rebuilds — a re-push swaps the box underneath, the URL stays
🔒 Access tailnet only (PostHog VPN)
🛠️ Admin inspect & debug state in hogland
💤 Idle sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen

commit 8bc9f58 · box box-82b85728296d · ready in 570s (push → usable) · build log · rebuilds on every push, torn down on close

@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team September 24, 2026 02:11
stamphog[bot]
stamphog Bot previously approved these changes Sep 24, 2026

@stamphog stamphog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Purely additive UI change (loading skeleton placeholder) with no data/API/auth surface touched; diff matches the description and there are no unresolved review concerns.

  • Author wrote 0% of the modified lines and has 47 merged PRs in these paths (familiarity MODERATE).
  • copilot-pull-request-reviewer[bot] reviewed the current head.
Gate mechanics and policy version
Gate Result
prerequisites ✓ all clear
deny-list ✓ no deny categories matched
size ✓ 78L, 4F substantive — within ceiling
tier ✓ T1-agent / T1b-small (78L, 4F, single-area, fix)
stamphog 2.0.0 .stamphog/policy.yml @ 694a70d · reviewed head 694a70d

@fuziontech fuziontech left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review agent on behalf of @fuziontech.

APPROVE. I reviewed the complete diff against master and the surrounding loading/catalog paths. The loading branches are consistent, the skeleton reuses the catalog grid/tile sizing, and the added story covers the narrow scene width. No blocking issues found.

Non-blocking: Node/pnpm are unavailable in this VM, so the focused frontend lint/type checks could not run. git diff --check passed.

@coderabbitai

coderabbitai Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⚙️ Run configuration

Configuration used: Repository: PostHog/posthog/.coderabbit.yaml

Review profile: QUIET

Plan: Enterprise

Run ID: 3a31185f-d312-44cc-8099-55ba299ccf32

📥 Commits

Reviewing files that changed from the base of the PR and between cb5acc8 and 8bc9f58.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: PostHog/posthog/.coderabbit.yaml

Review profile: QUIET

Plan: Enterprise

Run ID: f825d678-65a9-491f-a1ef-2002c95270da

📥 Commits

Reviewing files that changed from the base of the PR and between 0752c5b and cb5acc8.

📒 Files selected for processing (1)
  • frontend/snapshots.yml

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 5 remain after this review.


📝 Walkthrough

Walkthrough

The source catalog now has a skeleton loading component that uses shared tile and grid classes. NewSourceScene and NewSourcesWizard render the skeleton while sources load. Storybook includes default and narrow-container stories.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to cb5ac

The PR adds loading placeholders for the source catalog and their dedicated snapshots. No concrete merge risk is identified in the supplied changes.

Architecture Summary

Architecture risk: 🔵 Low · up to cb5ac

The change affects 2 systems.

Changed systems: products, frontend

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — products (ui) was modified; 4 changed files map to changed impact.
  • observed — frontend (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene.tsx: Imports SourceCatalogSkeleton for use in the loading states.
  • observed — Modified behavior in products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene.tsx: When available sources are loading, NewSourceScene now renders the scene title and catalog skeleton inside SceneContent instead of a bare LemonSkeleton.
  • observed — Modified behavior in products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene.tsx: When available sources are loading, NewSourcesWizard now renders SourceCatalogSkeleton instead of LemonSkeleton.
  • observed — Modified behavior in products/data_warehouse/frontend/scenes/NewSourceScene/SourceCatalog.tsx: The former private TILE_CLASS is replaced by exported CATALOG_TILE_CLASS, and the catalog grid classes are defined in exported CATALOG_GRID_CLASS.
🚥 Pre-merge checks | ✅ 1
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The description is complete and standalone. It includes the problem, user-visible changes, screenshots, testing details, release status, documentation status, and agent context. The agent context does…
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.

🟡 Other comments (1)
products/data_warehouse/frontend/scenes/NewSourceScene/SourceCatalogSkeleton.tsx-14-15 (1)

14-15: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep mobile category skeletons visible and scrollable.

Below sm, LemonSkeleton repeat={...} renders each item inside an unstyled wrapper. The h-8 class provides no width, so the placeholders can collapse to their 1px accessibility content. Add a mobile width to each wrapper and horizontal scrolling.

Suggested fix
-            <div className="flex flex-row sm:flex-col gap-1 sm:w-56 sm:shrink-0">
-                <LemonSkeleton className="h-8" repeat={PLACEHOLDER_CATEGORY_COUNT} />
+            <div className="flex flex-row sm:flex-col gap-1 overflow-x-auto sm:w-56 sm:shrink-0">
+                {Array.from({ length: PLACEHOLDER_CATEGORY_COUNT }, (_, index) => (
+                    <div key={index} className="w-32 shrink-0 sm:w-full">
+                        <LemonSkeleton className="h-8" />
+                    </div>
+                ))}
             </div>

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: PostHog/posthog/.coderabbit.yaml

Review profile: QUIET

Plan: Enterprise

Run ID: 8a6f88c2-f6f0-4629-8743-4d2b74a76c26

📥 Commits

Reviewing files that changed from the base of the PR and between ec7ca2b and 694a70d.

📒 Files selected for processing (4)
  • products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene.tsx
  • products/data_warehouse/frontend/scenes/NewSourceScene/SourceCatalog.tsx
  • products/data_warehouse/frontend/scenes/NewSourceScene/SourceCatalogSkeleton.stories.tsx
  • products/data_warehouse/frontend/scenes/NewSourceScene/SourceCatalogSkeleton.tsx

Included review availability: Your plan provides up to 12 included reviews per hour; 10 remain after this review.

…pshots

The snapshot runner waits for every `.LemonSkeleton` to disappear before it
captures, so a story that is entirely skeletons never settles. Opt the story
out of that wait.

Also give each category placeholder its own width and let the row scroll. The
`repeat` prop wraps each skeleton in a bare div with no width, which a flex row
collapses to nothing.

Generated-By: PostHog Desktop
Task-Id: b66dd596-8579-45e2-9bb3-c2db018e2bcb
@stamphog
stamphog Bot dismissed their stale review September 24, 2026 02:28

A new stamphog review started for this PR — the fresh verdict replaces this approval.

Copy link
Copy Markdown
Member Author

Applied, plus the cause of the failing Storybook flake check: the snapshot runner waits for every .LemonSkeleton to disappear before it captures, so a story made entirely of skeletons never settles. The story now sets testOptions.waitForLoadersToDisappear: false, the convention the LemonSkeleton stories already use. Each category placeholder carries its own width and the row scrolls.

stamphog[bot]

This comment was marked as outdated.

@trunk-io

trunk-io Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

Static Badge   Static Badge   Static Badge

Failed Test Failure Summary Logs
Scenes-App/SidePanels SidePanelNotebooks smoke-test The test timed out while waiting for a loading indicator or spinner to disappear. Logs ↗︎
the activity log logic humanizing insights can handle change of insight query as a query wrapped in an InsightVizNode The test exceeded the maximum allowed time of 15 seconds and timed out. Logs ↗︎
the activity log logic humanizing insights can handle change of a SQL insight query The test failed because it could not find the specified path 'scenes.PreflightCheck.preflightLogic' in the store. Logs ↗︎

View Full Report ↗︎ ⋅ Docs

Copy link
Copy Markdown
Member Author

Status check: no unresolved review threads (0 open), and GitHub reports mergeable: true — the blocked merge state is just the required-checks gate, not a real conflict.

The only red checks are Complete Visual Review run and Visual regression tests pass, and both come from the same cause: this PR adds 4 new Storybook stories (data-warehouse-sourcecatalogskeleton--default--{dark,light} and --narrow-scene--{dark,light}), which have no prior baseline. I checked the run (6f64e235-2dd8-4150-9e95-cc29c0f872f0) and all 4 snapshots are result: new / review_state: pending — there are no changed (regression) snapshots, only new baselines matching the stories this PR intentionally adds.

Committing a new visual baseline is a ship action that PostHog Visual Review policy requires an explicit human "yes" for on this specific run — I can't finalize it myself from here (and can't render the artifact PNGs from this sandbox to substitute my own sign-off).

Ask: could a human reviewer open the Visual Review run, confirm the 4 new skeleton screenshots look right, and approve/finalize the run? That should turn both checks green with no further code changes needed.

🦉 via talyn.dev

@posthog

posthog Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

✅ Visual changes approved by @Gilbert09 — baseline updated in cb5acc8.

View this run in PostHog

4 new.

Copy link
Copy Markdown
Member Author

Update after syncing this branch with master (no conflicts, branch is now up to date and mergeable: true): the merge retriggered CI, which opened a new Visual Review run. The situation is unchanged from before — same 4 new-baseline snapshots for the SourceCatalogSkeleton stories this PR adds, no regressions — but the run URL from my earlier comment is now stale.

Ask (same as before, updated link): could a human reviewer open the current Visual Review run, confirm the 4 new skeleton screenshots look right, and approve/finalize it? That's the only thing keeping Complete Visual Review run / Visual regression tests pass red — no further code changes are needed. There are no other unresolved review threads and no other failing checks.

🦉 via talyn.dev

Copy link
Copy Markdown
Member Author

/trunk merge

Copy link
Copy Markdown
Member Author

Re-checked from a clean clone: no unresolved review threads (0 open), mergeable: true (base 7af9307 is an ancestor of the branch, not behind), and the only red checks are Complete Visual Review run / Visual regression tests pass — same gate as before, driven by the same run (3b8d85a9-d5b5-4b31-b147-c62f34036fab).

One correction to my earlier summary of that run, from reading its job log directly: it reports 1370 snapshots — 1365 unchanged, 1 changed, 4 new, not "4 new, no regressions" as I said last time. The 4 new ones are this PR's own stories (data-warehouse-sourcecatalogskeleton--default--{dark,light}, --narrow-scene--{dark,light}) — expected, this PR adds them. The 1 changed one is scenes-app-experiments--experiment-with-multi-step-funnel-metric--light (15.71% diff), which is not related to this PR: the full diff against master only touches NewSourceScene.tsx, SourceCatalog.tsx, SourceCatalogSkeleton.tsx, and SourceCatalogSkeleton.stories.tsx, nothing under experiments. That drift is either a flake or a pre-existing regression on master that this branch happens to be carrying in its run.

I can't view the rendered snapshot images or approve/finalize a Visual Review run from this sandbox — that's a sign-off action outside what I can do here, and outside this PR's scope for the drifted experiments snapshot regardless.

Ask: could a human reviewer open the current Visual Review run and:

  1. confirm the 4 new SourceCatalogSkeleton baselines look right and approve them (this PR's own change), and
  2. separately check the experiment-with-multi-step-funnel-metric diff — if it's an unrelated flake/regression, re-run the job or handle it outside this PR rather than approving it as part of this baseline?

No further code changes are needed on this PR to turn the gate green once that's resolved.

🦉 via talyn.dev

4 updated
Run: 3b8d85a9-d5b5-4b31-b147-c62f34036fab

Co-authored-by: Gilbert09 <1459269+Gilbert09@users.noreply.github.com>
@stamphog
stamphog Bot dismissed their stale review September 27, 2026 21:13

A new stamphog review started for this PR — the fresh verdict replaces this approval.

Copy link
Copy Markdown
Member Author

/trunk merge

stamphog[bot]

This comment was marked as outdated.

@stamphog
stamphog Bot dismissed their stale review September 27, 2026 22:10

A new stamphog review started for this PR — the fresh verdict replaces this approval.

@stamphog stamphog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Purely additive, reversible frontend loading-state UI change with no touch on data models, APIs, auth, or dependencies; an agent reviewer approved and the one minor CodeRabbit suggestion was addressed in a follow-up commit, and the author has strong recent familiarity with these exact files.

  • Author wrote 100% of the modified lines and has 86 merged PRs in these paths (familiarity STRONG).
Gate mechanics and policy version
Gate Result
prerequisites ✓ all clear
deny-list ✓ no deny categories matched
size ✓ 99L, 5F substantive — within ceiling
tier ✓ T1-agent / T1b-small (99L, 5F, two-areas, fix)
stamphog 2.2.0 .stamphog/policy.yml @ 8bc9f58 · reviewed head 8bc9f58

Copy link
Copy Markdown
Member Author

Synced this branch with master (was 208 commits behind) via the update-branch API — merged cleanly, no conflicts. Verified the base is now a true ancestor and the PR's own diff is still exactly its 5 files (NewSourceScene.tsx, SourceCatalog.tsx, SourceCatalogSkeleton.tsx, SourceCatalogSkeleton.stories.tsx, frontend/snapshots.yml) — nothing from master leaked in.

CI on the new head commit (8bc9f58) is fully green, including Visual regression tests pass (the visual review baseline approved earlier carried over). No open review threads.

/trunk merge

@trunk-io
trunk-io Bot merged commit 19623b6 into master Sep 27, 2026
222 checks passed
@trunk-io
trunk-io Bot deleted the posthog/dwh-new-source-catalog-loading-skeleton branch September 27, 2026 22:30
@deployment-status-posthog

deployment-status-posthog Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-09-27 22:49 UTC Run
prod-us ✅ Deployed 2026-09-27 22:58 UTC Run
prod-eu ✅ Deployed 2026-09-27 22:58 UTC Run

This branch was successfully deployed

1 active deployment
preview-pr-105634 — 8bc9f587 Deployed Sep 27, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stamphog Request AI approval (no full review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants