@webability/core 1.18.0 → 1.19.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.cts CHANGED
@@ -1,9 +1,144 @@
1
- import { P as PageLike, S as ScanOptions, a as ScanResult, W as WcagLevel, b as SiteTheme, F as FixDetector, I as InternalBug, D as DetectedIssue, c as ScanIssue } from './types-Bk-B2Y9X.cjs';
2
- export { B as BrowserDetector, d as DEFAULT_JUDGE_BASE_URL, e as DEFAULT_JUDGE_TEXT_MODEL, f as DEFAULT_JUDGE_VISION_MODEL, g as FixIssueType, h as IssueImpact, i as IssueSource, J as JUDGE_DEFAULT_TIMEOUT_MS, j as JUDGE_SYSTEM_PROMPT, k as JudgeChatBody, l as JudgeItem, m as JudgeOptions, n as JudgeRequest, o as JudgeTransport, p as JudgeVerdict, q as JudgedEntry, V as VIEWPORT_SIZES, r as ViewportPreset, s as WCAG_BY_ISSUE, t as buildJudgeChatBody, u as hostedJudgeTransport, v as judgeUndecided, w as openAiCompatibleTransport, x as resetJudgeCache } from './types-Bk-B2Y9X.cjs';
1
+ import { P as PageLike, S as ScanOptions, a as ScanResult, W as WcagLevel, I as IssueImpact, b as ScanIssue, J as JudgeOptions, c as InternalBug, d as JudgeTransport, e as SiteTheme, F as FixDetector, D as DetectedIssue } from './types-B_q8lTmv.cjs';
2
+ export { B as BrowserDetector, f as DEFAULT_JUDGE_BASE_URL, g as DEFAULT_JUDGE_TEXT_MODEL, h as DEFAULT_JUDGE_VISION_MODEL, i as FixIssueType, j as IssueSource, k as JUDGE_DEFAULT_TIMEOUT_MS, l as JUDGE_SYSTEM_PROMPT, m as JudgeChatBody, n as JudgeItem, o as JudgeRequest, p as JudgeVerdict, q as JudgedEntry, V as VIEWPORT_SIZES, r as ViewportPreset, s as WCAG_BY_ISSUE, t as buildJudgeChatBody, u as hostedJudgeTransport, v as judgeUndecided, w as openAiCompatibleTransport, x as resetJudgeCache } from './types-B_q8lTmv.cjs';
3
3
  export { F as FIX_JUDGE_MAX_FIXES, a as FixJudgeFix, b as FixJudgeHttpError, c as FixJudgeRequest, d as FixJudgeTransport, e as FixJudgeVerdict, f as FixJudgeVerdictKind, h as hostedFixJudgeTransport } from './hostedFixJudge-DXYes7X1.cjs';
4
4
 
5
5
  declare function scan(target: string | PageLike, options?: ScanOptions): Promise<ScanResult>;
6
6
 
7
+ /**
8
+ * Rubrics: one human-judgment WCAG aspect per Markdown file (core/rubrics/*.md).
9
+ *
10
+ * The files are data. Front matter names the aspect (id, ACT rule, SC, the
11
+ * evidence it needs, a deterministic applicability filter); the body is the
12
+ * rubric text the model reads. This module only parses them. Machine-
13
+ * verifiable rules never get a rubric: axe decides those.
14
+ */
15
+
16
+ declare const EVIDENCE_KINDS: readonly ["image", "link", "heading", "formField", "control", "page", "langElement", "form", "iframeGroup", "textBlocks"];
17
+ type EvidenceKind = (typeof EVIDENCE_KINDS)[number];
18
+ interface Rubric {
19
+ id: string;
20
+ title: string;
21
+ /** W3C ACT rule ids this aspect is scored against. */
22
+ act: string[];
23
+ sc: string[];
24
+ level: WcagLevel;
25
+ issueType: string;
26
+ impact: IssueImpact;
27
+ /**
28
+ * 'none' = no collector yet: the rubric is written but never runs.
29
+ * 'finding' = it decides engine findings the measurements left open (the
30
+ * undecided set, with the engine's `evidence`), through the AI judge.
31
+ */
32
+ evidence: EvidenceKind | 'none' | 'finding';
33
+ /** Finding rubrics: the issue types they decide. */
34
+ routes: string[];
35
+ /** Finding rubrics: decide any finding whose evidence carries this key as true (wins over `routes`). */
36
+ routeEvidence?: string;
37
+ /** Deterministic applicability: every listed boolean field must equal its value. */
38
+ where: Array<{
39
+ field: string;
40
+ value: boolean;
41
+ }>;
42
+ vision: boolean;
43
+ /** below-bar: evaluated, but under the ACT precision bar; the runner skips it unless named in `aspects`. */
44
+ status: 'evaluated' | 'unevaluated' | 'below-bar';
45
+ note?: string;
46
+ /** The rubric text sent to the model (Markdown body). */
47
+ body: string;
48
+ file: string;
49
+ }
50
+ declare const RUBRICS: Rubric[];
51
+ /** Rubrics that have a collector and can run (the rubric runner's page aspects). */
52
+ declare const RUNNABLE_RUBRICS: Rubric[];
53
+
54
+ /**
55
+ * The rubric prompt contract, shared by the rubric runner (page aspects) and
56
+ * the AI judge (finding rubrics). A leaf module: no engine imports, so the
57
+ * judge and the runner can both use it without a cycle.
58
+ */
59
+
60
+ type RubricVerdict = 'passed' | 'failed' | 'inapplicable' | 'cantTell';
61
+ /** The rubric's system prompt: shared verdict contract + the rubric text. */
62
+ declare function rubricSystemPrompt(r: Rubric): string;
63
+ /** Parse model output; null when malformed (fail closed: the whole batch is undecided). */
64
+ interface RubricFix {
65
+ attribute: string;
66
+ value: string;
67
+ }
68
+ declare function parseRubricVerdicts(raw: unknown): Array<{
69
+ id: string;
70
+ verdict: RubricVerdict;
71
+ reason: string;
72
+ fix?: RubricFix;
73
+ }> | null;
74
+ /** FNV-1a 64-bit of the rubric prompt, hex. Pure JS so the platform computes the same value from the same core. */
75
+ declare function rubricPromptHash(r: Rubric): string;
76
+
77
+ /**
78
+ * Rubric agent: decides the human-judgment WCAG aspects (core/rubrics/*.md).
79
+ *
80
+ * Per page: collect typed evidence once (evidence.ts, read-only), apply each
81
+ * rubric's deterministic applicability (`where`), then send ONE bounded call
82
+ * per (aspect, candidate batch) through the AI judge's transport with the
83
+ * rubric as the system prompt. Outcomes:
84
+ *
85
+ * failed → a finding (ScanIssue) on the candidate element
86
+ * passed → recorded in `verdicts`, not reported
87
+ * inapplicable → recorded, not reported
88
+ * cantTell, an id the model left out, malformed output, a timeout → dropped
89
+ * and counted in `undecided`. Never a "needs review" row.
90
+ *
91
+ * No verdict cache: every run asks again, so paired eval draws on one page
92
+ * are independent. Findings on our own tooling are dropped before return
93
+ * (provenance contract, engines/tooling.ts).
94
+ */
95
+
96
+ interface RubricVerdictEntry {
97
+ aspect: string;
98
+ selector: string;
99
+ verdict: Exclude<RubricVerdict, 'cantTell'>;
100
+ reason: string;
101
+ /** 'rule' = decided deterministically before any model call. */
102
+ by: 'model' | 'rule';
103
+ }
104
+ interface RubricRunOptions {
105
+ url: string;
106
+ /** Model access, same shape as the AI judge's (key, transport or hosted apiUrl). */
107
+ judge: JudgeOptions;
108
+ /** Rubric ids to run; default every runnable rubric. */
109
+ /** Only these aspects. Without it every runnable aspect runs except those below the ACT precision bar. */
110
+ aspects?: string[];
111
+ level?: WcagLevel;
112
+ /** Candidates per call. Default 8. */
113
+ batchSize?: number;
114
+ /** Budget for the whole run. Default 45 s. */
115
+ timeoutMs?: number;
116
+ /** Aspects decided in parallel. Default 3. */
117
+ concurrency?: number;
118
+ bugs?: InternalBug[];
119
+ warnings?: string[];
120
+ /** Scoped scan (verify_fix): only candidates on this element or inside it are asked. */
121
+ rootSelector?: string;
122
+ }
123
+ interface RubricOutcome {
124
+ findings: ScanIssue[];
125
+ verdicts: RubricVerdictEntry[];
126
+ /** Aspects with no applicable candidate on the page (no call made). */
127
+ inapplicable: string[];
128
+ /** Candidates sent to the model that came back without a verdict (cantTell, missing, malformed, timeout). */
129
+ undecided: number;
130
+ /** WCAG criteria of the undecided candidates (the scan's `unsettled`). */
131
+ undecidedWcag: string[];
132
+ calls: number;
133
+ errors: string[];
134
+ }
135
+ /**
136
+ * The judge transport for rubric calls: an injected transport, the operator's
137
+ * own model key, or the hosted judge (the platform resolves the rubric by id).
138
+ */
139
+ declare function rubricTransport(opts: JudgeOptions): JudgeTransport | null;
140
+ declare function runRubrics(page: PageLike, opts: RubricRunOptions): Promise<RubricOutcome>;
141
+
7
142
  /**
8
143
  * Pure issue-shaping utilities shared by the Playwright scan path
9
144
  * (scanner.ts) and the in-DOM scan path (dom.ts). Moved verbatim from
@@ -110,7 +245,9 @@ interface VerifyFixRefusal {
110
245
  * criterion no engine can fail, and a selector that crosses a shadow root or
111
246
  * iframe. Returns null when verification may proceed.
112
247
  */
113
- declare function verifyFixRefusal(wcag: string | undefined, selector: string, sources?: CoverageSources): Promise<VerifyFixRefusal | null>;
248
+ declare function verifyFixRefusal(wcag: string | undefined, selector: string, sources?: CoverageSources, opts?: {
249
+ judge?: boolean;
250
+ }): Promise<VerifyFixRefusal | null>;
114
251
 
115
252
  interface AxeViolation {
116
253
  id: string;
@@ -139,6 +276,8 @@ interface AxeViolation {
139
276
  target?: unknown;
140
277
  }>;
141
278
  }>;
279
+ /** Set by routeThirdPartyFrameNodes: the node sits in another site's frame. Judge context. */
280
+ waEvidence?: Record<string, unknown>;
142
281
  }>;
143
282
  }
144
283
  interface AxeRunResult {
@@ -227,4 +366,4 @@ interface DevSuggestion {
227
366
  }
228
367
  declare function generateDevSuggestion(issue: ScanIssue, framework: Framework, elementClasses?: string, fgColor?: string, bgColor?: string): DevSuggestion;
229
368
 
230
- export { type ContrastSuggestion, type CoverageSources, DetectedIssue, type DevSuggestion, FixDetector, type Framework, type FrameworkInfo, InternalBug, PageLike, REASON_TEXT, ScanIssue, ScanOptions, ScanResult, SiteTheme, type TailwindSuggestion, type Verifiability, WCAG_LEVEL_MAP, WcagLevel, coveredCriteria, criterionVerifiability, detectFramework, dismissModals, extractSiteTheme, generateDevSuggestion, getContrastRatio, getWcagLevel, isPiercingSelector, issueLevel, runAxe, runDetectors, scan, solveContrast, suggestTailwindFix, toHtmlReport, verifyFixRefusal, withinLevel };
369
+ export { type ContrastSuggestion, type CoverageSources, DetectedIssue, type DevSuggestion, type EvidenceKind, FixDetector, type Framework, type FrameworkInfo, InternalBug, IssueImpact, JudgeOptions, JudgeTransport, PageLike, REASON_TEXT, RUBRICS, RUNNABLE_RUBRICS, type Rubric, type RubricOutcome, type RubricRunOptions, type RubricVerdictEntry, ScanIssue, ScanOptions, ScanResult, SiteTheme, type TailwindSuggestion, type Verifiability, WCAG_LEVEL_MAP, WcagLevel, coveredCriteria, criterionVerifiability, detectFramework, dismissModals, extractSiteTheme, generateDevSuggestion, getContrastRatio, getWcagLevel, isPiercingSelector, issueLevel, parseRubricVerdicts, rubricPromptHash, rubricSystemPrompt, rubricTransport, runAxe, runDetectors, runRubrics, scan, solveContrast, suggestTailwindFix, toHtmlReport, verifyFixRefusal, withinLevel };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,144 @@
1
- import { P as PageLike, S as ScanOptions, a as ScanResult, W as WcagLevel, b as SiteTheme, F as FixDetector, I as InternalBug, D as DetectedIssue, c as ScanIssue } from './types-Bk-B2Y9X.js';
2
- export { B as BrowserDetector, d as DEFAULT_JUDGE_BASE_URL, e as DEFAULT_JUDGE_TEXT_MODEL, f as DEFAULT_JUDGE_VISION_MODEL, g as FixIssueType, h as IssueImpact, i as IssueSource, J as JUDGE_DEFAULT_TIMEOUT_MS, j as JUDGE_SYSTEM_PROMPT, k as JudgeChatBody, l as JudgeItem, m as JudgeOptions, n as JudgeRequest, o as JudgeTransport, p as JudgeVerdict, q as JudgedEntry, V as VIEWPORT_SIZES, r as ViewportPreset, s as WCAG_BY_ISSUE, t as buildJudgeChatBody, u as hostedJudgeTransport, v as judgeUndecided, w as openAiCompatibleTransport, x as resetJudgeCache } from './types-Bk-B2Y9X.js';
1
+ import { P as PageLike, S as ScanOptions, a as ScanResult, W as WcagLevel, I as IssueImpact, b as ScanIssue, J as JudgeOptions, c as InternalBug, d as JudgeTransport, e as SiteTheme, F as FixDetector, D as DetectedIssue } from './types-B_q8lTmv.js';
2
+ export { B as BrowserDetector, f as DEFAULT_JUDGE_BASE_URL, g as DEFAULT_JUDGE_TEXT_MODEL, h as DEFAULT_JUDGE_VISION_MODEL, i as FixIssueType, j as IssueSource, k as JUDGE_DEFAULT_TIMEOUT_MS, l as JUDGE_SYSTEM_PROMPT, m as JudgeChatBody, n as JudgeItem, o as JudgeRequest, p as JudgeVerdict, q as JudgedEntry, V as VIEWPORT_SIZES, r as ViewportPreset, s as WCAG_BY_ISSUE, t as buildJudgeChatBody, u as hostedJudgeTransport, v as judgeUndecided, w as openAiCompatibleTransport, x as resetJudgeCache } from './types-B_q8lTmv.js';
3
3
  export { F as FIX_JUDGE_MAX_FIXES, a as FixJudgeFix, b as FixJudgeHttpError, c as FixJudgeRequest, d as FixJudgeTransport, e as FixJudgeVerdict, f as FixJudgeVerdictKind, h as hostedFixJudgeTransport } from './hostedFixJudge-DXYes7X1.js';
4
4
 
5
5
  declare function scan(target: string | PageLike, options?: ScanOptions): Promise<ScanResult>;
6
6
 
7
+ /**
8
+ * Rubrics: one human-judgment WCAG aspect per Markdown file (core/rubrics/*.md).
9
+ *
10
+ * The files are data. Front matter names the aspect (id, ACT rule, SC, the
11
+ * evidence it needs, a deterministic applicability filter); the body is the
12
+ * rubric text the model reads. This module only parses them. Machine-
13
+ * verifiable rules never get a rubric: axe decides those.
14
+ */
15
+
16
+ declare const EVIDENCE_KINDS: readonly ["image", "link", "heading", "formField", "control", "page", "langElement", "form", "iframeGroup", "textBlocks"];
17
+ type EvidenceKind = (typeof EVIDENCE_KINDS)[number];
18
+ interface Rubric {
19
+ id: string;
20
+ title: string;
21
+ /** W3C ACT rule ids this aspect is scored against. */
22
+ act: string[];
23
+ sc: string[];
24
+ level: WcagLevel;
25
+ issueType: string;
26
+ impact: IssueImpact;
27
+ /**
28
+ * 'none' = no collector yet: the rubric is written but never runs.
29
+ * 'finding' = it decides engine findings the measurements left open (the
30
+ * undecided set, with the engine's `evidence`), through the AI judge.
31
+ */
32
+ evidence: EvidenceKind | 'none' | 'finding';
33
+ /** Finding rubrics: the issue types they decide. */
34
+ routes: string[];
35
+ /** Finding rubrics: decide any finding whose evidence carries this key as true (wins over `routes`). */
36
+ routeEvidence?: string;
37
+ /** Deterministic applicability: every listed boolean field must equal its value. */
38
+ where: Array<{
39
+ field: string;
40
+ value: boolean;
41
+ }>;
42
+ vision: boolean;
43
+ /** below-bar: evaluated, but under the ACT precision bar; the runner skips it unless named in `aspects`. */
44
+ status: 'evaluated' | 'unevaluated' | 'below-bar';
45
+ note?: string;
46
+ /** The rubric text sent to the model (Markdown body). */
47
+ body: string;
48
+ file: string;
49
+ }
50
+ declare const RUBRICS: Rubric[];
51
+ /** Rubrics that have a collector and can run (the rubric runner's page aspects). */
52
+ declare const RUNNABLE_RUBRICS: Rubric[];
53
+
54
+ /**
55
+ * The rubric prompt contract, shared by the rubric runner (page aspects) and
56
+ * the AI judge (finding rubrics). A leaf module: no engine imports, so the
57
+ * judge and the runner can both use it without a cycle.
58
+ */
59
+
60
+ type RubricVerdict = 'passed' | 'failed' | 'inapplicable' | 'cantTell';
61
+ /** The rubric's system prompt: shared verdict contract + the rubric text. */
62
+ declare function rubricSystemPrompt(r: Rubric): string;
63
+ /** Parse model output; null when malformed (fail closed: the whole batch is undecided). */
64
+ interface RubricFix {
65
+ attribute: string;
66
+ value: string;
67
+ }
68
+ declare function parseRubricVerdicts(raw: unknown): Array<{
69
+ id: string;
70
+ verdict: RubricVerdict;
71
+ reason: string;
72
+ fix?: RubricFix;
73
+ }> | null;
74
+ /** FNV-1a 64-bit of the rubric prompt, hex. Pure JS so the platform computes the same value from the same core. */
75
+ declare function rubricPromptHash(r: Rubric): string;
76
+
77
+ /**
78
+ * Rubric agent: decides the human-judgment WCAG aspects (core/rubrics/*.md).
79
+ *
80
+ * Per page: collect typed evidence once (evidence.ts, read-only), apply each
81
+ * rubric's deterministic applicability (`where`), then send ONE bounded call
82
+ * per (aspect, candidate batch) through the AI judge's transport with the
83
+ * rubric as the system prompt. Outcomes:
84
+ *
85
+ * failed → a finding (ScanIssue) on the candidate element
86
+ * passed → recorded in `verdicts`, not reported
87
+ * inapplicable → recorded, not reported
88
+ * cantTell, an id the model left out, malformed output, a timeout → dropped
89
+ * and counted in `undecided`. Never a "needs review" row.
90
+ *
91
+ * No verdict cache: every run asks again, so paired eval draws on one page
92
+ * are independent. Findings on our own tooling are dropped before return
93
+ * (provenance contract, engines/tooling.ts).
94
+ */
95
+
96
+ interface RubricVerdictEntry {
97
+ aspect: string;
98
+ selector: string;
99
+ verdict: Exclude<RubricVerdict, 'cantTell'>;
100
+ reason: string;
101
+ /** 'rule' = decided deterministically before any model call. */
102
+ by: 'model' | 'rule';
103
+ }
104
+ interface RubricRunOptions {
105
+ url: string;
106
+ /** Model access, same shape as the AI judge's (key, transport or hosted apiUrl). */
107
+ judge: JudgeOptions;
108
+ /** Rubric ids to run; default every runnable rubric. */
109
+ /** Only these aspects. Without it every runnable aspect runs except those below the ACT precision bar. */
110
+ aspects?: string[];
111
+ level?: WcagLevel;
112
+ /** Candidates per call. Default 8. */
113
+ batchSize?: number;
114
+ /** Budget for the whole run. Default 45 s. */
115
+ timeoutMs?: number;
116
+ /** Aspects decided in parallel. Default 3. */
117
+ concurrency?: number;
118
+ bugs?: InternalBug[];
119
+ warnings?: string[];
120
+ /** Scoped scan (verify_fix): only candidates on this element or inside it are asked. */
121
+ rootSelector?: string;
122
+ }
123
+ interface RubricOutcome {
124
+ findings: ScanIssue[];
125
+ verdicts: RubricVerdictEntry[];
126
+ /** Aspects with no applicable candidate on the page (no call made). */
127
+ inapplicable: string[];
128
+ /** Candidates sent to the model that came back without a verdict (cantTell, missing, malformed, timeout). */
129
+ undecided: number;
130
+ /** WCAG criteria of the undecided candidates (the scan's `unsettled`). */
131
+ undecidedWcag: string[];
132
+ calls: number;
133
+ errors: string[];
134
+ }
135
+ /**
136
+ * The judge transport for rubric calls: an injected transport, the operator's
137
+ * own model key, or the hosted judge (the platform resolves the rubric by id).
138
+ */
139
+ declare function rubricTransport(opts: JudgeOptions): JudgeTransport | null;
140
+ declare function runRubrics(page: PageLike, opts: RubricRunOptions): Promise<RubricOutcome>;
141
+
7
142
  /**
8
143
  * Pure issue-shaping utilities shared by the Playwright scan path
9
144
  * (scanner.ts) and the in-DOM scan path (dom.ts). Moved verbatim from
@@ -110,7 +245,9 @@ interface VerifyFixRefusal {
110
245
  * criterion no engine can fail, and a selector that crosses a shadow root or
111
246
  * iframe. Returns null when verification may proceed.
112
247
  */
113
- declare function verifyFixRefusal(wcag: string | undefined, selector: string, sources?: CoverageSources): Promise<VerifyFixRefusal | null>;
248
+ declare function verifyFixRefusal(wcag: string | undefined, selector: string, sources?: CoverageSources, opts?: {
249
+ judge?: boolean;
250
+ }): Promise<VerifyFixRefusal | null>;
114
251
 
115
252
  interface AxeViolation {
116
253
  id: string;
@@ -139,6 +276,8 @@ interface AxeViolation {
139
276
  target?: unknown;
140
277
  }>;
141
278
  }>;
279
+ /** Set by routeThirdPartyFrameNodes: the node sits in another site's frame. Judge context. */
280
+ waEvidence?: Record<string, unknown>;
142
281
  }>;
143
282
  }
144
283
  interface AxeRunResult {
@@ -227,4 +366,4 @@ interface DevSuggestion {
227
366
  }
228
367
  declare function generateDevSuggestion(issue: ScanIssue, framework: Framework, elementClasses?: string, fgColor?: string, bgColor?: string): DevSuggestion;
229
368
 
230
- export { type ContrastSuggestion, type CoverageSources, DetectedIssue, type DevSuggestion, FixDetector, type Framework, type FrameworkInfo, InternalBug, PageLike, REASON_TEXT, ScanIssue, ScanOptions, ScanResult, SiteTheme, type TailwindSuggestion, type Verifiability, WCAG_LEVEL_MAP, WcagLevel, coveredCriteria, criterionVerifiability, detectFramework, dismissModals, extractSiteTheme, generateDevSuggestion, getContrastRatio, getWcagLevel, isPiercingSelector, issueLevel, runAxe, runDetectors, scan, solveContrast, suggestTailwindFix, toHtmlReport, verifyFixRefusal, withinLevel };
369
+ export { type ContrastSuggestion, type CoverageSources, DetectedIssue, type DevSuggestion, type EvidenceKind, FixDetector, type Framework, type FrameworkInfo, InternalBug, IssueImpact, JudgeOptions, JudgeTransport, PageLike, REASON_TEXT, RUBRICS, RUNNABLE_RUBRICS, type Rubric, type RubricOutcome, type RubricRunOptions, type RubricVerdictEntry, ScanIssue, ScanOptions, ScanResult, SiteTheme, type TailwindSuggestion, type Verifiability, WCAG_LEVEL_MAP, WcagLevel, coveredCriteria, criterionVerifiability, detectFramework, dismissModals, extractSiteTheme, generateDevSuggestion, getContrastRatio, getWcagLevel, isPiercingSelector, issueLevel, parseRubricVerdicts, rubricPromptHash, rubricSystemPrompt, rubricTransport, runAxe, runDetectors, runRubrics, scan, solveContrast, suggestTailwindFix, toHtmlReport, verifyFixRefusal, withinLevel };