@objectstack/lint 17.0.0-rc.5 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Manifest } from '@objectstack/sdui-parser';
2
2
  import { Options } from 'ajv';
3
- import { AccessMatrix } from '@objectstack/spec/security';
4
- export { A as AUTHORING_COMMANDS, a as AUTHORING_RULES, b as AUTHORING_SURFACES, c as AuthoringCommand, d as AuthoringFinding, e as AuthoringRule, f as AuthoringRuleContext, g as AuthoringRuleInputTier, h as AuthoringRuleRun, i as AuthoringRuleTier, j as AuthoringSeverity, k as AuthoringSurface, E as EXPRESSION_INVALID, R as RuntimeGateResult, l as RuntimeStackContext, m as authoringRulesFor, r as runAuthoringRules, n as runRuntimeAuthoringRules, o as runtimeAuthoringRulesFor, p as runtimeGatedTypes, s as splitBySeverity, q as stackKeyForType } from './runtime-Cs64ShwN.cjs';
3
+ import { AccessMatrixParsed } from '@objectstack/spec/security';
4
+ export { A as AUTHORING_COMMANDS, a as AUTHORING_RULES, b as AUTHORING_SURFACES, c as AuthoringCommand, d as AuthoringFinding, e as AuthoringRule, f as AuthoringRuleContext, g as AuthoringRuleInputTier, h as AuthoringRuleRun, i as AuthoringRuleTier, j as AuthoringSeverity, k as AuthoringSurface, E as EXPRESSION_INVALID, R as RuntimeGateResult, l as RuntimeStackContext, m as authoringRulesFor, n as buildRuntimeWriteSnapshots, r as runAuthoringRules, o as runRuntimeAuthoringRules, p as runtimeAuthoringRulesFor, q as runtimeGatedTypes, s as splitBySeverity, t as stackKeyForType } from './runtime-H-nDodRy.cjs';
5
5
 
6
6
  /**
7
7
  * Build-time dashboard widget binding diagnostics (issues #1719, #1721).
@@ -68,6 +68,14 @@ export { A as AUTHORING_COMMANDS, a as AUTHORING_RULES, b as AUTHORING_SURFACES,
68
68
  * single-form cutover removed. The dashboard renderer routes dataset-bound
69
69
  * widgets through `DatasetWidget` and never reads these, so they are a
70
70
  * silent no-op. Steers the author onto `dataset`+`dimensions`+`values`.
71
+ * - `dashboard-filter-field-unprovisioned` (#8340) — the filter's effective
72
+ * field RESOLVES (it is a registry-injected system column, so
73
+ * `dashboard-filter-field-unknown` above rightly stays silent) but the bound
74
+ * object is ADR-0015 `external`, where the platform registers the anchor and
75
+ * provisions no storage for it. The filter is still ANDed into the query, so
76
+ * the widget renders empty instead of crashing — the silent-degradation half
77
+ * of the same invariant, warned rather than errored because this pass cannot
78
+ * see the remote schema (#8116's severity reasoning).
71
79
  *
72
80
  * Warnings can be deliberately suppressed per widget via
73
81
  * `suppressWarnings: ['<rule-id>']`; errors cannot — they describe a
@@ -83,6 +91,7 @@ declare const MEASURE_AGGREGATE_INCOHERENT = "measure-aggregate-incoherent";
83
91
  declare const WIDGET_LEGACY_ANALYTICS_SHAPE = "widget-legacy-analytics-shape";
84
92
  declare const WIDGET_LEGACY_ANALYTICS_UNRENDERABLE = "widget-legacy-analytics-unrenderable";
85
93
  declare const DASHBOARD_FILTER_FIELD_UNKNOWN = "dashboard-filter-field-unknown";
94
+ declare const DASHBOARD_FILTER_FIELD_UNPROVISIONED = "dashboard-filter-field-unprovisioned";
86
95
  type WidgetBindingSeverity = 'error' | 'warning';
87
96
  interface WidgetBindingFinding {
88
97
  /** `error` = unresolvable binding (broken page); `warning` = advisory. */
@@ -98,7 +107,7 @@ interface WidgetBindingFinding {
98
107
  /** How to fix (or deliberately suppress) it. */
99
108
  hint: string;
100
109
  }
101
- type AnyRec$E = Record<string, unknown>;
110
+ type AnyRec$F = Record<string, unknown>;
102
111
  /**
103
112
  * Validate every dashboard widget's dataset binding. Returns the list of
104
113
  * findings (empty = clean). Caller decides how to surface them: `error`
@@ -106,7 +115,7 @@ type AnyRec$E = Record<string, unknown>;
106
115
  * should fail validate/build; `warning` findings are advisory and must
107
116
  * never fail the build on their own.
108
117
  */
109
- declare function validateWidgetBindings(stack: AnyRec$E): WidgetBindingFinding[];
118
+ declare function validateWidgetBindings(stack: AnyRec$F): WidgetBindingFinding[];
110
119
 
