Skip to content

chore: stop pointing agents at quill for main-app UI - #75914

Merged
Twixes merged 1 commit into
masterfrom
mm/agents-md-quill-not-for-main-app
Jul 31, 2026
Merged

chore: stop pointing agents at quill for main-app UI#75914
Twixes merged 1 commit into
masterfrom
mm/agents-md-quill-not-for-main-app

Conversation

@Twixes

@Twixes Twixes commented Jul 31, 2026

Copy link
Copy Markdown
Member

Problem

AGENTS.md tells agents to reach for quill when building menus, comboboxes and autocompletes in the main app, and to treat LemonMenu as legacy:

Use quill for menus, comboboxes, and autocompletes (DropdownMenu, Combobox, Autocomplete from @posthog/quill) [...] Don't add new LemonMenu or lib/ui/DropdownMenu (Radix) menus, those are legacy.

That doesn't match where quill is actually heading. Per the discussion in #team-blitzscale, quill was built for MCP apps and the desktop app rather than the main app, it's intentionally more compact than LemonUI, and there's no active migration of the app onto it right now.

So agents following the guide produce components that look out of place next to the Lemon UI around them. I hit this on #75667: an installation picker got built with quill DropdownMenu because that's what the guide says, and it stood out against every other control in the same settings section.

The adoption numbers say the same thing. Across frontend/src and products/*/frontend, 7 files import quill's DropdownMenu, against 24 using the legacy Radix lib/ui/DropdownMenu and 30 using LemonMenu. It reads as an early-adopter trap rather than a migration in progress.

Changes

Docs only, no code.

AGENTS.md: rewrite the "quill vs LemonUI" bullet. Quill is for MCP apps and the desktop app. Main-app work uses LemonUI, menus included, with LemonMenu plus a LemonButton trigger as the default. lib/ui/DropdownMenu (Radix) stays legacy. The genuinely quill-specific advice (don't mix the two libraries inside one component, Base UI's render prop instead of Radix's asChild) is kept but scoped to where quill applies.

frontend/src/AGENTS.md: drop quill from the "where to look" list, and split the component table row that pointed dropdowns at quill into an actions row (LemonMenu) and a values row (LemonSelect / LemonInputSelect).

Note

This narrows guidance, it doesn't deprecate quill or touch the 7 existing call sites. If the intent is for the main app to move onto quill after all, this is the wrong change and the Slack thread is the place to settle it.

How did you test this code?

Nothing to test, both files are agent instructions. Verified that LemonMenu, LemonSelect and LemonInputSelect all exist under frontend/src/lib/lemon-ui/ so the table doesn't point at components that aren't there, and the repo's AGENTS.md symlink check and markdown formatter both ran clean on commit.

Automatic notifications

  • Publish to changelog?
  • Alert Sales and Marketing teams?

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

I hit this while reviewing #75667 with Claude Code. Claude pushed back on switching that PR's picker to LemonMenu on the grounds that AGENTS.md forbids new ones, which is when I remembered the blitzscale thread saying the opposite. Claude then traced the rule to its origin, found it was added in #63190, and confirmed the conflict, so the guide is stale rather than disputed.

We considered folding this into #75667 and decided against it. That PR already has two approvals and is scoped to the GitHub integration, and a change to the shared agent guide deserves its own review from whoever owns quill. Tagging @adamleithp since it's his line and his library.

Skills invoked: none relevant to a docs change.

The guide told agents to use quill for menus, comboboxes and autocompletes in
the main app, and to treat LemonMenu as legacy. That doesn't match where quill
is actually going: it was built for MCP apps and the desktop app, it's
deliberately more compact than LemonUI, and there's no active migration of the
main app onto it. Following the rule produced components that look out of place
next to the Lemon UI around them.

Point main-app work at LemonUI, including for menus, and scope the quill
guidance to where quill applies. lib/ui/DropdownMenu (Radix) stays legacy.
@Twixes Twixes self-assigned this Jul 31, 2026
@Twixes
Twixes requested a review from adamleithp July 31, 2026 10:48
@trunk-io

trunk-io Bot commented Jul 31, 2026

Copy link
Copy Markdown

😎 This pull request was merged.

@Twixes Twixes added the skip-agent-review Save $$$, skip auto agent reviews (Greptile) — use for trivial or chore PRs label Jul 31, 2026
@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

Bundle size — no change

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

Total: 65.43 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.25 MiB · 22 files no change ███░░░░░░░ 27.7% of 4.51 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.12 MiB · 3,023 files no change ████████░░ 83.6% of 9.71 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/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers 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/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
789 B src/scenes/ChunkLoadErrorBoundary.tsx
762 B src/index.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
285.3 KiB ../node_modules/.pnpm/posthog-js@1.409.2/node_modules/posthog-js/dist/rrweb.js
267.7 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
235.5 KiB src/taxonomy/core-filter-definitions-by-group.json
231.4 KiB ../node_modules/.pnpm/posthog-js@1.409.2/node_modules/posthog-js/dist/module.js
154.3 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
105.2 KiB src/lib/api.ts
94.7 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

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.19 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.19 MiB · 17 files no change ████░░░░░░ 38.3% of 5.72 MiB
Deferred (lazy) 2.08 MiB · 33 files no change n/a — loads on demand
Loader dist/toolbar.js 1.1 KiB no change █░░░░░░░░░ 5.8% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
717.7 KiB dist/toolbar/toolbar-app-3ZUOLZ25.css
551.1 KiB dist/toolbar/chunk-chunk-MGCJX44V.js
484.6 KiB dist/toolbar/chunk-chunk-QCKKTYHY.js
133.6 KiB dist/toolbar/chunk-chunk-J5MNYTRE.js
131.8 KiB dist/toolbar/chunk-chunk-T5KY5WYR.js
71.0 KiB dist/toolbar/toolbar-app-LF3AKWIJ.js
69.0 KiB dist/toolbar/chunk-chunk-27JL52RE.js
35.6 KiB dist/toolbar/chunk-chunk-Z7LVFBRX.js
20.9 KiB dist/toolbar/chunk-chunk-K5Z37JFK.js
12.2 KiB dist/toolbar/chunk-chunk-PIK3PADE.js

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

Dist folder size — no change

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

Total: 1371.14 MiB · no change

@Twixes
Twixes marked this pull request as ready for review July 31, 2026 11:02
@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team July 31, 2026 11:03
@github-actions

github-actions Bot commented Jul 31, 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 47c917b · box box-06a26ca86b5d · ready in 932s (push → usable) · build log · rebuilds on every push, torn down on close

@greptile-apps

greptile-apps Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor
Prompt To Fix All With AI
### Issue 1
frontend/src/AGENTS.md:26
**Distinguish the selection interactions**

This row groups selects, searchable comboboxes, and free-text autocompletes under two undifferentiated recommendations, although `LemonSelect` provides only static value selection while custom text entry requires `LemonInputSelect` with the appropriate options. Separating these cases prevents agents from choosing a static select for an interface that requires search or free-text input.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "chore: stop pointing agents at quill for..." | Re-trigger Greptile

Comment thread frontend/src/AGENTS.md
@Twixes
Twixes merged commit 066e4e2 into master Jul 31, 2026
330 of 339 checks passed
@Twixes
Twixes deleted the mm/agents-md-quill-not-for-main-app branch July 31, 2026 13:33
@deployment-status-posthog

deployment-status-posthog Bot commented Jul 31, 2026

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-07-31 13:58 UTC Run
prod-us ✅ Deployed 2026-07-31 14:09 UTC Run
prod-eu ✅ Deployed 2026-07-31 14:12 UTC Run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-agent-review Save $$$, skip auto agent reviews (Greptile) — use for trivial or chore PRs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants