Observation found while wiring objectui#6443 (the app-shell visible gate onto the #6038onFault seam). Filed unassigned, as a finding rather than a fix: it is a message-copy tier mismatch, not a broken gate.
What was measured
formatUnresolvableVisibilityMessage (packages/react/src/utils/visibilityDiagnostic.ts) closes every report with:
Page-component predicates bind `record` (the row on a record page),
`current_user`, and page state as `page.<var>`. Check those roots and the
CEL syntax.
That is correct for the tier it was written for — SchemaRenderer's node gate. It is now also printed for two surfaces that bind a different scope:
- app-shell chrome (
ExpressionProvider, joined by objectui#6443). The evaluator is built in ExpressionProvider.tsx with the context bag { current_user, user, ctx.user, os.user, app, data, features }. There is no record and no page.<var> at this tier at all. So an author whose nav visible faulted is told to check two roots that cannot exist here, while the four aliases that DO exist (user, ctx.user, os.user, app) and features — the deployment-flag root the provider's own docblock documents for exactly this kind of predicate — go unnamed. page:tabs items (joined by objectui#6038) sit at the node tier, so the paragraph is right there.
Only the LAST paragraph is affected. The first one ("the gate did NOT bite — a predicate that cannot be evaluated reads on screen exactly like one that said yes") is true on every surface wired to this reporter, including the fail-open app-shell gate.
Why it is filed rather than fixed in objectui#6443
That card's scope is the app-shell wiring; its own text draws the boundary at not "quietly widening the PR's file surface into a third package", and re-tiering shared copy in @object-ui/react is exactly that. The card also does not need it: the line already carries the surface label, the gate key, the predicate source and the engine's reason, which is what makes the fault findable.
Related, and NOT a duplicate of either
- objectui#6445 records that the same reporter's copy is wrong for the
disabledpolarity ("the gate did NOT bite" is backwards when the safe default is the one that bites). That is the first paragraph, a different sentence, and a different reason. - objectui#6444 is the un-deduped
evaluate() warning — a different defect entirely.
Searched the 245 open issues before filing; neither of the above nor anything else covers this paragraph.
One thing to decide rather than assume
Whether the advice should be parameterised per surface (the reporter would need a scope hint from each caller) or generalised into copy true of every tier (e.g. naming the roots as "whatever this surface binds" and pointing at the docs page). The second costs nothing at the call sites and loses the concrete root names that make the node-tier version useful; the first adds an argument to a reporter three packages now call.
Generated by Claude Code
Observation found while wiring objectui#6443 (the app-shell
visiblegate onto the #6038onFaultseam). Filed unassigned, as a finding rather than a fix: it is a message-copy tier mismatch, not a broken gate.What was measured
formatUnresolvableVisibilityMessage(packages/react/src/utils/visibilityDiagnostic.ts) closes every report with:That is correct for the tier it was written for —
SchemaRenderer's node gate. It is now also printed for two surfaces that bind a different scope:ExpressionProvider, joined by objectui#6443). The evaluator is built inExpressionProvider.tsxwith the context bag{ current_user, user, ctx.user, os.user, app, data, features }. There is norecordand nopage.<var>at this tier at all. So an author whose navvisiblefaulted is told to check two roots that cannot exist here, while the four aliases that DO exist (user,ctx.user,os.user,app) andfeatures— the deployment-flag root the provider's own docblock documents for exactly this kind of predicate — go unnamed.page:tabsitems (joined by objectui#6038) sit at the node tier, so the paragraph is right there.Only the LAST paragraph is affected. The first one ("the gate did NOT bite — a predicate that cannot be evaluated reads on screen exactly like one that said yes") is true on every surface wired to this reporter, including the fail-open app-shell gate.
Why it is filed rather than fixed in objectui#6443
That card's scope is the app-shell wiring; its own text draws the boundary at not "quietly widening the PR's file surface into a third package", and re-tiering shared copy in
@object-ui/reactis exactly that. The card also does not need it: the line already carries the surface label, the gate key, the predicate source and the engine's reason, which is what makes the fault findable.Related, and NOT a duplicate of either
disabledpolarity ("the gate did NOT bite" is backwards when the safe default is the one that bites). That is the first paragraph, a different sentence, and a different reason.evaluate()warning — a different defect entirely.Searched the 245 open issues before filing; neither of the above nor anything else covers this paragraph.
One thing to decide rather than assume
Whether the advice should be parameterised per surface (the reporter would need a scope hint from each caller) or generalised into copy true of every tier (e.g. naming the roots as "whatever this surface binds" and pointing at the docs page). The second costs nothing at the call sites and loses the concrete root names that make the node-tier version useful; the first adds an argument to a reporter three packages now call.
Generated by Claude Code