feat(profiles): tenant_admin gains the org-scoped presentation authority (manage_org_presentation) - #1994
Merged
objectstack-fleet[bot] merged 1 commit intoOct 3, 2026
Conversation
The SaaS composition's `tenant_admin` shipped with no metadata-authoring key, because the platform's only one was `manage_metadata` (`scope: 'platform'`). The installed `@objectstack/spec` 17.6.0 declares the org-scoped subset `manage_org_presentation` (`scope: 'org'`), so the profile now grants it. The docstring's "deliberately DROPPED" paragraph shrinks to that grant, as it said it would, and its `Blocked-by:` line goes. The three app keys it named (`customize_application`, `manage_profiles`, `manage_roles`) stay ungranted: on 17.6.0 the types they author (object, app, page, permission, position) are all `allowOrgOverride: false`, so they still need the platform-scoped key. `test/saas-composition.test.ts` adds the positive assertion, with the scope read from the installed `PLATFORM_CAPABILITIES`. The existing pin that `tenant_admin` holds no platform-scoped capability is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ER8ntXZhYebyQ66aXWdjfT
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
hotlong
pushed a commit
that referenced
this pull request
Oct 3, 2026
… raise, #1994, #1963 No conflicts. #1953 raises the src/sales ceilings to 59,000 / 107,000, the ruled answer to this branch's measurement. #1994 (tenant_admin profile) and #1963 (tsx bump, pnpm-lock.yaml) do not touch this branch's file surface. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ER8ntXZhYebyQ66aXWdjfT
This was referenced Oct 3, 2026
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 #1369
Clause-②: no. The change adds one capability that the installed
@objectstack/spec17.6.0 already declaresscope: 'org'to the app's owntenant_adminprofile. It touches no published schema and no accept set.Permission boundary: grants one org-scoped capability to
tenant_adminThe SaaS composition's
tenant_admin(src/sales/profiles/tenant-admin.profile.ts) gainsmanage_org_presentationinsystemPermissions. The communitysystem_adminand the default composition are untouched. This PR changes nopackage.jsonor lockfile, becausemainis already on@objectstack/*17.6.0.Readings on the installed
@objectstack/spec17.6.0 (worktree at25cd8d78, before the edit):Restart-when:probe, run verbatim: exit 0.PLATFORM_CAPABILITIESentry, verbatim:{"name":"manage_org_presentation","label":"Manage Organization Presentation","description":"Author per-organization presentation overlays — the metadata types whose registry entry declares allowOrgOverride — scoped to the caller’s own organization.","scope":"org"}. That is 1 of 9 entries.manage_metadatareadsscope: 'platform'.manage_org_presentation_zzzreads as absent.metaWriteCapabilityVerdictfrom the installed@objectstack/metadata-core, with operationsave. It is not a test file, and no test imports that transitive dependency.view,dashboard,report,translationandemail_templatesaves with an active org are ALLOWED.view,dashboardandreportsaves without an active org are DENIED.object,flow,app,page,permissionandpositionstay DENIED with an active org, refused with "Saving a metadata item requires themanage_metadatacapability."manage_metadataalone onpermissionis ALLOWED.DEFAULT_METADATA_TYPE_REGISTRYin@objectstack/spec/kernel, has 28 types. Exactly five declareallowOrgOverride: true: view, dashboard, report, translation and email_template.What this proves, and what it does not. It proves the registry's scope for the key, and the platform evaluator's verdict for this exact permission list. It does not prove that a booted SaaS composition threads this profile into a session. No boot was run, and the card does not require one.
Changes
src/sales/profiles/tenant-admin.profile.tssystemPermissionsentry,'manage_org_presentation', with a one-line comment in the file's own style.manage_metadataobjectstack#12702 … this paragraph shrinks to a grant" shrinks to the grant, as it said it would, and theBlocked-by:line is dropped.customize_application,manage_profilesandmanage_rolesstay ungranted. That claim was re-measured on 17.6.0, not carried over: none of the three is inPLATFORM_CAPABILITIES(they are app vocabulary). The types they author (object, app, page, permission, position) are allallowOrgOverride: false, and the verdict above refuses them withoutmanage_metadata.test/saas-composition.test.ts: a positive assertion beside themanage_org_usersone.tenant_adminholdsmanage_org_presentation, and the installedPLATFORM_CAPABILITIESdeclares itscope: 'org'. The scope is read from the registry, not copied. The existing pin "grants NO platform-scoped capability" is unchanged and stays green with the grant, which is the proof that the grant stays inside one organization..changeset/1369-tenant-admin-org-presentation.md:'hotcrm': minor, as the card asks. hotcrm's AGENTS.md has no rule againstminorhere.No docs enumerate
tenant_admin's permissions.git grep manage_org_usersoverdocs/,content/andREADME.mdreturns 0 hits. As a control,tenant_adminreturns 1 hit,docs/ARCHITECTURE.md:229, which names the profile without listing grants. So no doc line changes.Verification
All of the following ran at HEAD
22d1682c, the final commit on this branch. The SHA was printed by the same locked run, before the gates.OS_VERIFY_LOCK_SLOT=hotcrm-issue-1369 bash …/os-verify-lock.sh -c 'git rev-parse --short HEAD && pnpm verify'printed22d1682c, thenos-verify-lock: VERDICT command-exit 0. Along the chain:✓ Validation passedtsc --noEmitcleanobjectstack lint: 1 warning, which predates this PR and is unrelated (sales_home_pagepage:carddescription)✓ i18n lint gate: 0 i18n/missing-* issues✓ source hygiene clean✓✓ Build completeTest Files 174 passed (174),Tests 3702 passed | 1 skipped (3703)pnpm exec vitest run --maxWorkers=2 test/saas-composition.test.tsreturnedTests 18 passed (18), exit 0.scripts/ablation-replace.mjswith the change already committed:'manage_org_presentation',entry. The anchor went x1 → x0, and the blob wentac15ca5b8167→836edba0ce20.× holds the org-scoped presentation-authoring capability (#1369), withAssertionError: expected [ 'view_setup', …(4) ] to include 'manage_org_presentation'andTests 1 failed | 17 passed (18). The platform-scoped pin stayed green.ac15ca5b8167) andgit diff HEADis empty.Not run locally: a boot of the SaaS composition (optional for this card).
Token ratchet (
node scripts/check-source-token-ratchet.mjs, exit 0 both runs), thesrc/salesrows before → after:src/sales/profilescounts in the total only.No ceiling moved.
Acceptance notes
-r71suffix. The name in the first claim is occupied by a stale ref atd586eed9, made under the banned account's session and very likely the head of the unreadable PR feat(profiles): tenant_admin gains the org-scoped presentation authority #1882. That ref is left untouched: nothing was merged, cherry-picked or deleted. The re-claim on Grantmanage_org_presentationtotenant_adminonce the capability ships in a released @objectstack line #1369 (comment5965084031) names this branch.Generated by Claude Code