111
120
  interface ExprIssue {
112
121
  where: string;
@@ -119,12 +128,12 @@ interface ExprIssue {
119
128
  */
120
129
  severity?: 'error' | 'warning';
121
130
  }
122
- type AnyRec$D = Record<string, unknown>;
131
+ type AnyRec$E = Record<string, unknown>;
123
132
  /**
124
133
  * Validate every predicate in the stack. Returns the list of issues (empty =
125
134
  * clean). Caller decides how to surface / whether to fail the build.
126
135
  */
127
- declare function validateStackExpressions(stack: AnyRec$D): ExprIssue[];
136
+ declare function validateStackExpressions(stack: AnyRec$E): ExprIssue[];
128
137
 
129
138
  /**
130
139
  * The corrective sentence, lifted **verbatim** from `unevaluableRuleError` in
@@ -204,6 +213,95 @@ type NullGuardOutcome =
204
213
  */
205
214
  declare function nullGuardMessage(subject: string, objectName: string | undefined, finding: NullGuardFinding, outcome?: NullGuardOutcome): string;
206
215
 
216
+ /**
217
+ * A verdict about an open capability vocabulary, recorded during a phase in
218
+ * which a plugin can still contribute to it.
219
+ */
220
+ declare const STARTUP_OPEN_VOCABULARY_VERDICT = "startup-open-vocabulary-verdict";
221
+ /**
222
+ * The diagnostic at such a site asserts a terminal outcome about a world that
223
+ * has not finished forming. Emitted only where
224
+ * {@link STARTUP_OPEN_VOCABULARY_VERDICT} already fired.
225
+ */
226
+ declare const STARTUP_VERDICT_ASSERTIVE_WORDING = "startup-verdict-assertive-wording";
227
+ /**
228
+ * Accessors that read a capability vocabulary a plugin can still extend.
229
+ *
230
+ * Each entry names WHY the answer is not final; the note travels into the
231
+ * finding so the author reads the consequence rather than a rule id.
232
+ *
233
+ * Matched on the accessor NAME rather than on a `this.<registry>` property,
234
+ * which is what lets a consumer in another package be seen at all — the CI
235
+ * gate's Rule B is keyed on the two property names the owning class uses, so a
236
+ * caller that reaches the same vocabulary through its public accessor is
237
+ * invisible to it. Keyed lookups that ask about ONE item and dispatch on the
238
+ * answer (`registry.get(type)`, `registry.has(type)`) are deliberately absent:
239
+ * that is how the runtime legitimately resolves work, and reading it as a
240
+ * startup verdict is exactly the false-positive class that gets a rule switched
241
+ * off.
242
+ */
243
+ declare const OPEN_VOCABULARY_PROBES: ReadonlyMap<string, string>;
244
+ /**
245
+ * Lifecycle phases that run BEFORE the vocabulary can be considered closed, with
246
+ * the reason each one is still open.
247
+ *
248
+ * `start` is the phase this rule exists for. The CI gate stops at `init`, on the
249
+ * sound reasoning that every plugin's `init()` has completed by then — true of
250
+ * the SERVICE registry, and false of an open capability vocabulary: ADR-0018
251
+ * executors are registered from `start()` too, and sibling plugins' `start()`
252
+ * have not all run. That is literally where #4771 sat.
253
+ */
254
+ declare const PRE_SEAL_PHASES: ReadonlyMap<string, string>;
255
+ /**
256
+ * Identifier fragments whose presence in the scope means the code ASKED whether
257
+ * the vocabulary is closed before judging it — the third sanctioned cure.
258
+ * Matched as a case-insensitive substring of an identifier so
259
+ * `nodeTypeVocabularySealed`, `sealNodeTypeVocabulary` and a host's own
260
+ * `vocabularySeal` all count.
261
+ */
262
+ declare const SEAL_MARKERS: readonly string[];
263
+ type StartupRegistryVerdictSeverity = 'warning';
264
+ interface StartupRegistryVerdictFinding {
265
+ /** Always `warning` — this rule advises, it never gates (see module note). */
266
+ severity: StartupRegistryVerdictSeverity;
267
+ /** Diagnostic rule id. */
268
+ rule: string;
269
+ /** Human-readable location, e.g. `AutomationServicePlugin.start()`. */
270
+ where: string;
271
+ /** Source path, e.g. `plugin.ts:412`. */
272
+ path: string;
273
+ /** What is wrong. */
274
+ message: string;
275
+ /** How to fix it. */
276
+ hint: string;
277
+ }
278
+ /**
279
+ * The prescription every finding carries. It names the three cures in the order
280
+ * AGENTS.md ranks them, and each by the change that actually shipped, so the
281
+ * reader can go and read one.
282
+ *
283
+ * It states no verdict of its own about whether the site is broken at runtime —
284
+ * asserting a terminal outcome about a world that has not finished forming is
285
+ * the mistake this rule exists to remove, and a hint that did it would be the
286
+ * defect wearing the rule's own badge.
287
+ */
288
+ declare const STARTUP_VERDICT_HINT: string;
289
+ interface StartupRegistryVerdictOptions {
290
+ /**
291
+ * Label for the source under check — a path, a package name, whatever the
292
+ * caller can point at. Prefixes every finding's `path`.
293
+ */
294
+ file?: string;
295
+ }
296
+ /**
297
+ * Find startup open-vocabulary verdicts in one TypeScript/JavaScript source.
298
+ *
299
+ * Pure: parses, never executes, never type-checks, touches no filesystem. An
300
+ * unparseable source yields no findings rather than throwing — this advises on
301
+ * source someone else owns, and refusing to parse is not a verdict about them.
302
+ */
303
+ declare function findStartupRegistryVerdicts(source: string, options?: StartupRegistryVerdictOptions): StartupRegistryVerdictFinding[];
304
+
207
305
  type ListViewModeSeverity = 'error' | 'warning';
208
306
  interface ListViewModeFinding {
209
307
  severity: ListViewModeSeverity;
@@ -216,7 +314,7 @@ interface ListViewModeFinding {
216
314
  hint: string;
217
315
  }
218
316
  declare const LIST_VIEW_FILTERS_IN_VIEWS_MODE = "list-view-filters-in-views-mode";
219
- type AnyRec$C = Record<string, unknown>;
317
+ type AnyRec$D = Record<string, unknown>;
220
318
  /**
221
319
  * Flag ADR-0047 "views" mode violations on an object's built-in named views or a
222
320
  * `defineView` default `list` / named `listViews`: `quickFilters`, or a `tabs`
@@ -226,7 +324,7 @@ type AnyRec$C = Record<string, unknown>;
226
324
  *
227
325
  * Feed the PRE-parse stack (normalizeStackInput output) — see file header.
228
326
  */
229
- declare function validateListViewMode(stack: AnyRec$C): ListViewModeFinding[];
327
+ declare function validateListViewMode(stack: AnyRec$D): ListViewModeFinding[];
230
328
 
231
329
  type FunctionalCompletenessSeverity = 'error' | 'warning';
232
330
  interface FunctionalCompletenessFinding {
@@ -246,6 +344,37 @@ interface FunctionalCompletenessFinding {
246
344
  */
247
345
  declare function validateFunctionalCompleteness(stack: unknown): FunctionalCompletenessFinding[];
248
346
 
347
+ /**
348
+ * Stable diagnostic id. Named for the CONTRADICTION rather than for the strip,
349
+ * because at authoring time nothing has been stripped yet — the declaration is
350
+ * simply advertising something the object cannot honour.
351
+ */
352
+ declare const MANAGED_API_METHOD_UNAFFORDABLE = "object/managed-api-method-unaffordable";
353
+ interface ManagedApiMethodFinding {
354
+ /**
355
+ * Always `error`. The contradiction is decidable from the object's own
356
+ * declaration — no call graph, no runtime state — and shipping it means the
357
+ * metadata claims an API surface the registry will silently take away.
358
+ */
359
+ severity: 'error';
360
+ rule: typeof MANAGED_API_METHOD_UNAFFORDABLE;
361
+ /** Human-readable location, e.g. `object "sys_environment"`. */
362
+ where: string;
363
+ /** Config path, e.g. `objects[2].enable.apiMethods`. */
364
+ path: string;
365
+ message: string;
366
+ hint: string;
367
+ }
368
+ /**
369
+ * Walk every object declaration in the stack through the shared
370
+ * managed-affordance predicate.
371
+ *
372
+ * One finding per object, not per verb: an object declaring both `create` and
373
+ * `update` against an all-locked bucket has ONE authoring mistake, and the fix
374
+ * — open the affordances or drop the verbs — is a single edit.
375
+ */
376
+ declare function validateManagedApiMethods(stack: unknown): ManagedApiMethodFinding[];
377
+
249
378
  type FlowTriggerReadinessSeverity = 'error' | 'warning';
250
379
  interface FlowTriggerReadinessFinding {
251
380
  severity: FlowTriggerReadinessSeverity;
@@ -287,7 +416,30 @@ declare const FLOW_TIME_RELATIVE_DESCRIPTOR_INVALID = "flow-time-relative-descri
287
416
  * there is no runtime channel at all for it to be moved earlier from.
288
417
  */
289
418
  declare const FLOW_TIME_RELATIVE_DESCRIPTOR_UNROUTABLE = "flow-time-relative-descriptor-unroutable";
290
- type AnyRec$B = Record<string, unknown>;
419
+ /**
420
+ * #6637 — a `type: 'record_change'` flow whose start-node `triggerType` the
421
+ * engine routes to NO trigger at all, so the flow is silently demoted to a
422
+ * manual one. Widened by #7215 to also cover the token being ABSENT
423
+ * entirely — the omission shape is exactly as dead at runtime as the
424
+ * contradiction shape this id originally caught, so one id and one severity
425
+ * cover both (see 1f for the history of why the widening waited).
426
+ *
427
+ * A separate id from `flow-trigger-unknown-event`, on the same distinction that
428
+ * separates the two `timeRelative` ids: whether the engine ROUTES the value.
429
+ * The two partition the declared-but-dead tokens and can never both fire on one
430
+ * value, because being `record-`-prefixed is exactly what routes a token:
431
+ *
432
+ * - `record-`-prefixed but off-grammar (`record-after-updated`) — the engine
433
+ * ROUTES it to the record-change trigger, which maps it to zero hook events
434
+ * and says so in a bind-time warn. That is `…-UNKNOWN-EVENT`, and this rule
435
+ * file moves that warn earlier.
436
+ * - anything else (`onCreate`, `on_update`, `''`, `['onCreate']`, or the key
437
+ * absent entirely) — the engine routes it NOWHERE. That is this id, and
438
+ * there is no runtime channel to move earlier from: see 1f for the three
439
+ * call sites that each skip it.
440
+ */
441
+ declare const FLOW_TRIGGER_UNROUTABLE = "flow-trigger-unroutable";
442
+ type AnyRec$C = Record<string, unknown>;
291
443
  /**
292
444
  * Validate auto-launched flow trigger wiring against the stack definition.
293
445
  *
@@ -296,7 +448,7 @@ type AnyRec$B = Record<string, unknown>;
296
448
  * owns the `timeRelative` descriptor's contract, which is the point: the rule
297
449
  * ASKS that schema rather than restating it.
298
450
  */
299
- declare function validateFlowTriggerReadiness(stack: AnyRec$B): FlowTriggerReadinessFinding[];
451
+ declare function validateFlowTriggerReadiness(stack: AnyRec$C): FlowTriggerReadinessFinding[];
300
452
 
301
453
  type FlowTemplatePathSeverity = 'error' | 'warning';
302
454
  interface FlowTemplatePathFinding {
@@ -311,12 +463,13 @@ interface FlowTemplatePathFinding {
311
463
  }
312
464
  declare const FLOW_TEMPLATE_UNKNOWN_FIELD = "flow-template-unknown-field";
313
465
  declare const FLOW_TEMPLATE_LOOKUP_TRAVERSAL = "flow-template-lookup-traversal";
314
- type AnyRec$A = Record<string, unknown>;
466
+ declare const FLOW_TEMPLATE_FIELD_UNPROVISIONED = "flow-template-field-unprovisioned";
467
+ type AnyRec$B = Record<string, unknown>;
315
468
  /**
316
469
  * Validate `{record.<path>}` template references across every record-change
317
470
  * flow. Pure and dependency-free; safe on pre- or post-parse stacks.
318
471
  */
319
- declare function validateFlowTemplatePaths(stack: AnyRec$A): FlowTemplatePathFinding[];
472
+ declare function validateFlowTemplatePaths(stack: AnyRec$B): FlowTemplatePathFinding[];
320
473
 
321
474
  type ReadonlyFlowWriteSeverity = 'error' | 'warning';
322
475
  interface ReadonlyFlowWriteFinding {
@@ -331,12 +484,12 @@ interface ReadonlyFlowWriteFinding {
331
484
  }
332
485
  declare const FLOW_UPDATE_READONLY_FIELD = "flow-update-readonly-field";
333
486
  declare const FLOW_UPDATE_READONLY_WHEN_FIELD = "flow-update-readonly-when-field";
334
- type AnyRec$z = Record<string, unknown>;
487
+ type AnyRec$A = Record<string, unknown>;
335
488
  /**
336
489
  * Validate flow `update_record` writes against target-object readonly
337
490
  * declarations. Pure and dependency-free; safe on pre- or post-parse stacks.
338
491
  */
339
- declare function validateReadonlyFlowWrites(stack: AnyRec$z): ReadonlyFlowWriteFinding[];
492
+ declare function validateReadonlyFlowWrites(stack: AnyRec$A): ReadonlyFlowWriteFinding[];
340
493
 
341
494
  type ViewContainerSeverity = 'error' | 'warning';
342
495
  interface ViewContainerFinding {
@@ -373,14 +526,14 @@ declare const STYLE_CLASSNAME_TAILWIND = "style-classname-tailwind";
373
526
  declare const STYLE_RESPONSIVE_NO_BASE = "style-responsive-no-base";
374
527
  declare const STYLE_UNKNOWN_CSS_PROPERTY = "style-unknown-css-property";
375
528
  declare const STYLE_UNKNOWN_TOKEN = "style-unknown-token";
376
- type AnyRec$y = Record<string, unknown>;
529
+ type AnyRec$z = Record<string, unknown>;
377
530
  /**
378
531
  * Validate every page's component tree for SDUI styling correctness (ADR-0065).
379
532
  * Returns findings (empty = clean). `error` findings describe styles that are
380
533
  * silently dropped and should fail validate/build; `warning` findings are
381
534
  * advisory (typos, drift, footguns).
382
535
  */
383
- declare function validateResponsiveStyles(stack: AnyRec$y): StyleFinding[];
536
+ declare function validateResponsiveStyles(stack: AnyRec$z): StyleFinding[];
384
537
 
385
538
  type JsxPageSeverity = 'error' | 'warning';
386
539
  interface JsxPageFinding {
@@ -393,8 +546,8 @@ interface JsxPageFinding {
393
546
  message: string;
394
547
  hint: string;
395
548
  }
396
- type AnyRec$x = Record<string, unknown>;
397
- declare function validateJsxPages(stack: AnyRec$x, opts?: {
549
+ type AnyRec$y = Record<string, unknown>;
550
+ declare function validateJsxPages(stack: AnyRec$y, opts?: {
398
551
  manifest?: Manifest;
399
552
  }): JsxPageFinding[];
400
553
 
@@ -407,8 +560,8 @@ interface ReactPageFinding {
407
560
  message: string;
408
561
  hint: string;
409
562
  }
410
- type AnyRec$w = Record<string, unknown>;
411
- declare function validateReactPages(stack: AnyRec$w): ReactPageFinding[];
563
+ type AnyRec$x = Record<string, unknown>;
564
+ declare function validateReactPages(stack: AnyRec$x): ReactPageFinding[];
412
565
 
413
566
  type ReactPropSeverity = 'error' | 'warning';
414
567
  interface ReactPropFinding {
@@ -419,13 +572,14 @@ interface ReactPropFinding {
419
572
  message: string;
420
573
  hint: string;
421
574
  }
422
- type AnyRec$v = Record<string, unknown>;
575
+ type AnyRec$w = Record<string, unknown>;
423
576
  declare const REACT_CHART_FIELD_UNKNOWN = "react-chart-field-unknown";
577
+ declare const REACT_CHART_FIELD_UNPROVISIONED = "react-chart-field-unprovisioned";
424
578
  declare const REACT_CHART_AGGREGATE_INVALID = "react-chart-aggregate-invalid";
425
579
  declare const REACT_CHART_AXIS_UNKNOWN = "react-chart-axis-unknown";
426
580
  declare const REACT_CHART_DRILLDOWN_INVALID = "react-chart-drilldown-invalid";
427
581
  declare const REACT_BLOCK_NEEDS_RECORD_CONTEXT = "react-block-needs-record-context";
428
- declare function validateReactPageProps(stack: AnyRec$v): ReactPropFinding[];
582
+ declare function validateReactPageProps(stack: AnyRec$w): ReactPropFinding[];
429
583
 
430
584
  type SourceStyleSeverity = 'error' | 'warning';
431
585
  interface SourceStyleFinding {
@@ -437,8 +591,8 @@ interface SourceStyleFinding {
437
591
  hint: string;
438
592
  }
439
593
  declare const PAGE_SOURCE_CLASSNAME = "page-source-className-tailwind";
440
- type AnyRec$u = Record<string, unknown>;
441
- declare function validatePageSourceStyling(stack: AnyRec$u): SourceStyleFinding[];
594
+ type AnyRec$v = Record<string, unknown>;
595
+ declare function validatePageSourceStyling(stack: AnyRec$v): SourceStyleFinding[];
442
596
 
443
597
  /**
444
598
  * Build-time record-title diagnostics (ADR-0079).
@@ -482,19 +636,20 @@ interface RecordTitleFinding {
482
636
  /** How to fix it. */
483
637
  hint: string;
484
638
  }
485
- type AnyRec$t = Record<string, unknown>;
639
+ type AnyRec$u = Record<string, unknown>;
486
640
  /**
487
641
  * Validate every object's record-title declaration. Returns the list of
488
642
  * findings (empty = clean). Both rules are advisory (`warning`): the caller
489
643
  * must never fail the build on them alone — auto-provision + the `Record #<id>`
490
644
  * floor guarantee a resolvable title at runtime.
491
645
  */
492
- declare function validateRecordTitle(stack: AnyRec$t): RecordTitleFinding[];
646
+ declare function validateRecordTitle(stack: AnyRec$u): RecordTitleFinding[];
493
647
 
494
648
  declare const FIELD_GROUP_UNDECLARED = "field-group-undeclared";
495
649
  declare const FIELD_GROUP_EMPTY = "field-group-empty";
496
650
  declare const FIELD_GROUP_SHADOWED = "field-group-shadowed";
497
651
  declare const SEMANTIC_ROLE_FIELD_UNKNOWN = "semantic-role-field-unknown";
652
+ declare const SEMANTIC_ROLE_FIELD_UNPROVISIONED = "semantic-role-field-unprovisioned";
498
653
  type SemanticRoleSeverity = 'error' | 'warning';
499
654
  interface SemanticRoleFinding {
500
655
  /** Always `warning` today — all three rules are advisory (see module note). */
@@ -510,38 +665,14 @@ interface SemanticRoleFinding {
510
665
  /** How to fix it. */
511
666
  hint: string;
512
667
  }
513
- type AnyRec$s = Record<string, unknown>;
668
+ type AnyRec$t = Record<string, unknown>;
514
669
  /**
515
670
  * Validate every object's semantic-role pointers. Returns the list of
516
671
  * findings (empty = clean). Advisory only — the caller must never fail the
517
672
  * build on these alone.
518
673
  */
519
- declare function validateSemanticRoles(stack: AnyRec$s): SemanticRoleFinding[];
674
+ declare function validateSemanticRoles(stack: AnyRec$t): SemanticRoleFinding[];
520
675
 
521
- /**
522
- * Build-time form-layout diagnostics (#2578).
523
- *
524
- * Authored form views carry field references and column-layout hints that are
525
- * Zod-valid but can be silently wrong at render time — the "parsed, unmarked,
526
- * silently inert" shape ADR-0078 prohibits. This lint catches the two that
527
- * matter for multi-column, AI-authored forms, uniformly for `os build` /
528
- * `os validate`, MCP authoring and hand authors (ADR-0019).
529
- *
530
- * Both rules are warnings, not errors — nothing is fully broken (an unknown
531
- * field name is skipped; an over-wide colSpan is clamped) — but each is almost
532
- * certainly an authoring mistake worth surfacing at author time:
533
- *
534
- * - `form-field-unknown` — a section references a field that is not on the
535
- * form's bound object, so the field silently does not render.
536
- * - `absolute-colspan-discouraged` — a field uses the absolute `colSpan`. Under
537
- * a per-surface DERIVED column count (mobile 1 / modal 2 / page 3-4) a fixed
538
- * span only lines up at the one width the author imagined; the renderer
539
- * clamps it. The robust primitive is the relative `span: 'full'`.
540
- *
541
- * Scope: top-level form `views` (a `sections` array). Forms embedded inside
542
- * page component trees are a follow-up — the walker deliberately stays shallow
543
- * so it never guesses at an arbitrary component's object binding.
544
- */
545
676
  declare const FORM_FIELD_UNKNOWN = "form-field-unknown";
546
677
  declare const FORM_COLSPAN_ABSOLUTE = "absolute-colspan-discouraged";
547
678
  type FormLayoutSeverity = 'error' | 'warning';
@@ -550,72 +681,66 @@ interface FormLayoutFinding {
550
681
  severity: FormLayoutSeverity;
551
682
  /** Diagnostic rule id, e.g. `form-field-unknown`. */
552
683
  rule: string;
553
- /** Human-readable location, e.g. `view "contract_form"`. */
684
+ /** Human-readable location, e.g. `view "contract_form" · formViews.create`. */
554
685
  where: string;
555
- /** Config path, e.g. `views[2].sections[0].fields[3]`. */
686
+ /** Config path, e.g. `views[2].formViews.create.sections[0].fields[3]`. */
556
687
  path: string;
557
688
  /** What is wrong. */
558
689
  message: string;
559
690
  /** How to fix it. */
560
691
  hint: string;
561
692
  }
562
- type AnyRec$r = Record<string, unknown>;
693
+ type AnyRec$s = Record<string, unknown>;
563
694
  /**
564
695
  * Validate authored form-view layout. Returns findings (empty = clean).
565
696
  * Advisory only — the caller must never fail the build on these alone.
566
697
  */
567
- declare function validateFormLayout(stack: AnyRec$r): FormLayoutFinding[];
568
-
569
- /**
570
- * Build-time conditional-visibility diagnostics (ADR-0089 D3b).
571
- *
572
- * ADR-0089 unifies the conditional-visibility predicate under the single
573
- * canonical key **`visibleWhen`** across data fields, view form sections/fields,
574
- * and page components. The deprecated spellings — `visibleOn` (view form) and
575
- * `visibility` (page component) — stay accepted and are folded into `visibleWhen`
576
- * at the schema boundary (a zod `.transform()`). Because that fold happens during
577
- * `parse()`, the aliases are gone from the *parsed* stack — so this rule runs on
578
- * the **pre-parse** (normalized) stack, exactly like `validate-list-view-mode`,
579
- * to see what the author actually wrote.
580
- *
581
- * Two advisory rules (both `warning` — nothing is broken, the alias still works
582
- * and a mis-rooted predicate just never matches):
583
- *
584
- * - `visibility-alias-deprecated` — a `visibleOn` / `visibility` key in authored
585
- * source. Autofix intent: rename the key to `visibleWhen` (same value).
586
- * - `visibility-root-mislayered` — a visibility predicate whose binding root does
587
- * not match its layer (ADR-0089 D3, §Context). The check is **bidirectional**:
588
- * - **runtime** view/page surfaces (`*.view.ts` / `*.page.ts`) bind
589
- * `record` + `current_user` (pages also expose `page.<var>`), so a `data.`-rooted
590
- * predicate here is a wrong-layer paste that silently never matches; and
591
- * - **metadata-editing** forms (`*.form.ts` — the row under edit) bind `data`, so
592
- * a `record.`-rooted predicate there is the same bug in the other direction.
593
- * The layer is supplied by the caller (`opts.layer`, default `'runtime'`): the
594
- * app-lint path (`os validate` / `compile`) always lints runtime surfaces, while a
595
- * file-aware caller linting a `*.form.ts` passes `layer: 'metadata'`.
596
- *
597
- * Scope: `views` (form `sections` / legacy `groups`, and their `fields`) and
598
- * `pages` (`regions[].components[]`). Data-field `visibleWhen` is already covered
599
- * by `validate-expressions` and is not re-checked here.
600
- */
601
- declare const VISIBILITY_ALIAS_DEPRECATED = "visibility-alias-deprecated";
698
+ declare function validateFormLayout(stack: AnyRec$s): FormLayoutFinding[];
699
+
602
700
  declare const VISIBILITY_ROOT_MISLAYERED = "visibility-root-mislayered";
701
+ declare const VISIBILITY_BARE_IDENTIFIER = "visibility-bare-identifier";
702
+ declare const VISIBILITY_PREDICATE_SYNTAX = "visibility-predicate-syntax";
703
+ /**
704
+ * Valid CEL that overruns a `DEFAULT_LIMITS` parse bound (`maxAstNodes` 256,
705
+ * `maxDepth` 32, `maxListElements` 64, …) — #7217. A separate id from
706
+ * {@link VISIBILITY_PREDICATE_SYNTAX} for the reason `rls-predicate-over-budget`
707
+ * is a separate id from `rls-predicate-unparseable` (#6778 / PR #6831): the
708
+ * consequence is identical, the FIX is not, and `--json` consumers key on the id.
709
+ */
710
+ declare const VISIBILITY_PREDICATE_OVER_BUDGET = "visibility-predicate-over-budget";
603
711
  type VisibilitySeverity = 'error' | 'warning';
604
712
  /**
605
713
  * Which binding environment the linted surface belongs to (ADR-0089 §Context):
606
714
  * - `runtime` — `*.view.ts` / `*.page.ts`; binds `record` + `current_user` (+ `page`).
607
- * - `metadata` — `*.form.ts` metadata-editing forms; binds `data` (the row under edit).
715
+ * - `metadata` — metadata-editing forms (a `*.form.ts` module, or a form view
716
+ * declaring `data: { provider: 'schema', schemaId }`); binds `data` (the row
717
+ * under edit).
608
718
  */
609
719
  type VisibilityLayer = 'runtime' | 'metadata';
610
720
  /** Options for {@link validateVisibilityPredicates}. */
611
721
  interface VisibilityOptions {
612
- /** Binding layer of the surface being linted. Defaults to `'runtime'`. */
722
+ /**
723
+ * Binding layer for the sites whose layer the metadata does not state.
724
+ * Defaults to `'runtime'`.
725
+ *
726
+ * A form view that declares `data: { provider: 'schema', schemaId }` DOES
727
+ * state it — the metadata-admin evaluator renders that surface and binds the
728
+ * row under edit as `data` — so such a site is judged at `'metadata'`
729
+ * regardless of this option (#7815; see the module note §Which layer a site is
730
+ * on). Pass `'metadata'` to cover the forms that do not carry that data source
731
+ * either, which is what a file-aware caller linting a `*.form.ts` does.
732
+ */
613
733
  layer?: VisibilityLayer;
614
734
  }
615
735
  interface VisibilityFinding {
616
- /** Always `warning` today — both rules are advisory (see module note). */
736
+ /**
737
+ * `warning` for the ADR-0089 D3b advisory (`visibility-root-mislayered`);
738
+ * `error` for the three rules that gate — `visibility-predicate-syntax`,
739
+ * `visibility-predicate-over-budget` and `visibility-bare-identifier` (see
740
+ * module note).
741
+ */
617
742
  severity: VisibilitySeverity;
618
- /** Diagnostic rule id, e.g. `visibility-alias-deprecated`. */
743
+ /** Diagnostic rule id, e.g. `visibility-root-mislayered`. */
619
744
  rule: string;
620
745
  /** Human-readable location, e.g. `view "contact_form"`. */
621
746
  where: string;
@@ -626,22 +751,104 @@ interface VisibilityFinding {
626
751
  /** How to fix it. */
627
752
  hint: string;
628
753
  }
754
+ type AnyRec$r = Record<string, unknown>;
755
+ /**
756
+ * Validate conditional-visibility predicates across authored views and pages.
757
+ *
758
+ * Every rule here judges the predicate's **VALUE**, which survives both the
759
+ * ADR-0087 D2 alias fold and the Zod parse intact — so the registered
760
+ * `normalized` tier sees exactly what a `parsed` one would. (It is registered
761
+ * `normalized` for the tier's surviving reason, not the retired one: a
762
+ * normalized-tier finding still reaches the author when an unrelated schema
763
+ * error elsewhere would have stopped the parse. See `AuthoringRuleInputTier`.)
764
+ *
765
+ * Returns findings (empty = clean). `visibility-root-mislayered` is advisory
766
+ * (`warning`); `visibility-predicate-syntax` (#6253),
767
+ * `visibility-predicate-over-budget` (#7217) and `visibility-bare-identifier`
768
+ * (#6128) are `error` and the caller is expected to fail the build on them.
769
+ *
770
+ * The binding-root check is layer-directional (ADR-0089 D3). A form view that
771
+ * declares `data: { provider: 'schema', schemaId }` is judged at `metadata` on
772
+ * its own say-so (#7815); for every other site pass `opts.layer = 'metadata'`
773
+ * when linting a `*.form.ts` metadata-editing form (so a `record.`-rooted
774
+ * predicate is flagged), or leave it at the `'runtime'` default for `*.view.ts` /
775
+ * `*.page.ts` surfaces (so a `data.`-rooted predicate is flagged). The syntax and
776
+ * bare-identifier checks are layer-agnostic — but the ROOT their hints prescribe
777
+ * is not, which is the second half of what #7815 fixes.
778
+ */
779
+ declare function validateVisibilityPredicates(stack: AnyRec$r, opts?: VisibilityOptions): VisibilityFinding[];
780
+
781
+ declare const PREDICATE_PATH_UNRESOLVED = "predicate-path-unresolved";
782
+ declare const PREDICATE_PATH_UNROOTED = "predicate-path-unrooted";
783
+ /**
784
+ * A `==` / `!=` RIGHT-hand side that is path-shaped — an unquoted identifier
785
+ * chain (#7659). See the module note's §The right-hand side for the two
786
+ * severities this one id carries and why they are not the same defect.
787
+ */
788
+ declare const PREDICATE_RHS_PATH_SHAPED = "predicate-rhs-path-shaped";
789
+ /**
790
+ * The two path-RESOLUTION rules always GATE; {@link PREDICATE_RHS_PATH_SHAPED}
791
+ * gates on a dotted chain and is advisory on a bare word — see the module note
792
+ * for why the same shape earns two answers.
793
+ */
794
+ type PredicatePathSeverity = 'error' | 'warning';
795
+ interface PredicatePathFinding {
796
+ severity: PredicatePathSeverity;
797
+ /** Diagnostic rule id — `predicate-path-unresolved` / `predicate-path-unrooted`. */
798
+ rule: string;
799
+ /** Human-readable location, e.g. `view "object" · schema form "object"`. */
800
+ where: string;
801
+ /** Config path, e.g. `views[0].sections[1].fields[0].fields[21].visibleWhen`. */
802
+ path: string;
803
+ /** What is wrong — always names the unresolvable path. */
804
+ message: string;
805
+ /** How to fix it. */
806
+ hint: string;
807
+ }
808
+ /** Options for {@link validatePredicatePathRefs}. */
809
+ interface PredicatePathOptions {
810
+ /**
811
+ * Schema oracle: `schemaId` → the Zod schema of the row under edit. Defaults
812
+ * to the canonical `getMetadataTypeSchema` registry
813
+ * (`packages/spec/src/kernel/metadata-type-schemas.ts`), which is the same
814
+ * entry `saveMetaItem` validates against — so this rule can never disagree
815
+ * with the parse that judges the saved row. Injectable so a test can pin the
816
+ * traversal against a small schema, and so a future caller holding a richer
817
+ * registry (runtime `/meta/types`, a package-declared type) can supply it
818
+ * without this file growing a second lookup path.
819
+ */
820
+ resolveSchema?: (schemaId: string) => unknown;
821
+ }
629
822
  type AnyRec$q = Record<string, unknown>;
630
823
  /**
631
- * Validate conditional-visibility keys across authored views and pages.
824
+ * Refuse a metadata-form predicate that names a path the target schema does not
825
+ * declare (#7010).
826
+ *
827
+ * Walks `views[]` through the shared {@link formViewSites} ladder — the entry
828
+ * itself (the bare `defineForm` shape every `*.form.ts` uses), the container's
829
+ * default `form`, and each `formViews.<key>` — and judges only the sites whose
830
+ * data source is `{ provider: 'schema', schemaId }`, resolving `schemaId`
831
+ * through `opts.resolveSchema` (the canonical metadata-type registry by
832
+ * default). A site bound to an ObjectQL object, or naming a `schemaId` no schema
833
+ * resolves, is skipped: see the module note for why the `record.*` layer is out
834
+ * of scope rather than merely unimplemented.
835
+ *
836
+ * Both path-resolution rules emit `error` and the caller is expected to fail the
837
+ * build on them. The corpus measurement behind that severity is on the PR for
838
+ * #7010: over the shipped `METADATA_FORM_REGISTRY` (17 forms, 46 predicates) the
839
+ * count is **0** for both, and 16 for `predicate-path-unrooted` once #6254's
840
+ * pre-fix `object.form.ts` is restored.
841
+ *
842
+ * The third rule, `predicate-rhs-path-shaped` (#7659), asks a different question
843
+ * about the same predicates — whether a `==` / `!=` RIGHT-hand side is
844
+ * path-shaped, which the renderer parses as a literal — and carries two
845
+ * severities: `error` on a dotted chain, `warning` on a bare word. Its corpus
846
+ * count over the same shipped forms is **0** at both severities. See the module
847
+ * note.
632
848
  *
633
- * Runs on the **pre-parse** (normalized) stack so it can see the deprecated
634
- * `visibleOn` / `visibility` aliases before the schema folds them into
635
- * `visibleWhen`. Returns findings (empty = clean); all advisory (`warning`) —
636
- * the caller must never fail the build on these alone.
637
- *
638
- * The binding-root check is layer-directional (ADR-0089 D3): pass
639
- * `opts.layer = 'metadata'` when linting a `*.form.ts` metadata-editing form (so a
640
- * `record.`-rooted predicate is flagged), or leave it at the `'runtime'` default for
641
- * `*.view.ts` / `*.page.ts` surfaces (so a `data.`-rooted predicate is flagged). The
642
- * alias-deprecated check is layer-agnostic.
849
+ * Returns findings (empty = clean).
643
850
  */
644
- declare function validateVisibilityPredicates(stack: AnyRec$q, opts?: VisibilityOptions): VisibilityFinding[];
851
+ declare function validatePredicatePathRefs(stack: AnyRec$q, opts?: PredicatePathOptions): PredicatePathFinding[];
645
852
 
646
853
  declare const CAPABILITY_REFERENCE_UNKNOWN = "capability-reference-unknown";
647
854
  type CapabilityRefSeverity = 'error' | 'warning';
@@ -760,6 +967,7 @@ declare const SECURITY_MASTER_DETAIL_UNGRANTED = "security-master-detail-ungrant
760
967
  declare const SECURITY_FLS_UNQUALIFIED_KEY = "security-fls-unqualified-key";
761
968
  declare const SECURITY_GRANT_EXPIRED_AT_AUTHORING = "security-grant-expired-at-authoring";
762
969
  declare const SECURITY_DELEGATION_MISSING_REASON = "security-delegation-missing-reason";
970
+ declare const SECURITY_CBP_NO_RELATION = "security-controlled-by-parent-no-relation";
763
971
  type SecuritySeverity = 'error' | 'warning' | 'info';
764
972
  interface SecurityFinding {
765
973
  severity: SecuritySeverity;
@@ -785,6 +993,35 @@ type AnyRec$l = Record<string, unknown>;
785
993
  declare function validateSecurityPosture(stack: AnyRec$l, opts?: {
786
994
  nowMs?: number;
787
995
  }): SecurityFinding[];
996
+ /**
997
+ * [ADR-0090 D3] The `security-role-word` vocabulary freeze, as its own rule.
998
+ *
999
+ * Scope: security-relevant identifiers/labels across SIX collections — objects
1000
+ * (names, field names, action names), permission sets, positions, apps, books.
1001
+ * Pages/views/components are NOT scanned — `role` there is HTML/ARIA
1002
+ * semantics, not permission vocabulary. The sole platform exception
1003
+ * (better-auth `sys_member.role`) is a system object, which app stacks never
1004
+ * author. Books entered the security-relevant set when `book.audience` became
1005
+ * a permission-model reference (ADR-0046 §6.7 / ADR-0090).
1006
+ *
1007
+ * ## Why this is a separate function from {@link validateSecurityPosture}
1008
+ *
1009
+ * [#8310] Not taste — a surface boundary. When the rest of the D7 block
1010
+ * crossed onto the runtime publish surface (`runtimeTypes: ['seed',
1011
+ * 'permission', 'book']` — `object` measured dirty and is escalated, see the
1012
+ * registry comment), this rule could not go with it: the per-write snapshot
1013
+ * (`runtime-gate.ts`) neither carries nor maps `positions` / `apps`, both of
1014
+ * which are `allowRuntimeCreate: true` — so wiring it through the shared
1015
+ * entry would have enforced ONE rule id for a strict subset of its six
1016
+ * collections. That is the #7220 failure shape (a door that refuses a
1017
+ * permission set named `role_manager` while a position named `sales_role`
1018
+ * walks through), and
1019
+ * the registry refuses to build it in either direction. The rule therefore
1020
+ * stays behind WHOLE, on its own CLI-only registry entry, until the snapshot
1021
+ * carries `positions`/`apps` and both types are gated — at which point it
1022
+ * crosses whole, in one edit, as its own entry.
1023
+ */
1024
+ declare function validateSecurityRoleWord(stack: AnyRec$l): SecurityFinding[];
788
1025
 
789
1026
  /**
790
1027
  * [ADR-0105 D6] The two organization-axis red lines, enforced at authoring time.
@@ -923,6 +1160,8 @@ declare function validateSharingRuleEnforceability(stack: unknown): SharingRuleE
923
1160
  declare const RLS_PREDICATE_UNENFORCEABLE = "rls-predicate-unenforceable";
924
1161
  /** A predicate that does not parse as CEL even after the legacy SQL bridge. */
925
1162
  declare const RLS_PREDICATE_UNPARSEABLE = "rls-predicate-unparseable";
1163
+ /** Valid CEL that overruns a platform parse bound (`maxAstNodes`, `maxDepth`, …). */
1164
+ declare const RLS_PREDICATE_OVER_BUDGET = "rls-predicate-over-budget";
926
1165
  type RlsPredicateSeverity = 'error' | 'warning';
927
1166
  interface RlsPredicateFinding {
928
1167
  severity: RlsPredicateSeverity;
@@ -1086,13 +1325,16 @@ declare function validateDashboardActionRefs(stack: AnyRec$k): DashboardActionRe
1086
1325
  *
1087
1326
  * ## Scope — filter subtrees only
1088
1327
  *
1089
- * The walk descends into `filter` / `filters` / `runtimeFilter` subtrees and
1090
- * classifies string values inside them. It deliberately does NOT check
1091
- * navigation `recordId` / `params`, which resolve an additional vocabulary
1092
- * `AppContextSelector` ids such as `{active_package}` that is meaningless in
1093
- * a filter because filters are not evaluated with the sidebar's selector
1094
- * state. Restricting the walk keeps that legitimate usage out of the rule and
1095
- * holds false positives at zero.
1328
+ * Finding those subtrees is `filter-walk.ts`'s job since #5330 gave the same
1329
+ * traversal a second consumer; this file owns only the judgement on the strings
1330
+ * inside them. The shared walk descends into `filter` / `filters` /
1331
+ * `runtimeFilter` and deliberately does NOT check navigation `recordId` /
1332
+ * `params`, which resolve an additional vocabulary `AppContextSelector` ids
1333
+ * such as `{active_package}` that is meaningless in a filter because filters
1334
+ * are not evaluated with the sidebar's selector state. Restricting the walk
1335
+ * keeps that legitimate usage out of the rule and holds false positives at
1336
+ * zero. The seven surfaces below stay THIS rule's declaration, not the walk's:
1337
+ * a shared surface list would let another rule's widening land here silently.
1096
1338
  *
1097
1339
  * Only whole-string placeholders are considered (`'{token}'` / `'${token}'`,
1098
1340
  * anchored). A value that merely contains braces is left alone.
@@ -1122,6 +1364,35 @@ interface FilterTokenFinding {
1122
1364
  */
1123
1365
  declare function validateFilterTokens(stack: Record<string, unknown> | undefined | null): FilterTokenFinding[];
1124
1366
 
1367
+ /** A literal `$and: []` / `$or: []` / `$not: {}` — a combinator with no operands. */
1368
+ declare const FILTER_EMPTY_COMBINATOR = "filter-empty-combinator";
1369
+ /** A literal `{}` where a filter node is authored — the whole filter, or a branch. */
1370
+ declare const FILTER_EMPTY_NODE = "filter-empty-node";
1371
+ type EmptyCombinatorSeverity = 'error' | 'warning';
1372
+ interface EmptyCombinatorFinding {
1373
+ /** Always `error` — see the severity note in this module's header. */
1374
+ severity: EmptyCombinatorSeverity;
1375
+ /** Diagnostic rule id (`filter-empty-combinator` / `filter-empty-node`). */
1376
+ rule: string;
1377
+ /** Human-readable location, e.g. `dashboard "sales" · widget "my_deals"`. */
1378
+ where: string;
1379
+ /** Config path, e.g. `dashboards[0].widgets[2].filter.$or`. */
1380
+ path: string;
1381
+ /** What is wrong. */
1382
+ message: string;
1383
+ /** How to fix it. */
1384
+ hint: string;
1385
+ }
1386
+ /**
1387
+ * Reject literal empty combinators across an authored stack.
1388
+ *
1389
+ * Pure `(stack) => Finding[]`; no I/O. Tolerates both authoring tiers — a
1390
+ * filter subtree survives the Zod parse unchanged, and no filter key in the
1391
+ * spec carries a `.default({})`, so a `{}` seen here was authored, never filled
1392
+ * in by a schema.
1393
+ */
1394
+ declare function validateEmptyCombinators(stack: Record<string, unknown> | undefined | null): EmptyCombinatorFinding[];
1395
+
1125
1396
  declare const OBJECT_REFERENCE_UNKNOWN = "object-reference-unknown";
1126
1397
  declare const OBJECT_REFERENCE_UNREGISTERED_PLATFORM = "object-reference-unregistered-platform";
1127
1398
  type ObjectRefSeverity = 'error' | 'warning';
@@ -1248,6 +1519,11 @@ type NavTargetRefFinding = ReferenceIntegrityFinding;
1248
1519
  declare const NAV_TARGET_UNRESOLVED = "nav-target-unresolved";
1249
1520
  declare function validateNavTargetRefs(stack: unknown): NavTargetRefFinding[];
1250
1521
 
1522
+ type NavObjectServabilityFinding = ReferenceIntegrityFinding;
1523
+ /** Emitted when a nav entry targets an object whose `enable` block cannot serve a list. */
1524
+ declare const NAV_OBJECT_UNSERVABLE = "nav-object-unservable";
1525
+ declare function validateNavObjectServability(stack: unknown): NavObjectServabilityFinding[];
1526
+
1251
1527
  /**
1252
1528
  * [ADR-0061 — searchable set] `searchableFields` entries must name a field the
1253
1529
  * object actually has — and, on a list view, one the runtime will agree to scan.
@@ -1308,12 +1584,25 @@ declare function validateNavTargetRefs(stack: unknown): NavTargetRefFinding[];
1308
1584
  * linter, gate and engine cannot drift apart (the same one-source move
1309
1585
  * #4254 made between gate and engine).
1310
1586
  *
1311
- * The OBJECT's own `searchableFields` stays existence-only: the runtime's
1312
- * declared branch filters by existence, never by type, so a json or lookup
1313
- * column declared THERE is a choice the engine executes (a `$contains` over
1314
- * the raw column), not a 400. Flagging it would reject metadata the runtime
1315
- * accepts the false finding that makes authors stop trusting the linter
1316
- * (ADR-0072 D1).
1587
+ * 3. VIRTUALITY, on EVERY surface the object's own set included
1588
+ * (`searchable-field-unsearchable`, #6674): a `formula` entry names a real
1589
+ * field, so check 1 passes it, and the runtime's declared branch admitted
1590
+ * it verbatim but the value is computed on read with no stored column, so
1591
+ * the scan looks at nothing. Measured 0 rows on driver-memory and 0 rows
1592
+ * WITH NO ERROR on driver-sql. Since #6674 the spec resolution drops such
1593
+ * an entry and both enforcement faces refuse it by name.
1594
+ *
1595
+ * The OBJECT's own `searchableFields` stays existence-only OTHERWISE, and the
1596
+ * dividing line is STORAGE, not search quality: the runtime's declared branch
1597
+ * filters by existence and scannability, never by type taste, so a json or
1598
+ * lookup column declared THERE is a choice the engine executes (a `$contains`
1599
+ * over the stored JSON text / the stored foreign key) — narrow, rarely useful,
1600
+ * but a scan that CAN match, so it is neither a 400 nor a finding. Flagging
1601
+ * those would reject metadata the runtime accepts — the false finding that
1602
+ * makes authors stop trusting the linter (ADR-0072 D1). A virtual entry is the
1603
+ * opposite case: no column exists on any driver, so admitting it is the
1604
+ * fail-open #4254 closed one axis over, surviving on the known-but-virtual
1605
+ * axis.
1317
1606
  *
1318
1607
  * Three skips keep false positives near zero (ADR-0072 D1):
1319
1608
  *
@@ -1360,8 +1649,9 @@ interface SearchableFieldFinding {
1360
1649
  * Which runtime judgment applies to the declaration being checked:
1361
1650
  *
1362
1651
  * - `'canonical'` — the object's own `searchableFields`. The runtime honors
1363
- * any entry that exists (existence-filtered, never type-filtered), so only
1364
- * existence is checked.
1652
+ * any entry that exists and has a stored column to scan (existence- and
1653
+ * scannability-filtered, never type-filtered), so existence and virtuality
1654
+ * are checked and nothing else (#6674).
1365
1655
  * - `'narrowing'` — a list view's `searchableFields` (metadata or react
1366
1656
  * surface). Clients echo it as the `$searchFields` override, which the
1367
1657
  * #4254 ingress gate intersects with the object's allowed set — entries the
@@ -1556,11 +1846,14 @@ declare function walkPageComponents(page: AnyRec$f, pagePath: string): WalkedCom
1556
1846
  * authored in the wild. The table below names the field-bearing props
1557
1847
  * explicitly; an unknown component type is SKIPPED silently, never flagged.
1558
1848
  *
1559
- * The table also covers shapes the props schemas do not yet describe but real
1560
- * pages authored anyway (they pass only because `properties` is unvalidated):
1561
- * `record:details` `sections[].fields[]` and `hideFields[]`, and the record
1562
- * picker's `labelField`. Linting the schema's shape alone would find nothing on
1563
- * the actual corpus.
1849
+ * The table once also covered shapes the props schemas did not describe but
1850
+ * real pages authored anyway (`record:details` `sections[].fields[]` /
1851
+ * `hideFields[]`, the record picker's `labelField`). #5611 and #5775 settled
1852
+ * those the other way — the delivered shape got declared so today every prop
1853
+ * this table names is a live (non-retired) key on its `ComponentPropsMap`
1854
+ * schema, and `component-field-specs-liveness.test.ts` pins that: a future
1855
+ * retirement that forgets this table turns that test red instead of leaving a
1856
+ * tombstoned key listed here as if it were still-valid spelling (#6629).
1564
1857
  *
1565
1858
  * ── Shared with the react page surface ──────────────────────────────────
1566
1859
  *
@@ -1575,6 +1868,17 @@ declare function walkPageComponents(page: AnyRec$f, pagePath: string): WalkedCom
1575
1868
  * drift #4330 had just finished removing from the system-field lists.
1576
1869
  */
1577
1870
  declare const PAGE_FIELD_UNKNOWN = "page-field-unknown";
1871
+ /**
1872
+ * [#8340] The reference RESOLVES to a registry-injected system column — so
1873
+ * {@link PAGE_FIELD_UNKNOWN} is right to stay silent — but the bound object is
1874
+ * ADR-0015 `external`, where the platform registers the anchor and provisions
1875
+ * no storage behind it. Always `warning`, on both consequences and including
1876
+ * the `queried` one that gates for a genuinely missing column: the existence
1877
+ * question has a closed oracle here and the provenance question does not (this
1878
+ * pass cannot see the remote schema, only that the platform stores nothing) —
1879
+ * #8116's severity reasoning, unchanged.
1880
+ */
1881
+ declare const PAGE_FIELD_UNPROVISIONED = "page-field-unprovisioned";
1578
1882
  type PageFieldSeverity = 'error' | 'warning';
1579
1883
  interface PageFieldFinding {
1580
1884
  /**
@@ -1945,8 +2249,26 @@ declare function validateAiToolReferences(stack: AnyRec$9): AiToolRefFinding[];
1945
2249
  * that names the runtime consequence is honest for both readers; the runtime
1946
2250
  * is what actually gates. Deliberately NOT a Zod refine — an existing stack
1947
2251
  * must keep parsing (ADR-0078 non-goal #1).
2252
+ *
2253
+ * ## The value half (issue #6041)
2254
+ *
2255
+ * The rule above catches a stack that *declares* a withdrawn agent record.
2256
+ * It never looked at `app.defaultAgent` — a plain
2257
+ * `SnakeCaseIdentifierSchema` string, so any snake_case value parses, builds,
2258
+ * and passes `os:check` even when it names nothing the runtime will ever
2259
+ * resolve. #5985 measured the blind spot directly: replaying the bad example
2260
+ * `defaultAgent: 'sales_copilot'` left `check:skill-examples` at 208 green,
2261
+ * EXIT=0. `app.defaultAgent` silently falls back to the platform default at
2262
+ * runtime (ADR-0063 §1) instead of crashing, which is why this limb is
2263
+ * **warning**, not error, same as the rule above — the maintainer ruling on
2264
+ * #6041 (2026-08-07, reaffirmed 2026-08-09) is option A: add the value check
2265
+ * at warning tier, reusing `PLATFORM_AGENT_NAMES` rather than narrowing the
2266
+ * schema to an enum (a breaking authoring change ADR-0063 already walked
2267
+ * back once).
1948
2268
  */
1949
2269
  declare const AGENT_AUTHORING_WITHDRAWN = "agent-authoring-withdrawn";
2270
+ /** `app.defaultAgent` names something outside the platform agent roster. */
2271
+ declare const DEFAULT_AGENT_OUTSIDE_ROSTER = "default-agent-outside-roster";
1950
2272
  type AiAgentAuthoringSeverity = 'error' | 'warning';
1951
2273
  interface AiAgentAuthoringFinding {
1952
2274
  /** Always `warning` — the runtime is the gate; this is the authoring-time signal. */
@@ -2176,12 +2498,12 @@ declare function validateFlowNodeWrites(stack: AnyRec$5): FlowNodeWriteFinding[]
2176
2498
 
2177
2499
  type AnyRec$4 = Record<string, unknown>;
2178
2500
  /** Build the sorted access matrix for a normalized stack. */
2179
- declare function buildAccessMatrix(stack: AnyRec$4): AccessMatrix;
2501
+ declare function buildAccessMatrix(stack: AnyRec$4): AccessMatrixParsed;
2180
2502
  /**
2181
2503
  * Semantic diff between two matrices — human-review lines, empty = identical.
2182
2504
  * Ordered: removals, additions, then per-entry bit/scope changes.
2183
2505
  */
2184
- declare function diffAccessMatrix(before: AccessMatrix, after: AccessMatrix): string[];
2506
+ declare function diffAccessMatrix(before: AccessMatrixParsed, after: AccessMatrixParsed): string[];
2185
2507
 
2186
2508
  interface FlowLintFinding {
2187
2509
  where: string;
@@ -2344,6 +2666,8 @@ declare const UNIQUE_LEGACY_ORGANIZATION_COMPOSITE = "unique/legacy-organization
2344
2666
  * 17.x: warning. Protocol 18 rejects the spelling at validate/publish (#5082).
2345
2667
  * Advisory — never fails a build in 17.x.
2346
2668
  *
2669
+ * Concrete harm: #8323 measured the cross-tenant 409-vs-201 oracle end to end.
2670
+ *
2347
2671
  * Wiring: own AUTHORING_RULES entry (validate/build), and `lintDataModel`
2348
2672
  * calls it for `os lint` — each command reports each finding exactly once.
2349
2673
  */
@@ -2412,4 +2736,4 @@ declare function lintLegacyOrganizationComposites(objects: any[]): LintIssue[];
2412
2736
  */
2413
2737
  declare function lintDataModel(objects: any[]): LintIssue[];
2414
2738
 
2415
- export { ACTION_BODY_WRITE_EXCLUSIONS, ACTION_BODY_WRITE_PATTERNS, ACTION_BODY_WRITE_PATTERN_IDS, ACTION_BODY_WRITE_UNKNOWN_FIELD, ACTION_NAME_UNDEFINED, ACTION_NO_PLACEMENT, ACTION_RECORD_WRITE_DISCARDED, ACTION_RECORD_WRITE_PATTERNS, ACTION_RECORD_WRITE_PATTERN_IDS, AGENT_AUTHORING_WITHDRAWN, AI_SKILL_SURFACE_MISMATCH, AI_SKILL_TOOL_UNRESOLVED, APPROVAL_APPROVERS_MAY_RESOLVE_EMPTY, APPROVAL_APPROVER_CROSS_ORG_UNSUPPORTED, APPROVAL_APPROVER_NOT_MEMBERSHIP_TIER, APPROVAL_APPROVER_TYPE_DEPRECATED, APPROVAL_APPROVER_TYPE_UNKNOWN, APPROVAL_APPROVER_TYPE_UNSUPPORTED, APPROVAL_DECISION_OUTPUTS_RESERVED, APPROVAL_ESCALATION_REASSIGN_NO_TARGET, APPROVAL_EXPRESSION_INVALID, APPROVAL_EXPRESSION_NO_EMPTY_POLICY, AUTONUMBER_LITERAL_TOKEN, AUTONUMBER_OPTIONAL_FIELD, AUTONUMBER_SELF_REFERENCE, AUTONUMBER_UNKNOWN_FIELD, type ActionBodyWriteExclusion, type ActionBodyWriteFinding, type ActionBodyWriteSeverity, type ActionLocationsFinding, type ActionLocationsSeverity, type ActionNameRefFinding, type ActionNameRefSeverity, type AiAgentAuthoringFinding, type AiAgentAuthoringSeverity, type AiSurfaceAffinityFinding, type AiSurfaceAffinitySeverity, type AiToolRefFinding, type AiToolRefSeverity, type ApprovalApproverFinding, type ApprovalApproverSeverity, type AutonumberLintFinding, type BodyWritePatternExclusion, CAPABILITY_REFERENCE_UNKNOWN, CHART_AXIS_NOT_SELECTED, CHART_CONFIG_MISSING, CHART_DATASET_UNKNOWN, CHART_DIMENSION_UNKNOWN, CHART_FIELD_UNKNOWN, CHART_MEASURE_UNKNOWN, COMPONENT_PROPS_INVALID, COMPONENT_PROPS_UNKNOWN_KEY, type CapabilityRefFinding, type CapabilityRefSeverity, type ChartBindingFinding, type ChartBindingSeverity, type ComponentPropsFinding, type ComponentPropsSeverity, DASHBOARD_ACTION_ROUTE_UNRESOLVED, DASHBOARD_ACTION_TARGET_UNDEFINED, DASHBOARD_FILTER_FIELD_UNKNOWN, type DashboardActionRefFinding, type DashboardActionRefSeverity, type ExprIssue, type ExtractedHookBodyWrite, type ExtractedHookBodyWriteSet, FIELD_GROUP_EMPTY, FIELD_GROUP_SHADOWED, FIELD_GROUP_UNDECLARED, FILTER_TOKEN_UNKNOWN, FLOW_APPROVAL_REVISE_DEAD_END, FLOW_APPROVAL_REVISE_DISABLED, FLOW_APPROVAL_REVISE_TARGET_NOT_SERVICE_OWNED, FLOW_APPROVAL_REVISE_UNMARKED_BACKEDGE, FLOW_BARE_DOLLAR_REF, FLOW_BRANCH_LABEL_UNMATCHED, FLOW_DATE_EQUALITY_FILTER, FLOW_DECISION_UNCONDITIONAL_BRANCH, FLOW_DEFAULT_EDGE_WITH_CONDITION, FLOW_DOUBLE_BRACE_INTERP, FLOW_DRAFT_STATUS_AMBIGUOUS, FLOW_ERROR_LABEL_NOT_FAULT, FLOW_INERT_NODE_CONDITION, FLOW_MULTIPLE_DEFAULT_EDGES, FLOW_MULTI_WRITE_UNFILTERED, FLOW_NODE_WRITE_UNKNOWN_FIELD, FLOW_PHANTOM_AGGREGATION, FLOW_RUNAS_UNSCOPED, FLOW_TEMPLATE_LOOKUP_TRAVERSAL, FLOW_TEMPLATE_UNKNOWN_FIELD, FLOW_TIME_RELATIVE_ANTIPATTERN, FLOW_TIME_RELATIVE_DESCRIPTOR_INVALID, FLOW_TIME_RELATIVE_DESCRIPTOR_UNROUTABLE, FLOW_TRIGGER_UNKNOWN_EVENT, FLOW_TRIGGER_UNKNOWN_OBJECT, FLOW_UPDATE_READONLY_FIELD, FLOW_UPDATE_READONLY_WHEN_FIELD, FLOW_WRITE_NODE_TYPES, FLOW_WRITE_NODE_TYPES_DEFERRED, FORM_COLSPAN_ABSOLUTE, FORM_FIELD_UNKNOWN, type FilterTokenFinding, type FilterTokenSeverity, type FlowLintFinding, type FlowNodeWriteFinding, type FlowNodeWriteSeverity, type FlowTemplatePathFinding, type FlowTemplatePathSeverity, type FlowTriggerReadinessFinding, type FlowTriggerReadinessSeverity, type FlowWriteNodeDeferral, type FormLayoutFinding, type FormLayoutSeverity, type FunctionalCompletenessFinding, type FunctionalCompletenessSeverity, HOOK_BODY_WRITE_EXCLUSIONS, HOOK_BODY_WRITE_PATTERNS, HOOK_BODY_WRITE_PATTERN_IDS, HOOK_BODY_WRITE_UNKNOWN_FIELD, type HookBodyWriteFinding, type HookBodyWritePattern, type HookBodyWriteSeverity, type JsxPageFinding, type JsxPageSeverity, LIST_VIEW_FILTERS_IN_VIEWS_MODE, LIVENESS_DEAD_PROPERTY, LIVENESS_EXPERIMENTAL_PROPERTY, type LintIssue, type ListViewModeFinding, type ListViewModeSeverity, type LivenessLintFinding, MAX_SCHEMA_WALK_DEPTH, MEASURE_AGGREGATE_INCOHERENT, NAV_OBJECT_UNGRANTED, NAV_TARGET_UNRESOLVED, NULL_GUARD_HINT, type NavAccessFinding, type NavAccessSeverity, type NavTargetRefFinding, type NavTargetRefSeverity, type NullGuardFinding, type NullGuardOptions, OBJECT_REFERENCE_UNKNOWN, OBJECT_REFERENCE_UNREGISTERED_PLATFORM, ORG_AXIS_CROSS_ORG_BU_GRANT, ORG_AXIS_PERMISSION_INHERITANCE, type ObjectRefFinding, type ObjectRefSeverity, type OrgAxisFinding, type OrgAxisSeverity, PAGE_FIELD_UNKNOWN, PAGE_SOURCE_CLASSNAME, type PageFieldFinding, type PageFieldSeverity, REACT_BLOCK_NEEDS_RECORD_CONTEXT, REACT_CHART_AGGREGATE_INVALID, REACT_CHART_AXIS_UNKNOWN, REACT_CHART_DRILLDOWN_INVALID, REACT_CHART_FIELD_UNKNOWN, REFERENCE_INTEGRITY_RULES, RLS_PREDICATE_UNENFORCEABLE, RLS_PREDICATE_UNPARSEABLE, RUNTIME_AJV_OPTIONS, type ReactPageFinding, type ReactPageSeverity, type ReactPropFinding, type ReactPropSeverity, type ReadonlyFlowWriteFinding, type ReadonlyFlowWriteSeverity, type RecordTitleFinding, type RecordTitleSeverity, type ReferenceIntegrityFinding, type ReferenceIntegrityRule, type ReferenceIntegritySeverity, type RlsPredicateFinding, type RlsPredicateSeverity, type RuleCompilabilityFinding, type RuleCompilabilitySeverity, type RuleSchemaFormatFinding, type RuleSchemaFormatSeverity, SEARCHABLE_FIELD_UNKNOWN, SEARCHABLE_FIELD_UNSEARCHABLE, SECURITY_ANCHOR_HIGH_PRIVILEGE, SECURITY_BOOK_AUDIENCE_UNKNOWN_SET, SECURITY_DELEGATION_MISSING_REASON, SECURITY_EXTERNAL_WIDER, SECURITY_FLS_UNQUALIFIED_KEY, SECURITY_GRANT_EXPIRED_AT_AUTHORING, SECURITY_MASTER_DETAIL_UNGRANTED, SECURITY_OWD_ALIAS, SECURITY_OWD_UNSET, SECURITY_PRIVATE_NO_READSCOPE, SECURITY_ROLE_WORD, SECURITY_WILDCARD_VAMA, SEED_INSERT_MODE_DUPLICATES_ON_REPLAY, SEED_VALUE_OUTSIDE_STATE_MACHINE, SEMANTIC_ROLE_FIELD_UNKNOWN, SHARING_RULE_RUNTIME_VARIABLE_CONDITION, SHARING_RULE_UNLOWERABLE_CONDITION, STYLE_CLASSNAME_TAILWIND, STYLE_NODE_MISSING_ID, STYLE_RESPONSIVE_NO_BASE, STYLE_UNKNOWN_CSS_PROPERTY, STYLE_UNKNOWN_TOKEN, type SearchableFieldFinding, type SearchableFieldRole, type SearchableFieldSeverity, type SecurityFinding, type SecuritySeverity, type SeedReplaySafetyFinding, type SeedReplaySafetySeverity, type SeedStateMachineFinding, type SeedStateMachineSeverity, type SemanticRoleFinding, type SemanticRoleSeverity, type Severity, type SharingRuleEnforceabilityFinding, type SharingRuleEnforceabilitySeverity, type SourceStyleFinding, type SourceStyleSeverity, type StyleFinding, type StyleSeverity, TABLE_COUNT_ONLY, TITLE_FORMAT_RETIRED, TITLE_UNRESOLVABLE, TRANSLATION_OPTION_KEY_UNKNOWN, TRANSLATION_SECTION_NAME_MISSING, TRANSLATION_TARGET_UNKNOWN, type TranslatableSectionFinding, type TranslatableSectionSeverity, type TranslationRefFinding, type TranslationRefSeverity, UNIQUE_DOUBLE_DECLARATION, UNIQUE_LEGACY_ORGANIZATION_COMPOSITE, UNIQUE_UNSCOPED_DECLARED_INDEX, VALIDATION_RULE_REGEX_UNCOMPILABLE, VALIDATION_RULE_SCHEMA_UNCOMPILABLE, VALIDATION_RULE_SCHEMA_UNKNOWN_FORMAT, VIEW_CONTAINER_SHAPE, VIEW_KEY_COLLISION, VIEW_REF_FORM_TARGET_KIND, VIEW_REF_FORM_TARGET_MISSING, VISIBILITY_ALIAS_DEPRECATED, VISIBILITY_ROOT_MISLAYERED, type ViewContainerFinding, type ViewContainerSeverity, type ViewRefFinding, type VisibilityFinding, type VisibilityLayer, type VisibilityOptions, type VisibilitySeverity, WIDGET_DATASET_UNKNOWN, WIDGET_DIMENSION_UNKNOWN, WIDGET_LEGACY_ANALYTICS_SHAPE, WIDGET_LEGACY_ANALYTICS_UNRENDERABLE, WIDGET_MEASURE_UNKNOWN, type WalkedComponent, type WalkedValidationRule, type WidgetBindingFinding, type WidgetBindingSeverity, buildAccessMatrix, diffAccessMatrix, extractHookBodyWriteSet, extractHookBodyWrites, findUnguardedNullableOperands, isSourceAuthoredPage, lintAutonumberFormats, lintDataModel, lintFlowPatterns, lintLegacyOrganizationComposites, lintLivenessProperties, lintUniqueDeclarations, lintUnscopedDeclaredIndexes, lintViewRefs, nearestRegisteredFormat, nullGuardMessage, validateActionBodyWrites, validateActionLocations, validateActionNameRefs, validateAiAgentAuthoring, validateAiSurfaceAffinity, validateAiToolReferences, validateApprovalApprovers, validateCapabilityReferences, validateChartBindings, validateComponentProps, validateDashboardActionRefs, validateFilterTokens, validateFlowNodeWrites, validateFlowTemplatePaths, validateFlowTriggerReadiness, validateFormLayout, validateFunctionalCompleteness, validateHookBodyWrites, validateJsxPages, validateListViewMode, validateNavAccess, validateNavTargetRefs, validateObjectReferences, validateOrgAxisRedLines, validatePageFieldBindings, validatePageSourceStyling, validateReactPageProps, validateReactPages, validateReadonlyFlowWrites, validateRecordTitle, validateReferenceIntegrity, validateResponsiveStyles, validateRlsPredicateEnforceability, validateRuleCompilability, validateRuleSchemaFormats, validateSearchableFields, validateSecurityPosture, validateSeedReplaySafety, validateSeedStateMachine, validateSemanticRoles, validateSharingRuleEnforceability, validateStackExpressions, validateTranslatableSections, validateTranslationReferences, validateViewContainers, validateVisibilityPredicates, validateWidgetBindings, walkPageComponents };
2739
+ export { ACTION_BODY_WRITE_EXCLUSIONS, ACTION_BODY_WRITE_PATTERNS, ACTION_BODY_WRITE_PATTERN_IDS, ACTION_BODY_WRITE_UNKNOWN_FIELD, ACTION_NAME_UNDEFINED, ACTION_NO_PLACEMENT, ACTION_RECORD_WRITE_DISCARDED, ACTION_RECORD_WRITE_PATTERNS, ACTION_RECORD_WRITE_PATTERN_IDS, AGENT_AUTHORING_WITHDRAWN, AI_SKILL_SURFACE_MISMATCH, AI_SKILL_TOOL_UNRESOLVED, APPROVAL_APPROVERS_MAY_RESOLVE_EMPTY, APPROVAL_APPROVER_CROSS_ORG_UNSUPPORTED, APPROVAL_APPROVER_NOT_MEMBERSHIP_TIER, APPROVAL_APPROVER_TYPE_DEPRECATED, APPROVAL_APPROVER_TYPE_UNKNOWN, APPROVAL_APPROVER_TYPE_UNSUPPORTED, APPROVAL_DECISION_OUTPUTS_RESERVED, APPROVAL_ESCALATION_REASSIGN_NO_TARGET, APPROVAL_EXPRESSION_INVALID, APPROVAL_EXPRESSION_NO_EMPTY_POLICY, AUTONUMBER_LITERAL_TOKEN, AUTONUMBER_OPTIONAL_FIELD, AUTONUMBER_SELF_REFERENCE, AUTONUMBER_UNKNOWN_FIELD, type ActionBodyWriteExclusion, type ActionBodyWriteFinding, type ActionBodyWriteSeverity, type ActionLocationsFinding, type ActionLocationsSeverity, type ActionNameRefFinding, type ActionNameRefSeverity, type AiAgentAuthoringFinding, type AiAgentAuthoringSeverity, type AiSurfaceAffinityFinding, type AiSurfaceAffinitySeverity, type AiToolRefFinding, type AiToolRefSeverity, type ApprovalApproverFinding, type ApprovalApproverSeverity, type AutonumberLintFinding, type BodyWritePatternExclusion, CAPABILITY_REFERENCE_UNKNOWN, CHART_AXIS_NOT_SELECTED, CHART_CONFIG_MISSING, CHART_DATASET_UNKNOWN, CHART_DIMENSION_UNKNOWN, CHART_FIELD_UNKNOWN, CHART_MEASURE_UNKNOWN, COMPONENT_PROPS_INVALID, COMPONENT_PROPS_UNKNOWN_KEY, type CapabilityRefFinding, type CapabilityRefSeverity, type ChartBindingFinding, type ChartBindingSeverity, type ComponentPropsFinding, type ComponentPropsSeverity, DASHBOARD_ACTION_ROUTE_UNRESOLVED, DASHBOARD_ACTION_TARGET_UNDEFINED, DASHBOARD_FILTER_FIELD_UNKNOWN, DASHBOARD_FILTER_FIELD_UNPROVISIONED, DEFAULT_AGENT_OUTSIDE_ROSTER, type DashboardActionRefFinding, type DashboardActionRefSeverity, type EmptyCombinatorFinding, type EmptyCombinatorSeverity, type ExprIssue, type ExtractedHookBodyWrite, type ExtractedHookBodyWriteSet, FIELD_GROUP_EMPTY, FIELD_GROUP_SHADOWED, FIELD_GROUP_UNDECLARED, FILTER_EMPTY_COMBINATOR, FILTER_EMPTY_NODE, FILTER_TOKEN_UNKNOWN, FLOW_APPROVAL_REVISE_DEAD_END, FLOW_APPROVAL_REVISE_DISABLED, FLOW_APPROVAL_REVISE_TARGET_NOT_SERVICE_OWNED, FLOW_APPROVAL_REVISE_UNMARKED_BACKEDGE, FLOW_BARE_DOLLAR_REF, FLOW_BRANCH_LABEL_UNMATCHED, FLOW_DATE_EQUALITY_FILTER, FLOW_DECISION_UNCONDITIONAL_BRANCH, FLOW_DEFAULT_EDGE_WITH_CONDITION, FLOW_DOUBLE_BRACE_INTERP, FLOW_DRAFT_STATUS_AMBIGUOUS, FLOW_ERROR_LABEL_NOT_FAULT, FLOW_INERT_NODE_CONDITION, FLOW_MULTIPLE_DEFAULT_EDGES, FLOW_MULTI_WRITE_UNFILTERED, FLOW_NODE_WRITE_UNKNOWN_FIELD, FLOW_PHANTOM_AGGREGATION, FLOW_RUNAS_UNSCOPED, FLOW_TEMPLATE_FIELD_UNPROVISIONED, FLOW_TEMPLATE_LOOKUP_TRAVERSAL, FLOW_TEMPLATE_UNKNOWN_FIELD, FLOW_TIME_RELATIVE_ANTIPATTERN, FLOW_TIME_RELATIVE_DESCRIPTOR_INVALID, FLOW_TIME_RELATIVE_DESCRIPTOR_UNROUTABLE, FLOW_TRIGGER_UNKNOWN_EVENT, FLOW_TRIGGER_UNKNOWN_OBJECT, FLOW_TRIGGER_UNROUTABLE, FLOW_UPDATE_READONLY_FIELD, FLOW_UPDATE_READONLY_WHEN_FIELD, FLOW_WRITE_NODE_TYPES, FLOW_WRITE_NODE_TYPES_DEFERRED, FORM_COLSPAN_ABSOLUTE, FORM_FIELD_UNKNOWN, type FilterTokenFinding, type FilterTokenSeverity, type FlowLintFinding, type FlowNodeWriteFinding, type FlowNodeWriteSeverity, type FlowTemplatePathFinding, type FlowTemplatePathSeverity, type FlowTriggerReadinessFinding, type FlowTriggerReadinessSeverity, type FlowWriteNodeDeferral, type FormLayoutFinding, type FormLayoutSeverity, type FunctionalCompletenessFinding, type FunctionalCompletenessSeverity, HOOK_BODY_WRITE_EXCLUSIONS, HOOK_BODY_WRITE_PATTERNS, HOOK_BODY_WRITE_PATTERN_IDS, HOOK_BODY_WRITE_UNKNOWN_FIELD, type HookBodyWriteFinding, type HookBodyWritePattern, type HookBodyWriteSeverity, type JsxPageFinding, type JsxPageSeverity, LIST_VIEW_FILTERS_IN_VIEWS_MODE, LIVENESS_DEAD_PROPERTY, LIVENESS_EXPERIMENTAL_PROPERTY, type LintIssue, type ListViewModeFinding, type ListViewModeSeverity, type LivenessLintFinding, MANAGED_API_METHOD_UNAFFORDABLE, MAX_SCHEMA_WALK_DEPTH, MEASURE_AGGREGATE_INCOHERENT, type ManagedApiMethodFinding, NAV_OBJECT_UNGRANTED, NAV_OBJECT_UNSERVABLE, NAV_TARGET_UNRESOLVED, NULL_GUARD_HINT, type NavAccessFinding, type NavAccessSeverity, type NavObjectServabilityFinding, type NavTargetRefFinding, type NavTargetRefSeverity, type NullGuardFinding, type NullGuardOptions, OBJECT_REFERENCE_UNKNOWN, OBJECT_REFERENCE_UNREGISTERED_PLATFORM, OPEN_VOCABULARY_PROBES, ORG_AXIS_CROSS_ORG_BU_GRANT, ORG_AXIS_PERMISSION_INHERITANCE, type ObjectRefFinding, type ObjectRefSeverity, type OrgAxisFinding, type OrgAxisSeverity, PAGE_FIELD_UNKNOWN, PAGE_FIELD_UNPROVISIONED, PAGE_SOURCE_CLASSNAME, PREDICATE_PATH_UNRESOLVED, PREDICATE_PATH_UNROOTED, PREDICATE_RHS_PATH_SHAPED, PRE_SEAL_PHASES, type PageFieldFinding, type PageFieldSeverity, type PredicatePathFinding, type PredicatePathOptions, type PredicatePathSeverity, REACT_BLOCK_NEEDS_RECORD_CONTEXT, REACT_CHART_AGGREGATE_INVALID, REACT_CHART_AXIS_UNKNOWN, REACT_CHART_DRILLDOWN_INVALID, REACT_CHART_FIELD_UNKNOWN, REACT_CHART_FIELD_UNPROVISIONED, REFERENCE_INTEGRITY_RULES, RLS_PREDICATE_OVER_BUDGET, RLS_PREDICATE_UNENFORCEABLE, RLS_PREDICATE_UNPARSEABLE, RUNTIME_AJV_OPTIONS, type ReactPageFinding, type ReactPageSeverity, type ReactPropFinding, type ReactPropSeverity, type ReadonlyFlowWriteFinding, type ReadonlyFlowWriteSeverity, type RecordTitleFinding, type RecordTitleSeverity, type ReferenceIntegrityFinding, type ReferenceIntegrityRule, type ReferenceIntegritySeverity, type RlsPredicateFinding, type RlsPredicateSeverity, type RuleCompilabilityFinding, type RuleCompilabilitySeverity, type RuleSchemaFormatFinding, type RuleSchemaFormatSeverity, SEAL_MARKERS, SEARCHABLE_FIELD_UNKNOWN, SEARCHABLE_FIELD_UNSEARCHABLE, SECURITY_ANCHOR_HIGH_PRIVILEGE, SECURITY_BOOK_AUDIENCE_UNKNOWN_SET, SECURITY_CBP_NO_RELATION, SECURITY_DELEGATION_MISSING_REASON, SECURITY_EXTERNAL_WIDER, SECURITY_FLS_UNQUALIFIED_KEY, SECURITY_GRANT_EXPIRED_AT_AUTHORING, SECURITY_MASTER_DETAIL_UNGRANTED, SECURITY_OWD_ALIAS, SECURITY_OWD_UNSET, SECURITY_PRIVATE_NO_READSCOPE, SECURITY_ROLE_WORD, SECURITY_WILDCARD_VAMA, SEED_INSERT_MODE_DUPLICATES_ON_REPLAY, SEED_VALUE_OUTSIDE_STATE_MACHINE, SEMANTIC_ROLE_FIELD_UNKNOWN, SEMANTIC_ROLE_FIELD_UNPROVISIONED, SHARING_RULE_RUNTIME_VARIABLE_CONDITION, SHARING_RULE_UNLOWERABLE_CONDITION, STARTUP_OPEN_VOCABULARY_VERDICT, STARTUP_VERDICT_ASSERTIVE_WORDING, STARTUP_VERDICT_HINT, STYLE_CLASSNAME_TAILWIND, STYLE_NODE_MISSING_ID, STYLE_RESPONSIVE_NO_BASE, STYLE_UNKNOWN_CSS_PROPERTY, STYLE_UNKNOWN_TOKEN, type SearchableFieldFinding, type SearchableFieldRole, type SearchableFieldSeverity, type SecurityFinding, type SecuritySeverity, type SeedReplaySafetyFinding, type SeedReplaySafetySeverity, type SeedStateMachineFinding, type SeedStateMachineSeverity, type SemanticRoleFinding, type SemanticRoleSeverity, type Severity, type SharingRuleEnforceabilityFinding, type SharingRuleEnforceabilitySeverity, type SourceStyleFinding, type SourceStyleSeverity, type StartupRegistryVerdictFinding, type StartupRegistryVerdictOptions, type StartupRegistryVerdictSeverity, type StyleFinding, type StyleSeverity, TABLE_COUNT_ONLY, TITLE_FORMAT_RETIRED, TITLE_UNRESOLVABLE, TRANSLATION_OPTION_KEY_UNKNOWN, TRANSLATION_SECTION_NAME_MISSING, TRANSLATION_TARGET_UNKNOWN, type TranslatableSectionFinding, type TranslatableSectionSeverity, type TranslationRefFinding, type TranslationRefSeverity, UNIQUE_DOUBLE_DECLARATION, UNIQUE_LEGACY_ORGANIZATION_COMPOSITE, UNIQUE_UNSCOPED_DECLARED_INDEX, VALIDATION_RULE_REGEX_UNCOMPILABLE, VALIDATION_RULE_SCHEMA_UNCOMPILABLE, VALIDATION_RULE_SCHEMA_UNKNOWN_FORMAT, VIEW_CONTAINER_SHAPE, VIEW_KEY_COLLISION, VIEW_REF_FORM_TARGET_KIND, VIEW_REF_FORM_TARGET_MISSING, VISIBILITY_BARE_IDENTIFIER, VISIBILITY_PREDICATE_OVER_BUDGET, VISIBILITY_PREDICATE_SYNTAX, VISIBILITY_ROOT_MISLAYERED, type ViewContainerFinding, type ViewContainerSeverity, type ViewRefFinding, type VisibilityFinding, type VisibilityLayer, type VisibilityOptions, type VisibilitySeverity, WIDGET_DATASET_UNKNOWN, WIDGET_DIMENSION_UNKNOWN, WIDGET_LEGACY_ANALYTICS_SHAPE, WIDGET_LEGACY_ANALYTICS_UNRENDERABLE, WIDGET_MEASURE_UNKNOWN, type WalkedComponent, type WalkedValidationRule, type WidgetBindingFinding, type WidgetBindingSeverity, buildAccessMatrix, diffAccessMatrix, extractHookBodyWriteSet, extractHookBodyWrites, findStartupRegistryVerdicts, findUnguardedNullableOperands, isSourceAuthoredPage, lintAutonumberFormats, lintDataModel, lintFlowPatterns, lintLegacyOrganizationComposites, lintLivenessProperties, lintUniqueDeclarations, lintUnscopedDeclaredIndexes, lintViewRefs, nearestRegisteredFormat, nullGuardMessage, validateActionBodyWrites, validateActionLocations, validateActionNameRefs, validateAiAgentAuthoring, validateAiSurfaceAffinity, validateAiToolReferences, validateApprovalApprovers, validateCapabilityReferences, validateChartBindings, validateComponentProps, validateDashboardActionRefs, validateEmptyCombinators, validateFilterTokens, validateFlowNodeWrites, validateFlowTemplatePaths, validateFlowTriggerReadiness, validateFormLayout, validateFunctionalCompleteness, validateHookBodyWrites, validateJsxPages, validateListViewMode, validateManagedApiMethods, validateNavAccess, validateNavObjectServability, validateNavTargetRefs, validateObjectReferences, validateOrgAxisRedLines, validatePageFieldBindings, validatePageSourceStyling, validatePredicatePathRefs, validateReactPageProps, validateReactPages, validateReadonlyFlowWrites, validateRecordTitle, validateReferenceIntegrity, validateResponsiveStyles, validateRlsPredicateEnforceability, validateRuleCompilability, validateRuleSchemaFormats, validateSearchableFields, validateSecurityPosture, validateSecurityRoleWord, validateSeedReplaySafety, validateSeedStateMachine, validateSemanticRoles, validateSharingRuleEnforceability, validateStackExpressions, validateTranslatableSections, validateTranslationReferences, validateViewContainers, validateVisibilityPredicates, validateWidgetBindings, walkPageComponents };