fix(marketplace): the consent panel promised confinement the runtime does not provide — say what the permission list actually does (objectstack#17147) - #9235
Merged
Conversation
…does not provide — say what the permission list actually does (objectstack#17147)
`PluginDisclosure` listed a code-bearing package's structured permission set
under "On install, this package will be granted:". A list of grants on a
security panel is read as a confinement promise — the complement assumed denied
— and on this platform it is not.
Measured on objectstack `9bd4344e4`: the consented set IS persisted
(`sys_package_installation.granted_permissions`), IS re-confirmed on a widening
upgrade (cloud answers 409 without `reconsent`), and IS registered on the
runtime's `PluginPermissionEnforcer` at load (objectstack#13457). It is queried
by NOTHING — `SecurePluginContext` has zero production construction sites, and
the fs/network gates have no caller at all — so the list is real and auditable,
and it is not a gate.
Maintainer ruling 2026-09-12 took option B, the same option objectstack#11330
took on the trust-tier half of the same claim: say it truthfully now. Enforcing
is the ADR-0025 materialize seam, a separately designed direction.
• `grantsIntro` becomes a REQUEST ("This package requests:") in all ten packs
• new `notEnforced` line beside the list, in all ten packs: recorded at
install, re-confirmed on a widening upgrade, and not yet a runtime restriction
The `ja` value stays PREDICATE-final (`要求します`) so that pack's documented
halfwidth-colon rule still decides it; slice five's colon case is updated to the
new bytes with the rule it pins spelled out, and its `ko` value pin follows.
New: `pluginDisclosureNotEnforced-17147.test.tsx` — both halves on the rendered
output, the retracted sentence asserted ABSENT, plus the no-permissions and
no-code branches so the positives cannot be satisfied by a component that
renders unconditionally. Ablated twice (retracted intro restored · note element
removed); each turns it red.
The framework end of this claim is objectstack-ai/objectstack#17753, whose pin
`granted-permissions-not-enforced.pin.test.ts` goes red the day the seam lands
and names this file among the texts that then become false.
Refs objectstack#17147 · objectstack#11333 · objectstack#13457 · objectstack#11330
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
hotlong
enabled auto-merge
September 12, 2026 02:33
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
|
…ack#17147) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Sep 12, 2026
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
|
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.
The objectui half of objectstack-ai/objectstack#17147. Framework half: objectstack-ai/objectstack#17753.
What the panel said, and what is true
PluginDisclosureintroduced a code-bearing package's structured permission set with "On install, this package will be granted:". A list of grants on a security panel is read as a confinement promise — the complement assumed denied.Measured on objectstack
9bd4344e4:sys_package_installation.granted_permissionsreconsent)PluginPermissionEnforcerat load (objectstack#13457)SecurePluginContexthas zero production construction sites; the fs/network gates have no caller at all⇒ the list is real and auditable. It is not a gate.
Maintainer ruling 2026-09-12 took option B — the same option objectstack#11330 took on the trust-tier half of this very claim: say it truthfully now. Enforcing it is the ADR-0025 materialize seam, a separately designed direction (fenced by ruling
5486840233).The change
marketplace.disclosure.grantsIntrobecomes a request, not a grant that binds the runtime — "This package requests:" — in all ten packs.marketplace.disclosure.notEnforced, rendered beside the list in all ten packs: "Recorded at install, and re-confirmed if a later version asks for more — but the runtime does not yet restrict the package to this list."Untouched on purpose: the trust-tier badge (
Sandboxed/In-process · full trust) is objectstack#11330's half of the same panel and is corrected in the spec's own text; correcting only your own half is that card's stated convention.The
jacolon, which is conditioned rather than copiedSlice five (objectui#3546) pins that the
japack takes the halfwidth:after a predicate and the fullwidth:after a noun label. The newjavalue is deliberately predicate-final (このパッケージは次の権限を要求します:) so that rule still decides it and the case keeps its meaning. Its exact-value assertion and thekovalue pin follow the new bytes; the comment now spells out that a future reword ending on a noun must flip to:rather than keep the byte and lose the rule.Verification
pluginDisclosureNotEnforced-17147.test.tsx(new): both clauses on the rendered output, the retracted sentence asserted absent, plus the no-permissions and no-code branches so the positives cannot be satisfied by a component that renders unconditionally. Ablated twice — retracted intro restored, note element removed — each turns it red.check:i18n-keysgreen: every call-site key resolves against theenpack and every inlinedefaultValuematches the pack byte for byte (the note is one string literal for exactly this reason).check:i18n-driftgreen: 1envalue changed, 1 key added, 9 packs followed.packages/app-shell/src/console/marketplace+packages/i18n/src/__tests__: 75 files / 1163 tests pass.node scripts/check-governed-queue-guard.mjs --test …→ NOT GOVERNED; ordinary queue route.🤖 Generated with Claude Code