test(app-shell): pin the already-honest studio-design consumers on an empty registry, plus the populated contrast - #8619
Merged
Conversation
…n an empty registry, and the populated contrast The three repairs objectui#6846 asks for — the Data pillar field rail that swallowed a field click, the actions pane that rendered a bare label, and the Interfaces canvas that blamed the roadmap — already landed on main in #7120 (#6795 part C), each with its own empty-registry pin. What #7120 deliberately left unpinned are the two consumers its measurement found already honest: - ObjectSettingsPanel prints "No default object inspector registered." in the Basics section and keeps rendering the sections that do not read the registry; - ObjectHooksPanel falls back to the generic SchemaForm, and that form edits and saves the hook. Both are pinned here with the same shape as the sibling pins: the registries are asserted empty FIRST, with a control that must hit, and the assertion names the specific visible controls rather than "something rendered". The populated contrast pins the wrong fix on this axis — an empty-state branch that fires whenever the lookup is falsy and swallows the populated path: with the builtin inspectors registered, a field click opens the real ObjectFieldInspector, Actions mounts the real ActionDefaultInspector, Hooks mounts the curated HookDefaultInspector (not the generic form), Settings mounts the real ObjectDefaultInspector, and none of the empty-state sentences appears. Test only; the changeset declares no release. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YBWFb5YgMU5dw8p2VKj16S
Contributor
✅ Console Performance Budget
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
Size Limits
|
os-justin
marked this pull request as ready for review
September 8, 2026 17:10
os-justin
enabled auto-merge
September 8, 2026 17:11
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #6846
Premise check — the three repairs are already on
mainobjectui#6846 asks for three repairs plus pins. Re-driving the probes against
origin/main(BASE0544ae958) shows the three repairs landed on 2026-09-01 in #7120 (the part-C PR of objectui#6795, commit994b73696), each with its own empty-registry pin — and that PR never referenced this card, which is why the card stayed open. This PR is the surviving half, the one the card calls "the cheap half and where this card's durability lives": pins for the two consumers #7120 measured as already honest and deliberately left unpinned, plus the populated-registry contrast.Every row of the card's table, re-driven on this tree with the registries proven empty first (
listMetadataPreviewTypes()andlistMetadataInspectorTypes()both[];getMetadataDefaultInspectorforobject,hook,actionallundefined; controlgetStudioCanvasPreview('object')defined):origin/maintodayObjectSettingsPanelObjectHooksPanelSchemaFormwith one control per hook key (Name, Label, Object, Events, Handler); an edit enables Save andclient.savereceives itObjectActionsPanelasideopens with "Field properties" and "No field inspector is registered in this session, so this field's properties cannot be edited here."(#7120 also found and repaired a fourth site the card did not list: the Automations pillar's two "click a node" instructions.)
What this PR adds
Three test files and one empty-frontmatter changeset. No source module changes.
ObjectSettingsPanel.designerRegistryMissing.test.tsx— empty registry (asserted first, with the control): the message appears exactly once (queryAllByText, sincegetByTextthrows on duplicates too), inside the Basics section, and the OWD section still renders; no recovery prose.ObjectHooksPanel.designerRegistryMissing.test.tsx— empty registry: the generic form'sHandlerandNamecontrols carry the hook's values, the curated editor'shook-nametest id is absent, and the form WORKS — editing Handler enables Save, andclient.save('hook', 'guard_hook', …handler: 'guard_fn_v2'…, { mode: 'draft', packageId })is observed.DataPillar.designerRegistryPopulated.test.tsx— the non-regression axis for the plausible wrong fix on this card (an empty-state branch that fires whenever the lookup is falsy and swallows the populated path): withregisterBuiltinInspectors()proven present, a field click opens the realObjectFieldInspector(API-name control with valuetitle), Actions mountsActionDefaultInspector(Name controlsend_email), Hooks mounts the curatedHookDefaultInspector(hook-name,hook-body-source; no synthesisedHandler), Settings mountsObjectDefaultInspector(object-name-input,object-access-posture) — and none of the four empty-state sentences appears. Each case asserts a real-editor control BEFORE the absence, so a blank screen reds on the positive. The Interfaces canvas already has its populated contrast inStudioDesignSurface.designerRegistryPartial.test.tsx.Verification (all on HEAD
6453586e6)pnpm exec vitest run packages/app-shell/src/views/studio-design/(repo root): Test Files 57 passed (57), Tests 323 passed (323); JSON reporter: 0 failed suites, 0 non-passed assertions; 0 harness-death strings (Element type is invalid,No test suite found,Failed Suites). Narrowing declared: the diff vs BASE is three test files plus the changeset — no source module changed, so no test outside this directory can change outcome (thedomprojects run withisolate: true).pnpm --filter @object-ui/app-shell type-check(tsc --noEmit && tsc -p tsconfig.test.json): exit 0, 0error TS, after building the 28-package dependency closure (turbo run build --filter='@object-ui/app-shell^...', 28 successful). The first attempt on the unbuilt worktree failed withCannot find module '@object-ui/fields'— a precondition, not a reading.tsc -p tsconfig.test.json --listFileslists all three new files.pnpm --filter @object-ui/app-shell lint(eslint ., the same run CI'sturbo run lintperforms for this package): exit 0;--format json1113 files, 0 errors, 2925 warnings — all pre-existing; the three new files contribute 0 warnings (the DropdownMenu passthroughs are typed, notany).check-changeset-presence(3 published source files, 1 changeset with EMPTY frontmatter — the explicit exemption),check-changeset-no-major,check:control-bytes,check:vi-mock-specifiers,check:vi-mock-inherit,check:unreferenced-sources,check:comment-mask-corpus,check:shell-escape-residue.Red legs — every new pin observed to fail
Mutations were proven on disk by
grep -cbefore each run; restore isgit checkout HEAD -- ABS_PATH, proven by all four blob hashes equallingHEADand an emptygit diff HEAD(trap on EXIT/INT/TERM). No dist is on the path: the tests import the panels by relative path and workspace packages map tosrcthrough the root vitest alias, so there is no build leg to an ablation here.expected [] to have a length of 1 but got +0; HooksUnable to find a label with the text of: Handler. 2 of 2 red.Unable to find an element with the display value: title/send_email;hook-name;object-name-input), both new empty pins red (whole-panel constant:Basics/Guardnot found), bothdesignerRegistryPartialpins red. The fix(app-shell): say what is true when the studio-design designer registries are empty (#6795 part C) #7120 pins that assert the empty-state message itself stay green under this caricature — which is exactly the gap the populated file fills.Notes for the reviewer
packages/app-shell(fix(app-shell): lint conditional-formatting in the record scope, and align the predicate scope to the engine's root vocabulary #8164, record scope), zero touchviews/studio-design/.skip-changesetis not applied: in this repository that label is read by nothing; the empty-frontmatter changeset is the declaration.https://claude.ai/code/session_01YBWFb5YgMU5dw8p2VKj16S.🤖 Generated with Claude Code
https://claude.ai/code/session_01YBWFb5YgMU5dw8p2VKj16S
Generated by Claude Code