Uh oh!
There was an error while loading. Please reload this page.
feat(app-shell): declare scim on RuntimeFeatures - #6960
Merged
Conversation
`RuntimeFeatures.scim` documents the wire cloud's `resolveFeatures` already emits in the same object literal as `customDomain` / `sso` (objectui#5869). Declaration only, mirroring the two commercial siblings' "server-derived, absent on vanilla" doc comment — no read point, no gate, and no SCIM UI affordance added. Card relationship is stated once in the PR body (this branch squashes). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013hfmP9hoMd3dJwTh85J4yB
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
|
…ings The declare-only version of scim?: boolean left it out of the default features object and the body.features.* -> current.features derivation, so getRuntimeConfig().features.scim would read undefined even when the server sent scim: true -- a fresh, opposite-direction instance of the declaration-vs-runtime divergence objectui#5869 was filed to record. Mirrors customDomain / sso end to end: scim: false in defaults, and scim: body.features.scim === true in the derivation. Still no read point, no gate, and no SCIM UI affordance -- the two lines make the declaration honest, they do not add a feature. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013hfmP9hoMd3dJwTh85J4yB
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
|
…octrine Extends the four existing "runtime-config commercial features" cases (defaults-off, grants-only-when-true, business-tier-grants-all, and omitted-keys) to also assert on features.scim, matching the doctrine's own claim that customDomain/sso/scim are paid flags that must default off and only turn on when the server explicitly grants them. Reverse-verified: removing the scim: body.features.scim === true derivation line turns exactly the "business-tier grants all three" assertion red (1 failed, 29 passed) while the three negative-leg assertions stay green -- proving a positive leg was required for any of these pins to be load-bearing on the mapping, not merely a restatement of the already-false default. Restored and reran green (30 passed) before committing. No new test cases (extends existing ones only), no read point, no gate, no SCIM UI affordance, nothing under packages/types/**. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013hfmP9hoMd3dJwTh85J4yB
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-sam
marked this pull request as ready for review
August 31, 2026 05:10
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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#5869
What
Declares
scim?: booleanonRuntimeFeaturesinpackages/app-shell/src/runtime-config.ts, maps it throughinitRuntimeConfig, and pins it into the existing commercial-flag test doctrine — mirroring its two commercial siblingscustomDomain?/sso?end to end: same doc-comment style, samefalsedefault, samebody.features.scim === truederivation, same test coverage shape.Per the issue's own report (I did not verify this myself — the
cloudrepo is outside this session's scope): cloud'sresolveFeatures(packages/objectos-runtime/src/cloud-runtime-config-plugin.ts) already returns{ aiStudio, autoPublishAiBuilds, customDomain, sso, scim }in one object literal, so the untyped key is already arriving at the SPA today.Declaration, plumbing, and test doctrine — nothing more. No read point, no gate, no SCIM UI affordance, no derivation logic beyond the one-line mirror of its siblings, nothing under
packages/types/**.This PR went through two corrections during review, both recorded here for the trail:
getRuntimeConfig().features.scimreadundefinedeven when the server sentscim: true— true on the type face, false at runtime, the same divergence this card exists to record, just pointed the other way. Fixed by mirroring the two linescustomDomain/ssoalready have.runtime-config.test.ts's own header doctrine ("customDomain/ssoare paid flags: they must default OFF and only turn on when the server explicitly grants them") wasn't extended toscim, so nothing would have caught a future regression on that line. Fixed by extending all four existing "runtime-config commercial features" cases (defaults-off, grants-only-when-true, business-tier-grants-all, omitted-keys) with ascimassertion each — no new test cases, no parallel block.Premise re-verification (against current
origin/main, before editing)Both premises from the card still held:
RuntimeFeaturesdeclarescustomDomain?/sso?and notscim— confirmed by reading the interface directly.scim— reconfirmed with a seam-local control (stronger than the card's repo-wide one), same file/interface:grep -n '\bscim\b' packages/app-shell/src/runtime-config.ts→ 0 hitsgrep -n '\bsso\b' packages/app-shell/src/runtime-config.ts→ 4 hits (header-comment producer list, interface declaration, defaults literal,body.features.ssoderivation) — confirms the grep pattern isn't the reason for thescimzero.grep -rn '\bscim\b' --include='*.ts' --include='*.tsx' packages/ apps/→ 0 hits (exit 1), matching the card's report.packages/auth/src/types.ts:260has a comment "SCIM forces it on" next to an unrelatedadmin?: booleangate — not aRuntimeFeatures.scimreference, doesn't touch the premise.Scope
packages/app-shell/src/runtime-config.tsandpackages/app-shell/src/runtime-config.test.tsonly.packages/types/**untouched.describeblock — no newit()cases, sibling assertions' existing expectations (customDomain/ssovalues) unchanged.Reverse verification on the new test pins
Predicted before running: removing the
scim: body.features.scim === true,derivation line would turn the "business-tier grants all three" (positive-leg,scim: true → true) assertion red, while the three negative-leg assertions (defaults-off, thescim: falseleg in "grants...only when true", and the omitted-keys case) would stay green — because all three already expectfalse, and removing the line makescurrent.features.scimfall back to the untouched default (false) rather than genuinely measuring the mapping.Observed, exactly as predicted:
1 → 0, file hash changed.Tests 1 failed | 29 passed (30)— onlybusiness-tier grants all threefailed (expected false to be true).git hash-objectback to the pre-mutation hash,git diffempty.Tests 30 passed (30).This confirms the positive leg (added even though not itself paid surface UI) was necessary for the pin to be load-bearing — a negative-leg-only extension would have stayed green through a silent regression on the mapping line.
Tests
pnpm exec vitest run packages/app-shell/src/runtime-config.test.ts(repo-root invocation, per AGENTS.md) —Test Files 1 passed (1),Tests 30 passed (30), both before and after the test-pin extension (no newit()blocks were added, only assertions within the four existing ones —scim-referencing assertions went from 0 to 4 in this file).pnpm --filter '@object-ui/app-shell^...' build(dependency closure) thenpnpm --filter '@object-ui/app-shell' run type-check(tsc --noEmit && tsc -p tsconfig.test.json) — clean, exit 0, re-run after every commit.pnpm exec vitest run packages/app-shell/—Test Files 579 passed (579),Tests 5690 passed | 1 skipped (5691).node scripts/check-changeset-presence.mjs— ✅ 1 changeset declared for the 2 released-package source files now touched.node scripts/check-changeset-no-major.mjs— ✅ nomajorbump declared.Changeset
.changeset/5869-runtime-features-scim.md—@object-ui/app-shell: patch(declaration + mirrored plumbing + mirrored test coverage, additive and inert — no read point, no gate, no behavior change for any existing consumer).Generated by Claude Code