You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Measure whether /meta/* READS are permission-filtered on stub-auth and marketplace-preview boots — the half objectui#5828 still needs, which #11373 did not answer #11806
Filed by the objectui domain:ui PM seat (session_01CSoz9uGhaaSgiq3hshtN7L, seat post objectui#5560), unassigned. This is the framework-side question objectstack-ai/objectui#5828 is parked on. ⚠️ It is not a duplicate of #11373, and the difference is the whole point of the card.
#11373 asked, and answered well: do the /meta/*WRITE routes refuse an unauthenticated principal? Its measurement (PR #11472, merged) drove all six mutating doors as real HTTP against a booted showcase — anonymous → 401 UNAUTHENTICATED with nothing persisted (admin read-back stayed 404), an authenticated member → 403 from the separate manage_metadata gate, and the dev admin → the door runs and the PUT actually persists (404 → 200 read-back), which is the reverse-check proving the 401 is the auth floor rather than a broken probe. Ablation drove all twelve anonymous cases red. Nothing about that result is in doubt.
But objectui#5828's benignity argument does not rest on write refusal. From its body, verbatim: "the server is not filtering /meta/* per user, so the cached list is not a permission-filtered artifact and there is no cross-principal disclosure to make." That is a claim about READ filtering. ⚠️ Refusing anonymous writes says nothing about whether reads are permission-filtered, so "benign by construction" does not follow from the one to the other.
And the deployment class is different too
#11373 measured bootStack(showcaseStack) under platform-default security, explicitly with no requireAuth override. Its controls line records "anonymous GET /meta/types → 401", which on that boot would make an @anon client cache benign for an even stronger reason than objectui#5828's argument — there is nothing to cache.
⛔ That is not the boot objectui#5828 is about. Its two branches are selected only when discovery reports an auth stub / handlerReady:false, or the deployment is a marketplace preview — deployments that by definition are not running platform-default auth. That class was never measured.
The question
On a stub-auth / handlerReady:false deployment and on a marketplace-preview deployment, are /meta/*reads permission-filtered per user?
If reads are filtered per user on those boots: the objectui client caches a permission-filtered artifact under a synthetic @anon principal, and objectui#5828's concern is live — re-grade it with the measured defect.
Measurement first. ⛔ Not a redesign of metadata auth. If the measurement exposes a design fork — e.g. an intentional read/write asymmetry on stub-auth boots that documentation contradicts — stop and report for the decision inbox rather than picking.
⚠️ Worth stating for whoever takes it: the two named boots may not be constructible from the framework's own test harness at all. If they are configurations only the deployment layer produces, that answer ("this cannot be measured from here, and here is who can") is a legitimate and useful result — much better than measuring the default boot again and reporting it as though it covered these.
What the client side has already established
objectui#5746 measured both of its named windows shut on a real apps/console session: ConsoleShell's driver-memory / driver-mongodb:裸日期 $lte 上界在 datetime 值上同样丢当天数据(#3777 的非 SQL 驱动对齐) #4042 session gate holds MetadataProvider from mounting until getSession() has written TokenStorage. apps/console never takes either branch, so nothing shipped in the console is implicated — the exposure, if any, is in stub/preview deployments.
That protection is now pinned (objectui PR test(lint): loop fixtures 改拼 canonical 的 iteratorVariable 并上 schema pin (#5700) #6103, Part of objectui#5828), and the pin asserts today's behaviour — including that the guest and previewMode boots do write objectui:metadata:app:@none:@anon. ✅ Deliberately pinned, ⛔ not fixed, precisely so that whichever way this card rules, the change can be executed against a measured baseline.
Filed by the objectui⚠️ It is not a duplicate of #11373, and the difference is the whole point of the card.
domain:uiPM seat (session_01CSoz9uGhaaSgiq3hshtN7L, seat post objectui#5560), unassigned. This is the framework-side question objectstack-ai/objectui#5828 is parked on.Why #11373 does not answer it
#11373 asked, and answered well: do the
/meta/*WRITE routes refuse an unauthenticated principal? Its measurement (PR #11472, merged) drove all six mutating doors as real HTTP against a booted showcase — anonymous → 401 UNAUTHENTICATED with nothing persisted (admin read-back stayed 404), an authenticated member → 403 from the separatemanage_metadatagate, and the dev admin → the door runs and the PUT actually persists (404 → 200 read-back), which is the reverse-check proving the 401 is the auth floor rather than a broken probe. Ablation drove all twelve anonymous cases red. Nothing about that result is in doubt.But objectui#5828's benignity argument does not rest on write refusal. From its body, verbatim: "the server is not filtering⚠️ Refusing anonymous writes says nothing about whether reads are permission-filtered, so "benign by construction" does not follow from the one to the other.
/meta/*per user, so the cached list is not a permission-filtered artifact and there is no cross-principal disclosure to make." That is a claim about READ filtering.And the deployment class is different too
#11373 measured
bootStack(showcaseStack)under platform-default security, explicitly with norequireAuthoverride. Its controls line records "anonymousGET /meta/types→ 401", which on that boot would make an@anonclient cache benign for an even stronger reason than objectui#5828's argument — there is nothing to cache.⛔ That is not the boot objectui#5828 is about. Its two branches are selected only when discovery reports an auth stub /
handlerReady:false, or the deployment is a marketplace preview — deployments that by definition are not running platform-default auth. That class was never measured.The question
@anonprincipal, and objectui#5828's concern is live — re-grade it with the measured defect.Scope
Measurement first. ⛔ Not a redesign of metadata auth. If the measurement exposes a design fork — e.g. an intentional read/write asymmetry on stub-auth boots that documentation contradicts — stop and report for the decision inbox rather than picking.
What the client side has already established
apps/consolesession:ConsoleShell's driver-memory / driver-mongodb:裸日期$lte上界在 datetime 值上同样丢当天数据(#3777 的非 SQL 驱动对齐) #4042 session gate holdsMetadataProviderfrom mounting untilgetSession()has writtenTokenStorage.apps/consolenever takes either branch, so nothing shipped in the console is implicated — the exposure, if any, is in stub/preview deployments.MetadataProvider's seed read precedesAuthProvider'spurgePreviousUserClientState. finding(service-queue):db-queue-adapter.test.ts的 engine-double DEBT 台账条目已可结清 —— 它自述的阻塞(缺 @objectstack/objectql devDependency)在 #5192 里已消失 #5198's principal-scoped key is the sole protection on that boot — demonstrated, not argued: withTokenStorageempty on an authenticated session, a second user booting in the same tab HIT the first user's key and renderedhr-secret.Part of objectui#5828), and the pin asserts today's behaviour — including that the guest andpreviewModeboots do writeobjectui:metadata:app:@none:@anon. ✅ Deliberately pinned, ⛔ not fixed, precisely so that whichever way this card rules, the change can be executed against a measured baseline.db-queue-adapter.test.ts的 engine-double DEBT 台账条目已可结清 —— 它自述的阻塞(缺 @objectstack/objectql devDependency)在 #5192 里已消失 #5198 — its two-principal scenario had both principals degenerate to@anon, so no distinct-token cross-principal case existed. A new scenario was added for exactly that. Treat any pre-existing "we already pin this" claim on either side with the same suspicion.Refs
@anonmetadata seed — benign only if /meta/* is unfiltered on those deployments, which is reasoned not measured objectui#5828 (the client-side observation this unblocks) · Observation: MetadataProvider's seed principal collapses to@anonin the window where the bearer is absent, so two principals can share one seed scope objectui#5746 (parent, closedlatent-not-live) · Sign-out leaves the cached metadata (and the active-org id) in storage — the next user in the same tab is seeded with the previous user's permission-filtered app list objectui#5198 (the principal-scoped key) · fix(auth): scope the active-organization key per user, and drop the previous user's client state on a session-user change objectui#5744 (the purge that does not cover this) · objectui: 登录页在无会话时仍拉 /meta/*,登录前刷 30 条 401 报错,且日志打成 [object Object] 无法定位 objectui#4042 (the session gate that shuts both named windows)