docs(ui,protocol,lint): a form SECTION visibleWhen binds current_user — retire the claim from the three prose sites #13074 left unswept - #13532
Merged
os-project-manager merged 2 commits intoAug 30, 2026
Conversation
… claim from the three prose sites #13074 left unswept
…im; pin the gate epilogue
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
os-project-manager
marked this pull request as ready for review
August 30, 2026 17:19
os-project-manager
enabled auto-merge
August 30, 2026 17:19
os-project-manager
deleted the
claude/issue-13077-current-user-section-prose
branch
August 30, 2026 17:41
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.
Fixes #13077
A form-view section
visibleWhenbindscurrent_usertoday. That was re-measured and landed for the schema text and the field-rule lint message in PR #13074, but three hand-written sites still taught the retired claim. Text only — no schema, no verdict, no runtime behaviour moves.H1 first: the claim was verified before any prose was trimmed
The card is an explicit relay and marks itself unverified, so nothing here was trimmed on its word. Verified at source in
objectui, not from #13074's prose:apps/console/src/components/FormPage.tsx:1855callsisSectionVisible(sec, values, loaded.record, predicateScope), andisSectionVisibleforwards that scope toevalFieldPredicate(objectui#6110). It used to passundefined.packages/plugin-form/src/ObjectForm.tsx:1271copies an authored sectionvisibleWhenonto thesection-dividerpseudo-field the renderer evaluates with the scope bound (objectui#6111);SplitForm/ModalForm/DrawerFormcarry the same line.packages/components/src/renderers/form/__tests__/predicate-scope-parity-6010.test.tsxpins the section surface at parity with the field surface.⇒ the retired claim is still present at all three sites and still wrong. H1 confirmed, not falsified.
H3: measured and falsified — #13074 did not take these
#13074's "four stale text sites" are
FormSectionSchema.visibleWhen,SelectOptionSchema.visibleWhen,SELECT_OPTION_EDITABILITY_GUIDANCE, and the field-rule message inpackages/lint/src/validate-expressions.ts. Its onlycontent/docschanges are the generatedreferences/ui/view.mdxandreferences/data/field.mdx. None of this card's three files were in it — and its section-3 target ispackages/lint/scripts/check-doc-formula-expressions.mjs, a different file from thesrc/one #13074 corrected.H2: the gate epilogue is the load-bearing half — confirmed, and the reason is on the record
The gate's own JSDoc had already been re-measured and says so explicitly: "(#12914 tracks the message text that describes the mechanism)". The mechanism text was the deferred item, and it is the one an author reads at refusal time. The two
.mdxedits are the wider blast radius; the epilogue is the half that teaches the wrong rule at the moment someone is already stuck.The three files
content/docs/ui/views.mdxlisted "section-level predicates (objectui#6111)" as a surface that still evaluates the predicate unbound — naming as evidence the very PR that bound it.content/docs/protocol/objectui/layout-dsl.mdxcarried the claim at four sites, where the card recorded three: a code comment inside anos:checkblock, the binding-root table row, the paragraph under it, and the "two limits" prose. All four re-measured together.packages/lint/scripts/check-doc-formula-expressions.mjsstill said a faulting field-levelvisibleWhenis simply fail-OPEN. Under a scope-publishing host it RESOLVES instead: hidden in that one form while no server-side gate evaluates a field-levelvisibleWhenat all, so every other reader still returns the value — a silent enforcement gap, the worse of the two. The fault-open leg is kept, not replaced — it is still what happens where no host publishes a scope. The verdict is untouched.Both replacement texts carry the two qualifications the correction needs, so "sections bind
current_user" cannot be misread as an authorization primitive: the binding is client-side only, and the scope belongs to the host, so it is empty on the public/f/:slugroute.Two in-place fixes named rather than left silent
Both are the same defect class in the same declared files, with the correct form pinned by #13074's landed text:
/forms/:nameas unbound. That route renders insideInternalFormRoute, which publishes the session principal and binds normally — only the public/f/:slugis mounted outside any provider. The same stale half appeared in layout-dsl.mdx's caveat paragraph. Both corrected.record/previous/parent— true, and it keeps the lint refusal's grounding intact without straying into Three more consumers of the "nocurrent_userat section level" claim go stale the moment #12914 lands — one of them is a live runtime detector, not prose #13072's section 1, which isdomain:engineand untouched here.The epilogue is now pinned, and the pin is proven able to fail
The epilogue was a plain string nobody read: deleting the re-measured clause broke no assertion and turned no gate red — exactly how the stale claim outlived its sibling. A
--self-testcase now asserts both outcomes plus the surviving fault-open leg. It scopes itself to the real epilogue vialastIndexOf, so it cannot satisfy itself from its own literal, and it pins the extension-lesssectionFieldsspelling that #5017's receiver scan requires of a string.Ablation (implementation committed first; mutation confirmed on disk by grep counts, not by an exit code):
No build/dist is involved — the gate runs from source — so no rebuild leg applies.
Gates — union re-run at
8ae8385bf, verdict lines quotedAlso green:
check:doc-authoring,check:doc-anchors,check:docs-single-h1,check:doc-security-posture,check:docs(spec),check:yaml-examples,check:docs-audit-scope,check:docs-redirects,check:published-files,check:published-readme-links,check:react-page-adapter-contract,check:slot-lookup,check:page-declaration-shape,check:keyed-text-bounds,check:cross-package-test-inputs,check:test-source-alias,check:type-source-resolution,check:undeclared-dep-imports,check:changeset-gate-self-tests,check:objectui-changeset,check:pm-half-states,check-doc-frontmatter,check-docs-section-name,check-doc-route-spelling,check-comment-mask-adoption,check-section-landing-index,check-plugin-teardown-shape,check-ci-filter-parity,check-empty-changeset,check-changeset-no-major,check-adr-0087-registration,release-rehearsal-clone --self-test.Both convention-triggered obligations for editing a gate script ran green:
bare-root-worklist.mjs --self-test(51 live rows, none stale/missing/contradicted) andcheck:pm-dispatch-gates(976 cases).NOT MEASURED, neither red nor green:
check-test-completeness.mjsandscripts/pm/check-half-states.mjsboth exit 3 — this container has no realGITHUB_TOKEN, so nothing was swept.check:role-wordwent red on the first pass and the fix is mine, not a baseline change: my replacement prose used the ADR-0090 D3 reserved word. Reworded tocurrent_user.positions, which is what these predicates actually test. The shrink-only baseline is untouched.Note for review:
pnpm lint(repo-wide ESLint) was not run locally. The diff is two.mdxfiles, one.mjsgate script and one changeset; CI runs the farm regardless.Generated by Claude Code