@objectstack/lint 17.0.0-rc.0 → 17.0.0-rc.1

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.ts CHANGED
@@ -94,7 +94,7 @@ interface WidgetBindingFinding {
94
94
  /** How to fix (or deliberately suppress) it. */
95
95
  hint: string;
96
96
  }
97
- type AnyRec$t = Record<string, unknown>;
97
+ type AnyRec$x = Record<string, unknown>;
98
98
  /**
99
99
  * Validate every dashboard widget's dataset binding. Returns the list of
100
100
  * findings (empty = clean). Caller decides how to surface them: `error`
@@ -102,7 +102,7 @@ type AnyRec$t = Record<string, unknown>;
102
102
  * should fail validate/build; `warning` findings are advisory and must
103
103
  * never fail the build on their own.
104
104
  */
105
- declare function validateWidgetBindings(stack: AnyRec$t): WidgetBindingFinding[];
105
+ declare function validateWidgetBindings(stack: AnyRec$x): WidgetBindingFinding[];
106
106
 
107
107
  interface ExprIssue {
108
108
  where: string;
@@ -115,12 +115,12 @@ interface ExprIssue {
115
115
  */
116
116
  severity?: 'error' | 'warning';
117
117
  }
118
- type AnyRec$s = Record<string, unknown>;
118
+ type AnyRec$w = Record<string, unknown>;
119
119
  /**
120
120
  * Validate every predicate in the stack. Returns the list of issues (empty =
121
121
  * clean). Caller decides how to surface / whether to fail the build.
122
122
  */
123
- declare function validateStackExpressions(stack: AnyRec$s): ExprIssue[];
123
+ declare function validateStackExpressions(stack: AnyRec$w): ExprIssue[];
124
124
 
125
125
  type ListViewModeSeverity = 'error' | 'warning';
126
126
  interface ListViewModeFinding {
@@ -134,7 +134,7 @@ interface ListViewModeFinding {
134
134
  hint: string;
135
135
  }
136
136
  declare const LIST_VIEW_FILTERS_IN_VIEWS_MODE = "list-view-filters-in-views-mode";
137
- type AnyRec$r = Record<string, unknown>;
137
+ type AnyRec$v = Record<string, unknown>;
138
138
  /**
139
139
  * Flag ADR-0047 "views" mode violations on an object's built-in named views or a
140
140
  * `defineView` default `list` / named `listViews`: `quickFilters`, or a `tabs`
@@ -144,7 +144,7 @@ type AnyRec$r = Record<string, unknown>;
144
144
  *
145
145
  * Feed the PRE-parse stack (normalizeStackInput output) — see file header.
146
146
  */
147
- declare function validateListViewMode(stack: AnyRec$r): ListViewModeFinding[];
147
+ declare function validateListViewMode(stack: AnyRec$v): ListViewModeFinding[];
148
148
 
149
149
  type FlowTriggerReadinessSeverity = 'error' | 'warning';
150
150
  interface FlowTriggerReadinessFinding {
@@ -159,12 +159,12 @@ interface FlowTriggerReadinessFinding {
159
159
  }
160
160
  declare const FLOW_TRIGGER_UNKNOWN_OBJECT = "flow-trigger-unknown-object";
161
161
  declare const FLOW_DRAFT_STATUS_AMBIGUOUS = "flow-draft-status-ambiguous";
162
- type AnyRec$q = Record<string, unknown>;
162
+ type AnyRec$u = Record<string, unknown>;
163
163
  /**
164
164
  * Validate auto-launched flow trigger wiring against the stack definition.
165
165
  * Pure and dependency-free; safe on pre- or post-parse stacks.
166
166
  */
167
- declare function validateFlowTriggerReadiness(stack: AnyRec$q): FlowTriggerReadinessFinding[];
167
+ declare function validateFlowTriggerReadiness(stack: AnyRec$u): FlowTriggerReadinessFinding[];
168
168
 
169
169
  type FlowTemplatePathSeverity = 'error' | 'warning';
170
170
  interface FlowTemplatePathFinding {
@@ -179,12 +179,12 @@ interface FlowTemplatePathFinding {
179
179
  }
180
180
  declare const FLOW_TEMPLATE_UNKNOWN_FIELD = "flow-template-unknown-field";
181
181
  declare const FLOW_TEMPLATE_LOOKUP_TRAVERSAL = "flow-template-lookup-traversal";
182
- type AnyRec$p = Record<string, unknown>;
182
+ type AnyRec$t = Record<string, unknown>;
183
183
  /**
184
184
  * Validate `{record.<path>}` template references across every record-change
185
185
  * flow. Pure and dependency-free; safe on pre- or post-parse stacks.
186
186
  */
187
- declare function validateFlowTemplatePaths(stack: AnyRec$p): FlowTemplatePathFinding[];
187
+ declare function validateFlowTemplatePaths(stack: AnyRec$t): FlowTemplatePathFinding[];
188
188
 
189
189
  type ReadonlyFlowWriteSeverity = 'error' | 'warning';
190
190
  interface ReadonlyFlowWriteFinding {
@@ -199,12 +199,12 @@ interface ReadonlyFlowWriteFinding {
199
199
  }
200
200
  declare const FLOW_UPDATE_READONLY_FIELD = "flow-update-readonly-field";
201
201
  declare const FLOW_UPDATE_READONLY_WHEN_FIELD = "flow-update-readonly-when-field";
202
- type AnyRec$o = Record<string, unknown>;
202
+ type AnyRec$s = Record<string, unknown>;
203
203
  /**
204
204
  * Validate flow `update_record` writes against target-object readonly
205
205
  * declarations. Pure and dependency-free; safe on pre- or post-parse stacks.
206
206
  */
207
- declare function validateReadonlyFlowWrites(stack: AnyRec$o): ReadonlyFlowWriteFinding[];
207
+ declare function validateReadonlyFlowWrites(stack: AnyRec$s): ReadonlyFlowWriteFinding[];
208
208
 
209
209
  type ViewContainerSeverity = 'error' | 'warning';
210
210
  interface ViewContainerFinding {
@@ -241,14 +241,14 @@ declare const STYLE_CLASSNAME_TAILWIND = "style-classname-tailwind";
241
241
  declare const STYLE_RESPONSIVE_NO_BASE = "style-responsive-no-base";
242
242
  declare const STYLE_UNKNOWN_CSS_PROPERTY = "style-unknown-css-property";
243
243
  declare const STYLE_UNKNOWN_TOKEN = "style-unknown-token";
244
- type AnyRec$n = Record<string, unknown>;
244
+ type AnyRec$r = Record<string, unknown>;
245
245
  /**
246
246
  * Validate every page's component tree for SDUI styling correctness (ADR-0065).
247
247
  * Returns findings (empty = clean). `error` findings describe styles that are
248
248
  * silently dropped and should fail validate/build; `warning` findings are
249
249
  * advisory (typos, drift, footguns).
250
250
  */
251
- declare function validateResponsiveStyles(stack: AnyRec$n): StyleFinding[];
251
+ declare function validateResponsiveStyles(stack: AnyRec$r): StyleFinding[];
252
252
 
253
253
  type JsxPageSeverity = 'error' | 'warning';
254
254
  interface JsxPageFinding {
@@ -261,8 +261,8 @@ interface JsxPageFinding {
261
261
  message: string;
262
262
  hint: string;
263
263
  }
264
- type AnyRec$m = Record<string, unknown>;
265
- declare function validateJsxPages(stack: AnyRec$m, opts?: {
264
+ type AnyRec$q = Record<string, unknown>;
265
+ declare function validateJsxPages(stack: AnyRec$q, opts?: {
266
266
  manifest?: Manifest;
267
267
  }): JsxPageFinding[];
268
268
 
@@ -275,8 +275,8 @@ interface ReactPageFinding {
275
275
  message: string;
276
276
  hint: string;
277
277
  }
278
- type AnyRec$l = Record<string, unknown>;
279
- declare function validateReactPages(stack: AnyRec$l): ReactPageFinding[];
278
+ type AnyRec$p = Record<string, unknown>;
279
+ declare function validateReactPages(stack: AnyRec$p): ReactPageFinding[];
280
280
 
281
281
  type ReactPropSeverity = 'error' | 'warning';
282
282
  interface ReactPropFinding {
@@ -287,11 +287,11 @@ interface ReactPropFinding {
287
287
  message: string;
288
288
  hint: string;
289
289
  }
290
- type AnyRec$k = Record<string, unknown>;
290
+ type AnyRec$o = Record<string, unknown>;
291
291
  declare const REACT_CHART_FIELD_UNKNOWN = "react-chart-field-unknown";
292
292
  declare const REACT_CHART_AGGREGATE_INVALID = "react-chart-aggregate-invalid";
293
293
  declare const REACT_CHART_AXIS_UNKNOWN = "react-chart-axis-unknown";
294
- declare function validateReactPageProps(stack: AnyRec$k): ReactPropFinding[];
294
+ declare function validateReactPageProps(stack: AnyRec$o): ReactPropFinding[];
295
295
 
296
296
  type SourceStyleSeverity = 'error' | 'warning';
297
297
  interface SourceStyleFinding {
@@ -303,8 +303,8 @@ interface SourceStyleFinding {
303
303
  hint: string;
304
304
  }
305
305
  declare const PAGE_SOURCE_CLASSNAME = "page-source-className-tailwind";
306
- type AnyRec$j = Record<string, unknown>;
307
- declare function validatePageSourceStyling(stack: AnyRec$j): SourceStyleFinding[];
306
+ type AnyRec$n = Record<string, unknown>;
307
+ declare function validatePageSourceStyling(stack: AnyRec$n): SourceStyleFinding[];
308
308
 
309
309
  /**
310
310
  * Build-time record-title diagnostics (ADR-0079).
@@ -348,14 +348,14 @@ interface RecordTitleFinding {
348
348
  /** How to fix it. */
349
349
  hint: string;
350
350
  }
351
- type AnyRec$i = Record<string, unknown>;
351
+ type AnyRec$m = Record<string, unknown>;
352
352
  /**
353
353
  * Validate every object's record-title declaration. Returns the list of
354
354
  * findings (empty = clean). Both rules are advisory (`warning`): the caller
355
355
  * must never fail the build on them alone — auto-provision + the `Record #<id>`
356
356
  * floor guarantee a resolvable title at runtime.
357
357
  */
358
- declare function validateRecordTitle(stack: AnyRec$i): RecordTitleFinding[];
358
+ declare function validateRecordTitle(stack: AnyRec$m): RecordTitleFinding[];
359
359
 
360
360
  /**
361
361
  * Build-time semantic-role diagnostics (ADR-0085).
@@ -392,13 +392,13 @@ interface SemanticRoleFinding {
392
392
  /** How to fix it. */
393
393
  hint: string;
394
394
  }
395
- type AnyRec$h = Record<string, unknown>;
395
+ type AnyRec$l = Record<string, unknown>;
396
396
  /**
397
397
  * Validate every object's semantic-role pointers. Returns the list of
398
398
  * findings (empty = clean). Advisory only — the caller must never fail the
399
399
  * build on these alone.
400
400
  */
401
- declare function validateSemanticRoles(stack: AnyRec$h): SemanticRoleFinding[];
401
+ declare function validateSemanticRoles(stack: AnyRec$l): SemanticRoleFinding[];
402
402
 
403
403
  /**
404
404
  * Build-time form-layout diagnostics (#2578).
@@ -441,12 +441,12 @@ interface FormLayoutFinding {
441
441
  /** How to fix it. */
442
442
  hint: string;
443
443
  }
444
- type AnyRec$g = Record<string, unknown>;
444
+ type AnyRec$k = Record<string, unknown>;
445
445
  /**
446
446
  * Validate authored form-view layout. Returns findings (empty = clean).
447
447
  * Advisory only — the caller must never fail the build on these alone.
448
448
  */
449
- declare function validateFormLayout(stack: AnyRec$g): FormLayoutFinding[];
449
+ declare function validateFormLayout(stack: AnyRec$k): FormLayoutFinding[];
450
450
 
451
451
  /**
452
452
  * Build-time conditional-visibility diagnostics (ADR-0089 D3b).
@@ -508,7 +508,7 @@ interface VisibilityFinding {
508
508
  /** How to fix it. */
509
509
  hint: string;
510
510
  }
511
- type AnyRec$f = Record<string, unknown>;
511
+ type AnyRec$j = Record<string, unknown>;
512
512
  /**
513
513
  * Validate conditional-visibility keys across authored views and pages.
514
514
  *
@@ -523,7 +523,7 @@ type AnyRec$f = Record<string, unknown>;
523
523
  * `*.view.ts` / `*.page.ts` surfaces (so a `data.`-rooted predicate is flagged). The
524
524
  * alias-deprecated check is layer-agnostic.
525
525
  */
526
- declare function validateVisibilityPredicates(stack: AnyRec$f, opts?: VisibilityOptions): VisibilityFinding[];
526
+ declare function validateVisibilityPredicates(stack: AnyRec$j, opts?: VisibilityOptions): VisibilityFinding[];
527
527
 
528
528
  declare const CAPABILITY_REFERENCE_UNKNOWN = "capability-reference-unknown";
529
529
  type CapabilityRefSeverity = 'error' | 'warning';
@@ -541,12 +541,12 @@ interface CapabilityRefFinding {
541
541
  /** How to fix it. */
542
542
  hint: string;
543
543
  }
544
- type AnyRec$e = Record<string, unknown>;
544
+ type AnyRec$i = Record<string, unknown>;
545
545
  /**
546
546
  * Validate every capability reference in a stack. Returns findings (empty =
547
547
  * clean). Advisory only — callers must not fail the build on these alone.
548
548
  */
549
- declare function validateCapabilityReferences(stack: AnyRec$e): CapabilityRefFinding[];
549
+ declare function validateCapabilityReferences(stack: AnyRec$i): CapabilityRefFinding[];
550
550
 
551
551
  declare const APPROVAL_APPROVER_NOT_MEMBERSHIP_TIER = "approval-approver-not-membership-tier";
552
552
  declare const APPROVAL_APPROVER_TYPE_DEPRECATED = "approval-approver-type-deprecated";
@@ -571,12 +571,12 @@ interface ApprovalApproverFinding {
571
571
  /** How to fix it. */
572
572
  hint: string;
573
573
  }
574
- type AnyRec$d = Record<string, unknown>;
574
+ type AnyRec$h = Record<string, unknown>;
575
575
  /**
576
576
  * Validate the approvers of every Approval node in the stack's flows.
577
577
  * Returns findings (empty = clean).
578
578
  */
579
- declare function validateApprovalApprovers(stack: AnyRec$d): ApprovalApproverFinding[];
579
+ declare function validateApprovalApprovers(stack: AnyRec$h): ApprovalApproverFinding[];
580
580
 
581
581
  type SeedReplaySafetySeverity = 'error' | 'warning';
582
582
  interface SeedReplaySafetyFinding {
@@ -590,7 +590,7 @@ interface SeedReplaySafetyFinding {
590
590
  hint: string;
591
591
  }
592
592
  declare const SEED_INSERT_MODE_DUPLICATES_ON_REPLAY = "seed-insert-mode-duplicates-on-replay";
593
- type AnyRec$c = Record<string, unknown>;
593
+ type AnyRec$g = Record<string, unknown>;
594
594
  /**
595
595
  * Flag every seed dataset declared with `mode: 'insert'` — the one non-idempotent
596
596
  * mode, which duplicates its rows on every replay boot (framework#3434). Returns
@@ -600,7 +600,7 @@ type AnyRec$c = Record<string, unknown>;
600
600
  * Reads `stack.data` (the `SeedSchema[]` fixtures). Safe on any shape — a stack
601
601
  * with no `data` array yields no findings.
602
602
  */
603
- declare function validateSeedReplaySafety(stack: AnyRec$c): SeedReplaySafetyFinding[];
603
+ declare function validateSeedReplaySafety(stack: AnyRec$g): SeedReplaySafetyFinding[];
604
604
 
605
605
  type SeedStateMachineSeverity = 'warning';
606
606
  interface SeedStateMachineFinding {
@@ -614,7 +614,7 @@ interface SeedStateMachineFinding {
614
614
  hint: string;
615
615
  }
616
616
  declare const SEED_VALUE_OUTSIDE_STATE_MACHINE = "seed-value-outside-state-machine";
617
- type AnyRec$b = Record<string, unknown>;
617
+ type AnyRec$f = Record<string, unknown>;
618
618
  /**
619
619
  * Flag every seed record whose `state_machine`-governed field carries a value
620
620
  * the machine does not declare (framework#3433 follow-up). Returns the findings
@@ -627,7 +627,7 @@ type AnyRec$b = Record<string, unknown>;
627
627
  * unresolved `cel` Expression envelope, a number) is skipped: it cannot be
628
628
  * statically compared to the declared-state set.
629
629
  */
630
- declare function validateSeedStateMachine(stack: AnyRec$b): SeedStateMachineFinding[];
630
+ declare function validateSeedStateMachine(stack: AnyRec$f): SeedStateMachineFinding[];
631
631
 
632
632
  declare const SECURITY_OWD_UNSET = "security-owd-unset";
633
633
  declare const SECURITY_OWD_ALIAS = "security-owd-alias";
@@ -654,7 +654,7 @@ interface SecurityFinding {
654
654
  /** How to fix it. */
655
655
  hint: string;
656
656
  }
657
- type AnyRec$a = Record<string, unknown>;
657
+ type AnyRec$e = Record<string, unknown>;
658
658
  /**
659
659
  * Validate the security posture of a stack. Returns findings (empty = clean).
660
660
  * `error` findings gate the build in `os compile`; `info` is advisory.
@@ -662,7 +662,7 @@ type AnyRec$a = Record<string, unknown>;
662
662
  * `opts.nowMs` injects the clock for the ADR-0091 authoring-time expiry rule
663
663
  * (tests); production callers omit it.
664
664
  */
665
- declare function validateSecurityPosture(stack: AnyRec$a, opts?: {
665
+ declare function validateSecurityPosture(stack: AnyRec$e, opts?: {
666
666
  nowMs?: number;
667
667
  }): SecurityFinding[];
668
668
 
@@ -796,13 +796,13 @@ interface DashboardActionRefFinding {
796
796
  /** How to fix it. */
797
797
  hint: string;
798
798
  }
799
- type AnyRec$9 = Record<string, unknown>;
799
+ type AnyRec$d = Record<string, unknown>;
800
800
  /**
801
801
  * Validate every dashboard header / widget action reference in a stack. Returns
802
802
  * findings (empty = clean). `script`/`modal` dead targets are errors; `url`
803
803
  * unresolved routes are warnings.
804
804
  */
805
- declare function validateDashboardActionRefs(stack: AnyRec$9): DashboardActionRefFinding[];
805
+ declare function validateDashboardActionRefs(stack: AnyRec$d): DashboardActionRefFinding[];
806
806
 
807
807
  /**
808
808
  * Build-time filter-placeholder diagnostics (issue #3574).
@@ -900,12 +900,41 @@ interface ObjectRefFinding {
900
900
  /** How to fix it. */
901
901
  hint: string;
902
902
  }
903
- type AnyRec$8 = Record<string, unknown>;
903
+ type AnyRec$c = Record<string, unknown>;
904
904
  /**
905
905
  * Validate every object-name reference on the surfaces listed in the module
906
906
  * header. Returns findings (empty = clean).
907
907
  */
908
- declare function validateObjectReferences(stack: AnyRec$8): ObjectRefFinding[];
908
+ declare function validateObjectReferences(stack: AnyRec$c): ObjectRefFinding[];
909
+
910
+ declare const SEARCHABLE_FIELD_UNKNOWN = "searchable-field-unknown";
911
+ type SearchableFieldSeverity = 'error' | 'warning';
912
+ interface SearchableFieldFinding {
913
+ /** Always `error` — a stale entry narrows, widens or refuses the search (see module note). */
914
+ severity: SearchableFieldSeverity;
915
+ /** Diagnostic rule id. */
916
+ rule: string;
917
+ /** Human-readable location, e.g. `object "crm_lead"`. */
918
+ where: string;
919
+ /** Config path, e.g. `objects[0].searchableFields[2]`. */
920
+ path: string;
921
+ /** What is wrong. */
922
+ message: string;
923
+ /** How to fix it. */
924
+ hint: string;
925
+ }
926
+ type AnyRec$b = Record<string, unknown>;
927
+ /**
928
+ * Validate every `searchableFields` declaration in the stack — the object's own
929
+ * (the canonical set, ADR-0061) and the list views that narrow it. Returns
930
+ * findings (empty = clean).
931
+ *
932
+ * The react page surface (`<ListView searchableFields={…}>`) is deliberately
933
+ * NOT walked here: its declaration lives inside JSX source, and
934
+ * `validate-react-page-props` — the gate that already parses that source —
935
+ * runs the same `checkSearchableFieldList` core on it (#4329).
936
+ */
937
+ declare function validateSearchableFields(stack: AnyRec$b): SearchableFieldFinding[];
909
938
 
910
939
  declare const ACTION_NAME_UNDEFINED = "action-name-undefined";
911
940
  type ActionNameRefSeverity = 'error' | 'warning';
@@ -923,12 +952,12 @@ interface ActionNameRefFinding {
923
952
  /** How to fix it. */
924
953
  hint: string;
925
954
  }
926
- type AnyRec$7 = Record<string, unknown>;
955
+ type AnyRec$a = Record<string, unknown>;
927
956
  /**
928
957
  * Validate every name-bound action reference in a stack. Returns findings
929
958
  * (empty = clean).
930
959
  */
931
- declare function validateActionNameRefs(stack: AnyRec$7): ActionNameRefFinding[];
960
+ declare function validateActionNameRefs(stack: AnyRec$a): ActionNameRefFinding[];
932
961
 
933
962
  /**
934
963
  * Shared page-component traversal for the lint rules that inspect
@@ -954,7 +983,7 @@ declare function validateActionNameRefs(stack: AnyRec$7): ActionNameRefFinding[]
954
983
  * author never wrote, so those pages are skipped here and covered by
955
984
  * `validate-jsx-pages` / `validate-react-page-props` instead.
956
985
  */
957
- type AnyRec$6 = Record<string, unknown>;
986
+ type AnyRec$9 = Record<string, unknown>;
958
987
 
959
988
  /**
960
989
  * [ADR-0078 — completeness] Field-reference integrity for page components
@@ -993,11 +1022,28 @@ type AnyRec$6 = Record<string, unknown>;
993
1022
  * `record:details` `sections[].fields[]` and `hideFields[]`, and the record
994
1023
  * picker's `labelField`. Linting the schema's shape alone would find nothing on
995
1024
  * the actual corpus.
1025
+ *
1026
+ * ── Shared with the react page surface ──────────────────────────────────
1027
+ *
1028
+ * A `kind:'react'` page authors the SAME components, one surface over, as JSX
1029
+ * props instead of a `properties` bag (`<RecordHighlights fields={…}>`). The
1030
+ * extraction and the check are therefore exported — `COMPONENT_FIELD_SPECS`,
1031
+ * {@link componentFieldRefs}, {@link relatedListFieldRefs},
1032
+ * {@link indexObjectFields}, {@link checkFieldRefs} — and
1033
+ * `validate-react-page-props` runs them on the parsed JSX (#4340). Same table,
1034
+ * same skips, same rule id: the two surfaces agree on what counts as a field by
1035
+ * construction rather than by two lists that happen to match, which is the
1036
+ * drift #4330 had just finished removing from the system-field lists.
996
1037
  */
997
1038
  declare const PAGE_FIELD_UNKNOWN = "page-field-unknown";
998
1039
  type PageFieldSeverity = 'error' | 'warning';
999
1040
  interface PageFieldFinding {
1000
- /** Always `warning` — page renderers skip an unknown field rather than fail. */
1041
+ /**
1042
+ * `warning` on every surface this rule itself walks — page renderers skip an
1043
+ * unknown field rather than fail. The shared {@link checkFieldRefs} core also
1044
+ * serves the react page surface, where one batch of refs reaches a QUERY
1045
+ * rather than a renderer and gates instead; see {@link FieldRefConsequence}.
1046
+ */
1001
1047
  severity: PageFieldSeverity;
1002
1048
  /** Diagnostic rule id. */
1003
1049
  rule: string;
@@ -1011,7 +1057,7 @@ interface PageFieldFinding {
1011
1057
  hint: string;
1012
1058
  }
1013
1059
 
1014
- declare function validatePageFieldBindings(stack: AnyRec$6): PageFieldFinding[];
1060
+ declare function validatePageFieldBindings(stack: AnyRec$9): PageFieldFinding[];
1015
1061
 
1016
1062
  /**
1017
1063
  * [ADR-0021 — semantic layer] Chart-binding integrity for the surfaces the
@@ -1068,7 +1114,7 @@ interface ChartBindingFinding {
1068
1114
  hint: string;
1069
1115
  }
1070
1116
 
1071
- declare function validateChartBindings(stack: AnyRec$6): ChartBindingFinding[];
1117
+ declare function validateChartBindings(stack: AnyRec$9): ChartBindingFinding[];
1072
1118
 
1073
1119
  declare const NAV_OBJECT_UNGRANTED = "nav-object-ungranted";
1074
1120
  type NavAccessSeverity = 'error' | 'warning';
@@ -1086,12 +1132,12 @@ interface NavAccessFinding {
1086
1132
  /** How to fix it. */
1087
1133
  hint: string;
1088
1134
  }
1089
- type AnyRec$5 = Record<string, unknown>;
1135
+ type AnyRec$8 = Record<string, unknown>;
1090
1136
  /**
1091
1137
  * Validate that every object a stack's navigation exposes is readable by at
1092
1138
  * least one permission set the stack declares. Returns findings (empty = clean).
1093
1139
  */
1094
- declare function validateNavAccess(stack: AnyRec$5): NavAccessFinding[];
1140
+ declare function validateNavAccess(stack: AnyRec$8): NavAccessFinding[];
1095
1141
 
1096
1142
  declare const TRANSLATION_TARGET_UNKNOWN = "translation-target-unknown";
1097
1143
  declare const TRANSLATION_OPTION_KEY_UNKNOWN = "translation-option-key-unknown";
@@ -1110,12 +1156,12 @@ interface TranslationRefFinding {
1110
1156
  /** How to fix it. */
1111
1157
  hint: string;
1112
1158
  }
1113
- type AnyRec$4 = Record<string, unknown>;
1159
+ type AnyRec$7 = Record<string, unknown>;
1114
1160
  /**
1115
1161
  * Validate every reference a translation bundle makes against the metadata it
1116
1162
  * claims to translate. Returns findings (empty = clean).
1117
1163
  */
1118
- declare function validateTranslationReferences(stack: AnyRec$4): TranslationRefFinding[];
1164
+ declare function validateTranslationReferences(stack: AnyRec$7): TranslationRefFinding[];
1119
1165
 
1120
1166
  /**
1121
1167
  * [ADR-0064 §3] Skill ↔ agent surface affinity (issue #3820).
@@ -1160,12 +1206,12 @@ interface AiSurfaceAffinityFinding {
1160
1206
  /** How to fix it. */
1161
1207
  hint: string;
1162
1208
  }
1163
- type AnyRec$3 = Record<string, unknown>;
1209
+ type AnyRec$6 = Record<string, unknown>;
1164
1210
  /**
1165
1211
  * Validate every in-stack agent→skill binding against the ADR-0064 §3 surface
1166
1212
  * affinity contract. Returns findings (empty = clean).
1167
1213
  */
1168
- declare function validateAiSurfaceAffinity(stack: AnyRec$3): AiSurfaceAffinityFinding[];
1214
+ declare function validateAiSurfaceAffinity(stack: AnyRec$6): AiSurfaceAffinityFinding[];
1169
1215
 
1170
1216
  declare const AI_SKILL_TOOL_UNRESOLVED = "ai-skill-tool-unresolved";
1171
1217
  type AiToolRefSeverity = 'error' | 'warning';
@@ -1183,12 +1229,12 @@ interface AiToolRefFinding {
1183
1229
  /** How to fix it. */
1184
1230
  hint: string;
1185
1231
  }
1186
- type AnyRec$2 = Record<string, unknown>;
1232
+ type AnyRec$5 = Record<string, unknown>;
1187
1233
  /**
1188
1234
  * Validate every `skill.tools[]` reference in a stack. Returns findings
1189
1235
  * (empty = clean).
1190
1236
  */
1191
- declare function validateAiToolReferences(stack: AnyRec$2): AiToolRefFinding[];
1237
+ declare function validateAiToolReferences(stack: AnyRec$5): AiToolRefFinding[];
1192
1238
 
1193
1239
  /**
1194
1240
  * [ADR-0063 §2] `stack.agents` is a platform-internal slot (issue #3820).
@@ -1233,12 +1279,202 @@ interface AiAgentAuthoringFinding {
1233
1279
  /** How to fix it. */
1234
1280
  hint: string;
1235
1281
  }
1236
- type AnyRec$1 = Record<string, unknown>;
1282
+ type AnyRec$4 = Record<string, unknown>;
1237
1283
  /**
1238
1284
  * Flag every agent declared in a stack. Returns findings (empty = clean,
1239
1285
  * which is what every app package should be).
1240
1286
  */
1241
- declare function validateAiAgentAuthoring(stack: AnyRec$1): AiAgentAuthoringFinding[];
1287
+ declare function validateAiAgentAuthoring(stack: AnyRec$4): AiAgentAuthoringFinding[];
1288
+
1289
+ type HookBodyWriteSeverity = 'warning';
1290
+ interface HookBodyWriteFinding {
1291
+ /** v1 is advisory-only by contract — the type says so. */
1292
+ severity: HookBodyWriteSeverity;
1293
+ rule: string;
1294
+ /** Human-readable location, e.g. `hook "normalize_lead" › body`. */
1295
+ where: string;
1296
+ /** Config path, e.g. `hooks[0].body.source`. */
1297
+ path: string;
1298
+ message: string;
1299
+ hint: string;
1300
+ }
1301
+ declare const HOOK_BODY_WRITE_UNKNOWN_FIELD = "hook-body-write-unknown-field";
1302
+ /** One syntactic write shape the extractor recognizes. */
1303
+ interface HookBodyWritePattern {
1304
+ /** Stable pattern id, carried on every extracted write. */
1305
+ readonly id: string;
1306
+ /** Author-facing syntax summary (for docs/diagnostics, not matching). */
1307
+ readonly syntax: string;
1308
+ /** Reconciliation fixture: extracting `source` must yield exactly `writes`. */
1309
+ readonly example: {
1310
+ readonly source: string;
1311
+ readonly writes: ReadonlyArray<{
1312
+ field: string;
1313
+ object?: string;
1314
+ }>;
1315
+ };
1316
+ }
1317
+ declare const HOOK_BODY_WRITE_PATTERNS: readonly HookBodyWritePattern[];
1318
+ /** A ledger pattern a given rule does NOT consume, and why. */
1319
+ interface BodyWritePatternExclusion {
1320
+ /** The {@link HOOK_BODY_WRITE_PATTERNS} entry id being excluded. */
1321
+ readonly id: string;
1322
+ /** Why the shape does not mean the same thing on this rule's surface. */
1323
+ readonly reason: string;
1324
+ }
1325
+ /**
1326
+ * The ledger shapes THIS rule consumes.
1327
+ *
1328
+ * Declared rather than implied: before the ledger carried a shape the hook
1329
+ * surface does not have, every write with no `object` was necessarily a
1330
+ * `ctx.input` write, and the rule could branch on that alone. It no longer can
1331
+ * — a `record-property-assign` write also carries no object, and would have
1332
+ * been reported as "the hook writes 'stage' to its input", which is false.
1333
+ * Each consumer declaring its own subset is what stops the next added shape
1334
+ * from silently landing in a branch that was never written for it.
1335
+ */
1336
+ declare const HOOK_BODY_WRITE_PATTERN_IDS: readonly string[];
1337
+ /** Ledger shapes this rule leaves alone, each with its reason. */
1338
+ declare const HOOK_BODY_WRITE_EXCLUSIONS: readonly BodyWritePatternExclusion[];
1339
+ type AnyRec$3 = Record<string, unknown>;
1340
+ /** One statically-extracted field write found in an L2 body. */
1341
+ interface ExtractedHookBodyWrite {
1342
+ /** Which {@link HOOK_BODY_WRITE_PATTERNS} entry matched. */
1343
+ patternId: string;
1344
+ /** Target object name; `undefined` = the hook's own target object(s). */
1345
+ object?: string;
1346
+ /** The `ctx.api` method for diagnostics (`insert`/`create`/`update`/`updateById`). */
1347
+ method?: string;
1348
+ field: string;
1349
+ }
1350
+ /** Everything one parse of an L2 body yields. */
1351
+ interface ExtractedHookBodyWriteSet {
1352
+ /** Every literal write the {@link HOOK_BODY_WRITE_PATTERNS} ledger declares. */
1353
+ writes: ExtractedHookBodyWrite[];
1354
+ /**
1355
+ * `ctx.record` is handed to something as a VALUE somewhere in the body — an
1356
+ * argument, an assignment RHS, a spread, a return — rather than only having
1357
+ * its properties read and written, or being truthiness/type tested.
1358
+ *
1359
+ * The action rule needs this to tell a dead snapshot write from a live one:
1360
+ * `ctx.record.stage = 'won'; await ctx.api.object('d').update(ctx.record)`
1361
+ * builds a payload and persists it, so the assignment is not a no-op. When
1362
+ * this is true, no record write in the body can be judged, and none is
1363
+ * reported. (One-level aliasing — `const r = ctx.record` — reads as an
1364
+ * escape too, which is the safe direction: it suppresses findings.)
1365
+ */
1366
+ ctxRecordEscapes: boolean;
1367
+ }
1368
+ /**
1369
+ * Extract every literal field write the pattern ledger declares from an L2
1370
+ * body's source. Parse-only (the source is never executed), error-tolerant
1371
+ * (a body with syntax errors simply yields fewer matches), and lazy: the
1372
+ * TypeScript compiler is not loaded when no pattern can possibly match.
1373
+ *
1374
+ * Thin projection of {@link extractHookBodyWriteSet} — use that one when the
1375
+ * `ctx.record` liveness signal matters, so the body is parsed once, not twice.
1376
+ */
1377
+ declare function extractHookBodyWrites(source: string): ExtractedHookBodyWrite[];
1378
+ /** {@link extractHookBodyWrites} plus the `ctx.record` liveness signal, one parse. */
1379
+ declare function extractHookBodyWriteSet(source: string): ExtractedHookBodyWriteSet;
1380
+ /**
1381
+ * Validate L2 hook-body writes against target-object field declarations.
1382
+ * Pure `(stack) => Finding[]` (ADR-0019); safe on pre- or post-parse stacks.
1383
+ */
1384
+ declare function validateHookBodyWrites(stack: AnyRec$3): HookBodyWriteFinding[];
1385
+
1386
+ type ActionBodyWriteSeverity = 'warning';
1387
+ interface ActionBodyWriteFinding {
1388
+ /** Advisory-only by contract, exactly like the hook rule — the type says so. */
1389
+ severity: ActionBodyWriteSeverity;
1390
+ rule: string;
1391
+ /** Human-readable location, e.g. `action "close_deal" › body`. */
1392
+ where: string;
1393
+ /** Config path, e.g. `actions[0].body.source`. */
1394
+ path: string;
1395
+ message: string;
1396
+ hint: string;
1397
+ }
1398
+ declare const ACTION_BODY_WRITE_UNKNOWN_FIELD = "action-body-write-unknown-field";
1399
+ declare const ACTION_RECORD_WRITE_DISCARDED = "action-record-write-discarded";
1400
+ /** @deprecated alias — the exclusion shape is shared with the hook rule. */
1401
+ type ActionBodyWriteExclusion = BodyWritePatternExclusion;
1402
+ /**
1403
+ * Ledger shapes the UNKNOWN-FIELD check consumes — resolved against the named
1404
+ * object's declared fields.
1405
+ *
1406
+ * Include-list, not exclude-list, on purpose: an unclassified new pattern is
1407
+ * then inert here (a missed finding) rather than live against a context it was
1408
+ * never reasoned about (a false one) — the same asymmetry the extractor's
1409
+ * silent bails follow.
1410
+ */
1411
+ declare const ACTION_BODY_WRITE_PATTERN_IDS: readonly string[];
1412
+ /**
1413
+ * Ledger shapes the DISCARDED-RECORD-WRITE check consumes — never resolved
1414
+ * against anything, because no field name can make a discarded write land.
1415
+ */
1416
+ declare const ACTION_RECORD_WRITE_PATTERN_IDS: readonly string[];
1417
+ /** Shared-ledger patterns neither check consumes, each with its reason. */
1418
+ declare const ACTION_BODY_WRITE_EXCLUSIONS: readonly BodyWritePatternExclusion[];
1419
+ /**
1420
+ * The subset of the shared ledger the unknown-field check sees — the published
1421
+ * answer to "which writes does the action lint resolve against fields?".
1422
+ */
1423
+ declare const ACTION_BODY_WRITE_PATTERNS: readonly HookBodyWritePattern[];
1424
+ /** The subset the discarded-record-write check sees. */
1425
+ declare const ACTION_RECORD_WRITE_PATTERNS: readonly HookBodyWritePattern[];
1426
+ type AnyRec$2 = Record<string, unknown>;
1427
+ /**
1428
+ * Validate L2 action-body writes against target-object field declarations.
1429
+ * Pure `(stack) => Finding[]` (ADR-0019); safe on pre- or post-parse stacks.
1430
+ */
1431
+ declare function validateActionBodyWrites(stack: AnyRec$2): ActionBodyWriteFinding[];
1432
+
1433
+ type FlowNodeWriteSeverity = 'error';
1434
+ interface FlowNodeWriteFinding {
1435
+ /** Always `error` — a literal key against a literal object is a certainty (see module note). */
1436
+ severity: FlowNodeWriteSeverity;
1437
+ rule: string;
1438
+ /** Human-readable location, e.g. `flow "close_deal" › node "Mark won"`. */
1439
+ where: string;
1440
+ /** Config path, e.g. `flows[0].nodes[3].config.fields.stagee`. */
1441
+ path: string;
1442
+ message: string;
1443
+ hint: string;
1444
+ }
1445
+ declare const FLOW_NODE_WRITE_UNKNOWN_FIELD = "flow-node-write-unknown-field";
1446
+ /** Flow node types whose `config.fields` keys this rule resolves. */
1447
+ declare const FLOW_WRITE_NODE_TYPES: readonly string[];
1448
+ /** A `fields`-bearing node type this rule does NOT cover yet, and why. */
1449
+ interface FlowWriteNodeDeferral {
1450
+ /** The `FlowNode.type` left uncovered. */
1451
+ readonly type: string;
1452
+ /** Why it is not covered, in terms a reviewer can act on. */
1453
+ readonly reason: string;
1454
+ }
1455
+ /**
1456
+ * `fields`-bearing CRUD node types deliberately left uncovered.
1457
+ *
1458
+ * **Empty, and that is the point.** #4369 shipped `update_record` alone and
1459
+ * parked `create_record` here with its reason — a gating rule earning its
1460
+ * severity one measured surface at a time — rather than leaving the other half
1461
+ * as silence. #4371 measured the INSERT path (`table deal has no column named
1462
+ * stagee`, and the row never created at all), found it strictly worse than the
1463
+ * UPDATE one, and moved it across.
1464
+ *
1465
+ * The slot stays because the partition test derives the full `fields`-write-map
1466
+ * set from the spec's own config schemas: a node type that grows one later
1467
+ * belongs to neither list and fails that test until someone puts it in one.
1468
+ * Deleting this array would turn that forced decision back into a default.
1469
+ */
1470
+ declare const FLOW_WRITE_NODE_TYPES_DEFERRED: readonly FlowWriteNodeDeferral[];
1471
+ type AnyRec$1 = Record<string, unknown>;
1472
+ /**
1473
+ * Validate flow write-node `fields` keys against the target object's declared
1474
+ * fields. Pure `(stack) => Finding[]` (ADR-0019); safe on pre- or post-parse
1475
+ * stacks.
1476
+ */
1477
+ declare function validateFlowNodeWrites(stack: AnyRec$1): FlowNodeWriteFinding[];
1242
1478
 
1243
1479
  type ReferenceIntegritySeverity = 'error' | 'warning';
1244
1480
  /**
@@ -1302,4 +1538,4 @@ declare function buildAccessMatrix(stack: AnyRec): AccessMatrix;
1302
1538
  */
1303
1539
  declare function diffAccessMatrix(before: AccessMatrix, after: AccessMatrix): string[];
1304
1540
 
1305
- export { ACTION_NAME_UNDEFINED, 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_DECISION_OUTPUTS_RESERVED, APPROVAL_ESCALATION_REASSIGN_NO_TARGET, APPROVAL_EXPRESSION_INVALID, APPROVAL_EXPRESSION_NO_EMPTY_POLICY, type ActionNameRefFinding, type ActionNameRefSeverity, type AiAgentAuthoringFinding, type AiAgentAuthoringSeverity, type AiSurfaceAffinityFinding, type AiSurfaceAffinitySeverity, type AiToolRefFinding, type AiToolRefSeverity, type ApprovalApproverFinding, type ApprovalApproverSeverity, CAPABILITY_REFERENCE_UNKNOWN, CHART_AXIS_NOT_SELECTED, CHART_CONFIG_MISSING, CHART_DATASET_UNKNOWN, CHART_DIMENSION_UNKNOWN, CHART_FIELD_UNKNOWN, CHART_MEASURE_UNKNOWN, type CapabilityRefFinding, type CapabilityRefSeverity, type ChartBindingFinding, type ChartBindingSeverity, DASHBOARD_ACTION_ROUTE_UNRESOLVED, DASHBOARD_ACTION_TARGET_UNDEFINED, DASHBOARD_FILTER_FIELD_UNKNOWN, type DashboardActionRefFinding, type DashboardActionRefSeverity, type ExprIssue, FIELD_GROUP_EMPTY, FIELD_GROUP_UNDECLARED, FILTER_TOKEN_UNKNOWN, FLOW_DRAFT_STATUS_AMBIGUOUS, FLOW_TEMPLATE_LOOKUP_TRAVERSAL, FLOW_TEMPLATE_UNKNOWN_FIELD, FLOW_TRIGGER_UNKNOWN_OBJECT, FLOW_UPDATE_READONLY_FIELD, FLOW_UPDATE_READONLY_WHEN_FIELD, FORM_COLSPAN_ABSOLUTE, FORM_FIELD_UNKNOWN, type FilterTokenFinding, type FilterTokenSeverity, type FlowTemplatePathFinding, type FlowTemplatePathSeverity, type FlowTriggerReadinessFinding, type FlowTriggerReadinessSeverity, type FormLayoutFinding, type FormLayoutSeverity, type JsxPageFinding, type JsxPageSeverity, LIST_VIEW_FILTERS_IN_VIEWS_MODE, type ListViewModeFinding, type ListViewModeSeverity, MEASURE_AGGREGATE_INCOHERENT, NAV_OBJECT_UNGRANTED, type NavAccessFinding, type NavAccessSeverity, 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_CHART_AGGREGATE_INVALID, REACT_CHART_AXIS_UNKNOWN, REACT_CHART_FIELD_UNKNOWN, REFERENCE_INTEGRITY_RULES, type ReactPageFinding, type ReactPageSeverity, type ReactPropFinding, type ReactPropSeverity, type ReadonlyFlowWriteFinding, type ReadonlyFlowWriteSeverity, type RecordTitleFinding, type RecordTitleSeverity, type ReferenceIntegrityFinding, type ReferenceIntegrityRule, type ReferenceIntegritySeverity, SECURITY_ANCHOR_HIGH_PRIVILEGE, SECURITY_BOOK_AUDIENCE_UNKNOWN_SET, SECURITY_DELEGATION_MISSING_REASON, SECURITY_EXTERNAL_WIDER, 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, STYLE_CLASSNAME_TAILWIND, STYLE_NODE_MISSING_ID, STYLE_RESPONSIVE_NO_BASE, STYLE_UNKNOWN_CSS_PROPERTY, STYLE_UNKNOWN_TOKEN, type SecurityFinding, type SecuritySeverity, type SeedReplaySafetyFinding, type SeedReplaySafetySeverity, type SeedStateMachineFinding, type SeedStateMachineSeverity, type SemanticRoleFinding, type SemanticRoleSeverity, type SourceStyleFinding, type SourceStyleSeverity, type StyleFinding, type StyleSeverity, TABLE_COUNT_ONLY, TITLE_FORMAT_RETIRED, TITLE_UNRESOLVABLE, TRANSLATION_OPTION_KEY_UNKNOWN, TRANSLATION_TARGET_UNKNOWN, type TranslationRefFinding, type TranslationRefSeverity, VIEW_CONTAINER_SHAPE, VISIBILITY_ALIAS_DEPRECATED, VISIBILITY_ROOT_MISLAYERED, type ViewContainerFinding, type ViewContainerSeverity, type VisibilityFinding, type VisibilityLayer, type VisibilityOptions, type VisibilitySeverity, WIDGET_DATASET_UNKNOWN, WIDGET_DIMENSION_UNKNOWN, WIDGET_MEASURE_UNKNOWN, type WidgetBindingFinding, type WidgetBindingSeverity, buildAccessMatrix, diffAccessMatrix, validateActionNameRefs, validateAiAgentAuthoring, validateAiSurfaceAffinity, validateAiToolReferences, validateApprovalApprovers, validateCapabilityReferences, validateChartBindings, validateDashboardActionRefs, validateFilterTokens, validateFlowTemplatePaths, validateFlowTriggerReadiness, validateFormLayout, validateJsxPages, validateListViewMode, validateNavAccess, validateObjectReferences, validateOrgAxisRedLines, validatePageFieldBindings, validatePageSourceStyling, validateReactPageProps, validateReactPages, validateReadonlyFlowWrites, validateRecordTitle, validateReferenceIntegrity, validateResponsiveStyles, validateSecurityPosture, validateSeedReplaySafety, validateSeedStateMachine, validateSemanticRoles, validateStackExpressions, validateTranslationReferences, validateViewContainers, validateVisibilityPredicates, validateWidgetBindings };
1541
+ export { ACTION_BODY_WRITE_EXCLUSIONS, ACTION_BODY_WRITE_PATTERNS, ACTION_BODY_WRITE_PATTERN_IDS, ACTION_BODY_WRITE_UNKNOWN_FIELD, ACTION_NAME_UNDEFINED, 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_DECISION_OUTPUTS_RESERVED, APPROVAL_ESCALATION_REASSIGN_NO_TARGET, APPROVAL_EXPRESSION_INVALID, APPROVAL_EXPRESSION_NO_EMPTY_POLICY, type ActionBodyWriteExclusion, type ActionBodyWriteFinding, type ActionBodyWriteSeverity, type ActionNameRefFinding, type ActionNameRefSeverity, type AiAgentAuthoringFinding, type AiAgentAuthoringSeverity, type AiSurfaceAffinityFinding, type AiSurfaceAffinitySeverity, type AiToolRefFinding, type AiToolRefSeverity, type ApprovalApproverFinding, type ApprovalApproverSeverity, type BodyWritePatternExclusion, CAPABILITY_REFERENCE_UNKNOWN, CHART_AXIS_NOT_SELECTED, CHART_CONFIG_MISSING, CHART_DATASET_UNKNOWN, CHART_DIMENSION_UNKNOWN, CHART_FIELD_UNKNOWN, CHART_MEASURE_UNKNOWN, type CapabilityRefFinding, type CapabilityRefSeverity, type ChartBindingFinding, type ChartBindingSeverity, 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_UNDECLARED, FILTER_TOKEN_UNKNOWN, FLOW_DRAFT_STATUS_AMBIGUOUS, FLOW_NODE_WRITE_UNKNOWN_FIELD, FLOW_TEMPLATE_LOOKUP_TRAVERSAL, FLOW_TEMPLATE_UNKNOWN_FIELD, 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 FlowNodeWriteFinding, type FlowNodeWriteSeverity, type FlowTemplatePathFinding, type FlowTemplatePathSeverity, type FlowTriggerReadinessFinding, type FlowTriggerReadinessSeverity, type FlowWriteNodeDeferral, type FormLayoutFinding, type FormLayoutSeverity, 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, type ListViewModeFinding, type ListViewModeSeverity, MEASURE_AGGREGATE_INCOHERENT, NAV_OBJECT_UNGRANTED, type NavAccessFinding, type NavAccessSeverity, 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_CHART_AGGREGATE_INVALID, REACT_CHART_AXIS_UNKNOWN, REACT_CHART_FIELD_UNKNOWN, REFERENCE_INTEGRITY_RULES, type ReactPageFinding, type ReactPageSeverity, type ReactPropFinding, type ReactPropSeverity, type ReadonlyFlowWriteFinding, type ReadonlyFlowWriteSeverity, type RecordTitleFinding, type RecordTitleSeverity, type ReferenceIntegrityFinding, type ReferenceIntegrityRule, type ReferenceIntegritySeverity, SEARCHABLE_FIELD_UNKNOWN, SECURITY_ANCHOR_HIGH_PRIVILEGE, SECURITY_BOOK_AUDIENCE_UNKNOWN_SET, SECURITY_DELEGATION_MISSING_REASON, SECURITY_EXTERNAL_WIDER, 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, STYLE_CLASSNAME_TAILWIND, STYLE_NODE_MISSING_ID, STYLE_RESPONSIVE_NO_BASE, STYLE_UNKNOWN_CSS_PROPERTY, STYLE_UNKNOWN_TOKEN, type SearchableFieldFinding, type SearchableFieldSeverity, type SecurityFinding, type SecuritySeverity, type SeedReplaySafetyFinding, type SeedReplaySafetySeverity, type SeedStateMachineFinding, type SeedStateMachineSeverity, type SemanticRoleFinding, type SemanticRoleSeverity, type SourceStyleFinding, type SourceStyleSeverity, type StyleFinding, type StyleSeverity, TABLE_COUNT_ONLY, TITLE_FORMAT_RETIRED, TITLE_UNRESOLVABLE, TRANSLATION_OPTION_KEY_UNKNOWN, TRANSLATION_TARGET_UNKNOWN, type TranslationRefFinding, type TranslationRefSeverity, VIEW_CONTAINER_SHAPE, VISIBILITY_ALIAS_DEPRECATED, VISIBILITY_ROOT_MISLAYERED, type ViewContainerFinding, type ViewContainerSeverity, type VisibilityFinding, type VisibilityLayer, type VisibilityOptions, type VisibilitySeverity, WIDGET_DATASET_UNKNOWN, WIDGET_DIMENSION_UNKNOWN, WIDGET_MEASURE_UNKNOWN, type WidgetBindingFinding, type WidgetBindingSeverity, buildAccessMatrix, diffAccessMatrix, extractHookBodyWriteSet, extractHookBodyWrites, validateActionBodyWrites, validateActionNameRefs, validateAiAgentAuthoring, validateAiSurfaceAffinity, validateAiToolReferences, validateApprovalApprovers, validateCapabilityReferences, validateChartBindings, validateDashboardActionRefs, validateFilterTokens, validateFlowNodeWrites, validateFlowTemplatePaths, validateFlowTriggerReadiness, validateFormLayout, validateHookBodyWrites, validateJsxPages, validateListViewMode, validateNavAccess, validateObjectReferences, validateOrgAxisRedLines, validatePageFieldBindings, validatePageSourceStyling, validateReactPageProps, validateReactPages, validateReadonlyFlowWrites, validateRecordTitle, validateReferenceIntegrity, validateResponsiveStyles, validateSearchableFields, validateSecurityPosture, validateSeedReplaySafety, validateSeedStateMachine, validateSemanticRoles, validateStackExpressions, validateTranslationReferences, validateViewContainers, validateVisibilityPredicates, validateWidgetBindings };