Skip to content

finding(docs): three more teaching surfaces hand SchemaRenderer a forwarded data prop, and their expression prefixes are bare page-wide — measured census #9297

Description

@os-tesla

Measured while implementing objectui#8021, whose triage promoted "one look at whether the
sibling guides teach the same prop" into a required pre-step. The look was run before any
writing, and it came back positive: the same defect sits on three more teaching surfaces. It
is filed here rather than swept into that card's pull request, for the reason in the last
section.

Measured on origin/main ee5ef7748.

⚠️ JSX tag shapes are spelled out in words below: a tag-shaped fragment does not survive this
field, and the passages this card is about are exactly JSX elements.

The mechanism (unchanged from objectui#8021)

SchemaRendererProps declares exactly one prop, schema
(packages/react/src/SchemaRenderer.tsx). The docblock beside it names the consequence: the
renderer "passes every prop it does not itself read straight through to the component the
schema names". So a data={data} written on a SchemaRenderer element is not ignored and not
refused — it is forwarded, and nothing throws and nothing warns.

The evaluator's scope is built from usePredicateScope() plus current_user, an optional
record, data: dataSource and page: pageVariables, where dataSource comes from
SchemaRendererProvider. Four names, and a host's own values live under data. only.
user / current_user is the AMBIENT signed-in user an ExpressionProvider publishes — a
real name, but never the object the page handed over.

The census, measured with a lit control

The scan matched SchemaRenderer elements with a word boundary after the name, so
SchemaRendererProvider (the correct carrier) is excluded by construction. Control: the
scan found 18 elements across the five surfaces, so an empty offender list would have been a
reading rather than a silent zero.

surface SchemaRenderer elements carrying a forwarded look-alike ${…} openings whose head name no scope holds
content/docs/guide/schema-rendering.md 5 2 — (repaired on objectui#8021)
packages/react/README.md 4 1 — (repaired on objectui#8021)
content/docs/guide/expressions.md 6 3 26
content/docs/guide/architecture.md 1 1 4
README.md (repo root) 2 2 7

"Forwarded look-alike" is one of three props none of which SchemaRenderer reads: data,
dataSource, and debug — the last is read off the same provider context
(context?.debug || context?.debugFlags?.enabled), so
content/docs/guide/expressions.md's Debug Mode block is wrong on two props at once. The
root README.md carries one of each: a data={data} element in the quick-start and a
dataSource={dataSource} element in the ObjectStack data-integration section.

The head names the scope does not hold, by surface:

  • content/docs/guide/expressions.mdusers×8, form×3, price×2, status×2, task×2,
    score, count, settings, items, total, formatCurrency, adultUsersScore, x,
    isAdmin
  • content/docs/guide/architecture.mdform×2, orders×2
  • README.mdstats×7

⚠️ That column is a population, not a verdict. Some of those are legitimately about a
custom evaluation context the page is teaching on purpose (formatCurrency sits in the
"Custom Functions" section, which hands the evaluator its own context), and item / index
were excluded up front because list renderers publish them through a different mechanism.
Deciding which of the remainder are wrong is the work this card is asking for.

Why this is not folded into objectui#8021's pull request

That card's central fence is that the page teaches two independent errors and that both
coordinates move or neither does — its leg D measures that correcting the wiring while
leaving the bare prefix still puts the raw source on screen.

On these three surfaces the element is only half the defect, and the other half is
page-wide rather than a passage. Moving only the wiring would produce exactly leg D at
scale: three pages that read as repaired and still print the characters the author typed.
Moving both halves means rewriting the expression spelling of a whole guide, several times
over, with a judgement on each site about whether it means the ambient user or the data
scope — a judgement objectui#8021 does not settle and its dispatch explicitly refused to let
a claimant invent.

So objectui#8021 repaired, in full, the two surfaces where every site in the passage moves
together, and this card carries the population where it does not.

What a repair would decide

Per surface, whether the page is teaching the data scope (then the wiring becomes a
SchemaRendererProvider mount and every reference takes the data. prefix) or the
ambient host scope (then the bare name is right and the page should say which provider
publishes it). The two answers are different documents, which is why this is not a
find-and-replace.

⛔ Deliberately unassigned and unlabelled, for triage.

Generated by Claude Code in session session_01UzHd6hDYatoDn17BuwKxnZ — attribution written
as prose here because the footer block does not survive issue creation.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions