Skip to content

feat(lint): bidirectional binding-root check for visibility predicates (ADR-0089 D3b)#2931

Merged
os-zhuang merged 1 commit into
mainfrom
claude/adr-0089-visibility-schema-q7gz10
Jul 14, 2026
Merged

feat(lint): bidirectional binding-root check for visibility predicates (ADR-0089 D3b)#2931
os-zhuang merged 1 commit into
mainfrom
claude/adr-0089-visibility-schema-q7gz10

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Follow-up to #2900 (ADR-0089), addressing the remaining gap in D3b (#2903).

Context — what was already done vs. what this adds

The D3b lint rule (validate-visibility-predicates) already landed with #2900: it flags deprecated visibleOn / visibility aliases (with an autofix-grade rename hint) and mis-layered binding roots, is wired into os validate / compile, and is tested. A repo-wide sweep of packages/ + examples/ is already clean (the #2900 codemod normalized all first-party sources).

The one genuine gap: ADR-0089 D3 specifies the binding-root check in both directions —

a predicate whose binding root does not match its layer (data. in a runtime form predicate, or record. in a metadata form predicate)

— but the rule only implemented the runtime direction (data. on a *.view.ts / *.page.ts surface). This PR adds the metadata direction.

Changes

  • validateVisibilityPredicates(stack, { layer }) gains an optional layer option:
    • 'runtime' (default, behavior unchanged) — flags a data.-rooted predicate on a runtime view/page surface.
    • 'metadata' — flags a record.-rooted predicate on a *.form.ts metadata-editing form (which binds data, the row under edit).
  • The root matcher is generalized to any leading identifier (still excludes nested accesses like foo.data / my_record.x); the message + hint are driven from a per-layer table.
  • Exports VisibilityLayer / VisibilityOptions.

Back-compat

Fully back-compat. The os validate / compile call sites pass a single argument and keep the 'runtime' default — correct for app views/pages, which are always runtime surfaces. The 'metadata' layer is opt-in for a caller that knows it is linting a *.form.ts.

Tests

Adds a metadata layer describe block covering: record. flagged, canonical data. clean, the runtime/metadata directions being opposites, the alias check staying layer-agnostic, and the my_record.x false-positive guard. Full @objectstack/lint suite green (204 passed, 2 skipped); tsc --noEmit clean. Includes a minor changeset.

Follow-ups (not in this PR)

Related: closes part of #2903 · parent #2642 · sibling #2904 (objectui renderers, already merged via objectstack-ai/objectui#2490).

🤖 Generated with Claude Code

https://claude.ai/code/session_01R7oGohmS4pT9H73zoV6Jdb


Generated by Claude Code

…s (ADR-0089 D3b)

The `visibility-root-mislayered` rule only flagged the runtime direction
(`data.` root on a `*.view.ts` / `*.page.ts` surface). ADR-0089 D3 spells
out the check in both directions, so make it layer-aware:

- `validateVisibilityPredicates(stack, { layer })` gains an optional layer.
  `'runtime'` (default) is unchanged; `'metadata'` flags a `record.`-rooted
  predicate on a `*.form.ts` metadata-editing form (which binds `data`).
- Generalize the root matcher to any leading identifier and drive the
  message/hint from a per-layer table.
- Export `VisibilityLayer` / `VisibilityOptions`.

Back-compat: the single-argument `os validate` / `compile` call sites keep
runtime behavior. Adds metadata-direction tests; full lint suite green
(204 passed), tsc clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R7oGohmS4pT9H73zoV6Jdb
@vercel

vercel Bot commented Jul 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 14, 2026 4:03pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/m labels Jul 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/lint.

1 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/permissions/authorization.mdx (via @objectstack/lint)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang os-zhuang marked this pull request as ready for review July 14, 2026 16:14
@os-zhuang os-zhuang merged commit 891ea81 into main Jul 14, 2026
16 checks passed
@os-zhuang os-zhuang deleted the claude/adr-0089-visibility-schema-q7gz10 branch July 14, 2026 16:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants