Repository navigation
Conversation
Measurement-only branch. The diff is intentionally empty: this card asked for a reading, not a rewrite, and the reading is carried in the PR body. Measured at objectui pin 190fbd01d (which contains c86185eb5) against the real console: properties.visible is still legacy-JS and fail-soft, an in-place has() guard still breaks both banners, and node-level visibleWhen is now honoured on record:alert and binds record. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RfyXxZ2WPjcjhuXpiQQc3y
Contributor
Author
|
Closing: this PR carried no source change (0-file diff, one empty commit), and the measurement report it existed to deliver now lives on #9167 — see the report comment there. The Generated by Claude Code Generated by Claude Code |
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.
Part of #9167 — measurement only. The diff is empty by construction (a single empty commit so the PR can exist); no file in this repo or in objectui was edited. The card stays open: the authoring change this measurement unblocks is deliberately not applied here and is the PM's to rule on.
TL;DR — four readings, two of them reversing the previous round
has()guard in place toproperties.visiblestill turns a correctly-hidden banner into a permanently-visible one, on both pages, with"has" is not a functionin the console (D1, D2). Screenshot-confirmed: "Email not verified" rendered directly above the page's own "Email Verified: ✓ Yes" chip. Leave steps 2–3 struck.record:alertnow honours the node-levelvisibleWhengate — the thing that was measured inert on 2026-08-20.visibleWhen: {cel,'false'}on the banner now HIDES it (E1), where the same probe did nothing before.visibleWhenbindsrecordandctx.user, polarity-correct on both pages (F1/F2, G4/G5/G6b) — objectuic86185eb5observed working through the vendored bundle, not inferred from its title.visibleWhen(CEL) and remove it fromproperties.visible", withhas()guards. Every leg green, including forced-sparse and a no-flash check. Not applied; see "What I recommend".Environment
origin/main@281069522, dedicated worktree,turbo build→Tasks: 71 successful, 71 total✓ @objectstack/console dist ready (49388 KB) from objectui@190fbd01d061, with✓ Bundle canary 'import/jobs' presentand✓ Console bundle carries THIS tree's @objectstack/spec, and only itc86185eb5237a79d…"Bindrecordinto node-levelvisibleWhen, and stopvisibleswallowing it (#5505)", Fri Aug 21 08:09:49 2026 —git merge-base --is-ancestor c86185eb5 190fbd01d→ true. The clone is shallow and answersNot a valid object namefirst; re-run aftergit fetch --depth=400.objectstack dev --ui --seed-admin -p 39167on its own sqlite file, 48 plugins, 132 seed rowsPLAYWRIGHT_BROWSERS_PATHvia anexecutablePathoverride (the bundled 1.62 expects build 1234; ⛔playwright installwas not run)What the block binds today (question 1)
The console's detail read is
GET /api/v1/data/<object>?populate=…&top=1&filter=["id","=",<id>]— no$select— and it projects everything:showcase_task__searchsys_user__searchBoth gate fields (
status,email_verified) are present. So the sparse case is not reachable on the ordinary path — it had to be forced by rewriting the response, which is what the C and G runs do.On the wire (
/api/v1/meta/page, 34 pages served): exactly 2record:alertblocks exist, the two on this card, and both carryvisibleas a bare string with novisibleWhen—showcase_task_detailatregions[0].components[1],sys_user_detailatslots.alerts[0]. The two are identical on every dimension tested; the earlier "one is a{dialect:'cel'}envelope" claim stays falsified at this pin. Separately, all 6 authoredvisibleWhenvalues served are{dialect:'cel'}envelopes and 0 are bare — i.e. an author writing a bare string intovisibleWhengets CEL for free.Runs
Every "hidden" verdict is paired with a mount of the same shape that must SHOW, and every run carries a page-render control.
patched/keysRemovedare the interception counters proving the rewrite was live.Baselines — both banners are correct today (unmodified)
in_reviewtodosys_userself,email_verified=falsesys_userself,email_verifiedforcedtrue(15 keys set)Fault direction on
properties.visible(question 2) — fail-SOFT, observedvisible: "MARKER9167NOSUCHIDENT == 1"on atodotaskFailed to evaluate expression: ${MARKER9167NOSUCHIDENT == 1} … is not definedAn unevaluable
properties.visibleleaves the banner rendered. objectui#4807's reading — 「fail-soft 使作者门控的横幅永远显示」 — holds at this pin.Forced-sparse, unguarded — still
false, still hiddenin_review,statusstripped from the read (6 keys removed)sys_userself,email_verifiedstripped (2 keys removed)Bare strings run on objectui's legacy JS evaluator, where a missing key is
undefinedandundefined == 'in_review'is plainfalse. The #8990 absent-key fault class still does not reach this surface. The card title's attribution stays falsified.⛔ The struck step 2, executed literally — still harmful
todotask,visible: "has(record.status) && record.status == 'in_review'"visible: "has(record.id) && has(record.email_verified) && …"Console on both:
Failed to evaluate expression … "has" is not a function. Fail-soft turns that throw into a shown banner. D2's screenshot is the "Email not verified" banner sitting above "Email Verified: ✓ Yes". Steps 2–3 stay struck; nothing aboutc86185eb5touched this path.⭐ The node-level
visibleWhengate — inert on 2026-08-20, live nowin_reviewtask (baseline VISIBLE) +visibleWhen: {cel,'false'}todotask,visibledropped +visibleWhen: {cel,'true'}todo,visibledropped +visibleWhen: {cel,"record.status == 'in_review'"}recordbinds into the node gatein_review, sametodo,visibleWhen: {cel,'true'}and the authoredvisibleleft in placevisibleWhendoes not rescue a falseproperties.visibleE3 is the operationally important one: a migration must remove
properties.visible, not just addvisibleWhenbeside it.has()on thevisibleWhen/CEL face — works, and is load-bearingin_review,visibleWhen: has(record.status) && record.status == 'in_review'statusstripped from the read (5 keys removed)statusstripped (4 keys removed)[object-ui] A conditional predicate failed to evaluate and was treated as its safe default (true) … Reason: [runtime] No such key: statusvisibleWhen,visibledroppedtodo, guardedvisibleWhenonly, polled every 150 ms for 8 sin_reviewpageG3 is the warning label on the whole migration: on the CEL face a missing key is a fault, and that face is fail-soft too — so moving a predicate to
visibleWhenwithouthas()re-arms exactly the bug this card feared, on a surface that previously could not have it. G4/G5/G6b showctx.userbinds there as well (a fault on that half would have fail-softed G4 and G6b to VISIBLE; both are hidden).Controls, stated (zero-hit discipline)
metaPatched=1proves the metadata rewrite reached therecord:alertnode;keysRemoved/keysSetprove the payload rewrite touched real rows. A zero there would have invalidated the run.[role="status"] / [role="alert"]node text, cross-checked against a body-text detector, and it is demonstrated live in both directions in the same session.What I recommend the PM rule
Do not lift the strike; retire it and replace it. Steps 2–3 as written stay wrong forever — they target
properties.visible, whose evaluator has nohas()and never will. What changed is that a different, better remedy became available, and it is now measured green end to end:Four axes, as the escalation form requires:
false, which is the correct verdict anyway. The pull is authoring coherence, not a live bug.has()semantics every other predicate face was migrated to. It is also the downstream half the maintainer's 2026-08-20 ruling 「A 让 record:alert 认 visibleWhen(推荐)」 already ordered; the upstream half has landed and the pin carries it.visible: 'record.x == 1'gets a silently legacy-evaluated predicate that happens to work; an author who writes the guarded CEL form the platform teaches everywhere else gets a thrown predicate and a permanently-visible banner (D1/D2). Moving to the declared slot makes the correct-looking input the one that works, and a genuine fault there is at least loud (G3's warning names the key).visiblekey must be deleted, not left beside the new gate (E3); (b) thehas()guards are mandatory on the CEL face — unguarded there is strictly worse than today (G3).Limits of this run
email_verified=truecould not be written through the data API (PERMISSION_DENIED … editable fields: name, image, ADR-0092), so the verified-user state is produced by rewriting the response — the same mechanism as every other probe here.record-alert.tsx,predicateInput.ts, and the pinnedrecord-alert.visibleWhen.evidence.test.tsxheader at objectui190fbd01d.node scripts/pm/dispatch-gates.mjsderives nothing — "this branch changes nothing against 'origin/main' (merge base 2810695) — nothing to derive." Reporting a green gate sha here would be reporting the green of a tree nobody changed.git status --shortis empty; the tree measured is281069522.Generated by Claude Code