Provenance: rebuilt from objectstack-ai/objectstack#11247 (filed there by the #9167 measurement round because the measuring dev was fenced out of this repo; transferred by the triage seat 2026-08-23 under multi-repo rule 1 — strip objectstack from the description and it still stands; the logging evaluator and renderer live here). Source card closed as moved.
What was observed
Measured in a real console at objectui pin 190fbd01d during the objectstack#9167 measurement round (2026-08-23, full evidence on that card).
On every record-detail page load carrying a bare-string page-block predicate — including the ordinary, correct ones — the console logs an evaluation failure for the loading frame:
Failed to evaluate expression: ${record.status == 'in_review'}
Error: ... record is not defined
Observed on A1 (banner correctly shown), A2 (banner correctly hidden), and B1/B2 alike. It is emitted in every polarity, on pages where the predicate demonstrably works.
Why it is worth a card
It is not a symptom of anything being wrong — and that is exactly the problem. An author debugging a page-block predicate sees record is not defined on a page where the predicate functions correctly. The diagnostic is permanently misleading on the happy path: it invites a fix for a non-defect, and it trains readers to ignore a message that would matter if it ever fired for a real reason. The platform's strategy on predicate faults is to make them loud and accurate (the CEL face names its missing key: [runtime] No such key: status); a warning that cries wolf on every load degrades that channel.
Mechanism locus
The loading frame of the legacy evaluator path: the bare-string predicate is evaluated before the record binding exists, the failure is logged, and a later frame evaluates correctly. record-alert.tsx / predicateInput.ts at the pinned SHA are the read entry points (read for explanation in the source round, not as evidence).
Sizing datum (measured, bounds the value)
At the same pin, all 6 authored visibleWhen values served across 34 pages are {dialect:'cel'} envelopes and 0 are bare; the only 2 record:alert blocks in existence carry visible as bare strings. The bare-string path is a small and shrinking surface — the fix is diagnostic hygiene, not a behavior change.
Scope as queued
Make the loading-frame evaluation of a bare-string predicate not emit a spurious error when the failure is "binding not yet present" (defer, suppress-first-frame, or downgrade-with-context — dev measures which is honest); a predicate that fails after its bindings exist must still fail loudly. Pin both halves: happy-path load logs nothing; a genuinely-broken predicate still reports.
Refs: objectstack-ai/objectstack#11247 (source, full context) · objectstack-ai/objectstack#9167 (measurement round) · objectstack-ai/objectstack#11255 (upstream: raw Page literals are why bare strings reach the wire at all).
Provenance: rebuilt from objectstack-ai/objectstack#11247 (filed there by the #9167 measurement round because the measuring dev was fenced out of this repo; transferred by the triage seat 2026-08-23 under multi-repo rule 1 — strip objectstack from the description and it still stands; the logging evaluator and renderer live here). Source card closed as moved.
What was observed
Measured in a real console at objectui pin
190fbd01dduring the objectstack#9167 measurement round (2026-08-23, full evidence on that card).On every record-detail page load carrying a bare-string page-block predicate — including the ordinary, correct ones — the console logs an evaluation failure for the loading frame:
Observed on A1 (banner correctly shown), A2 (banner correctly hidden), and B1/B2 alike. It is emitted in every polarity, on pages where the predicate demonstrably works.
Why it is worth a card
It is not a symptom of anything being wrong — and that is exactly the problem. An author debugging a page-block predicate sees
record is not definedon a page where the predicate functions correctly. The diagnostic is permanently misleading on the happy path: it invites a fix for a non-defect, and it trains readers to ignore a message that would matter if it ever fired for a real reason. The platform's strategy on predicate faults is to make them loud and accurate (the CEL face names its missing key:[runtime] No such key: status); a warning that cries wolf on every load degrades that channel.Mechanism locus
The loading frame of the legacy evaluator path: the bare-string predicate is evaluated before the
recordbinding exists, the failure is logged, and a later frame evaluates correctly.record-alert.tsx/predicateInput.tsat the pinned SHA are the read entry points (read for explanation in the source round, not as evidence).Sizing datum (measured, bounds the value)
At the same pin, all 6 authored
visibleWhenvalues served across 34 pages are{dialect:'cel'}envelopes and 0 are bare; the only 2record:alertblocks in existence carryvisibleas bare strings. The bare-string path is a small and shrinking surface — the fix is diagnostic hygiene, not a behavior change.Scope as queued
Make the loading-frame evaluation of a bare-string predicate not emit a spurious error when the failure is "binding not yet present" (defer, suppress-first-frame, or downgrade-with-context — dev measures which is honest); a predicate that fails after its bindings exist must still fail loudly. Pin both halves: happy-path load logs nothing; a genuinely-broken predicate still reports.
Refs: objectstack-ai/objectstack#11247 (source, full context) · objectstack-ai/objectstack#9167 (measurement round) · objectstack-ai/objectstack#11255 (upstream: raw
Pageliterals are why bare strings reach the wire at all).