You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: address CI findings on the reference-integrity rules (#3583)
- Raw NUL byte in the hook-dedup key (validate-expressions.ts) tripped
`check:nul-bytes`. A raw NUL makes grep/ripgrep treat the whole file
as binary and silently return zero matches, so the file drops out of
code search and every grep-based lint. Written as the \u0000 escape
per the repo convention — byte-identical at runtime.
- CodeQL (high): the `{…}` interpolation test used /\{[^}]+\}/, which
backtracks quadratically on a long run of `{` with no closing brace.
Replaced with a linear two-index scan; same semantics, including the
"at least one character between the braces" rule.
- spec public API gained 6 exports (the platform-object registry), so
the api-surface snapshot needed regenerating. 0 breaking, 6 added.
Also wire the two rules into `os compile` alongside `validate`/`lint`.
Every sibling reference rule (widget bindings, dashboard action refs,
filter tokens) already runs there, so leaving these out would recreate
the exact validate/lint/compile wiring drift the assessment flagged.
Document the new checks in docs/deployment/validating-metadata.mdx —
a "Dangling object and action names" section with the resolvability
severity table, plus the entry-points row.
Suites: lint 390, spec 6669, cli 636 passing; eslint, nul-bytes and
api-surface checks clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBks5G7AkwrvgF2kL5rfkT
Severity follows **resolvability**, because "this might be provided by another
106
+
installed package" is a real possibility that must not be guessed at:
107
+
108
+
| The name… | Result |
109
+
|---|---|
110
+
| resolves to one of your own objects | ✓ |
111
+
| is unresolved and carries no platform prefix |**error** — your objects are namespace-prefixed and present in the stack, so there is no legitimate elsewhere. This is the typo class (`user` for `sys_user`). |
112
+
| resolves to a known platform / plugin / cloud object | ✓ |
113
+
| carries a platform prefix but no known package registers it |**warning** — a third-party package may still provide it, so this stays advisory |
114
+
115
+
Interpolated targets (`${…}`, `{…}`) are skipped — they resolve at render time.
116
+
Action names get no third-party softening: the runtime ships no built-in action
117
+
names, so a name resolving nowhere is always an **error**.
118
+
86
119
## The one gate, two entry points
87
120
88
121
`os validate` and `os build` (alias of `os compile`) run the **same** validator:
@@ -93,6 +126,7 @@ whose `objects/reports/dashboards/pages/views` route is unregistered is **warned
0 commit comments