axstack 0.35.0 → 0.36.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/README.md CHANGED
@@ -66,7 +66,7 @@ You make decisions at holds and substantial-spec approval.
66
66
  Follow [getting started](docs/getting-started.md) for the full first-task journey
67
67
  and [guides](docs/guides.md) for features, reviews, watches, debugging and releases.
68
68
 
69
- ## What you can do
69
+ ## What you can do (19 skills)
70
70
 
71
71
  | Layer | Skill | What it does |
72
72
  | --- | --- | --- |
@@ -86,6 +86,7 @@ and [guides](docs/guides.md) for features, reviews, watches, debugging and relea
86
86
  | Operate | [axstack-cleanup](skills/axstack-cleanup/SKILL.md) | Retire eligible completed agent resources. |
87
87
  | Operate | [axstack-relay](skills/axstack-relay/SKILL.md) | Send an explicit message or authorized notification. |
88
88
  | Understand | [axstack-research](skills/axstack-research/SKILL.md) | Answer one bounded question with sources. |
89
+ | Understand | [axstack-scout](skills/axstack-scout/SKILL.md) | Gather codebase evidence for an agent across several areas. |
89
90
  | Understand | [axstack-explain](skills/axstack-explain/SKILL.md) | Explain a system and separate known behavior from gaps. |
90
91
  | Understand | [axstack-diagram](skills/axstack-diagram/SKILL.md) | Draw SVG/CSS in inline pages, Mermaid for chat/GitHub/docs, or requested archify viewers. |
91
92
 
@@ -307,6 +307,11 @@ The `mixed` and `claude-only` presets assign `axstack-auditor`,
307
307
  Activation requires that exact ID and high effort in saved T3 capabilities;
308
308
  missing either holds these roles without substitution, including Haiku 4.5.
309
309
  The `codex-only` assignments for these roles are unchanged.
310
+ Scout adds `axstack-explore-codebase-luna` at Codex Luna xhigh in `mixed` and
311
+ `codex-only`. The optional `axstack-explore-codebase-flash` seat uses
312
+ Antigravity `gemini-3.8-flash-medium` at medium effort in `mixed`.
313
+ The missing Scout seats have explicit null models: Luna and Flash in
314
+ `claude-only`, and Flash in `codex-only`.
310
315
  The three `-sol` pair seats for auditor, research-code, and explore-execution
311
316
  use Sol high in `mixed` and `codex-only`; `claude-only` records intentional
312
317
  absences. The paired seats run independently on one brief and the driver
package/docs/workflows.md CHANGED
@@ -29,6 +29,8 @@ Direct routes need no spec ceremony:
29
29
  - [axstack-perf](../skills/axstack-perf/SKILL.md) routes performance work to
30
30
  Debug, Improve, or Implement through the shared performance loop.
31
31
  - `axstack-research` answers one bounded source-backed question.
32
+ - `axstack-scout` gathers cited codebase evidence for broad or unfamiliar
33
+ questions using independent, read-only seats.
32
34
  - `axstack-correct` reports repeated mistakes and proposes stronger checks.
33
35
  Only the user invokes it.
34
36
  - `axstack-explain` separates implemented, intended, tested, live, and unknown
@@ -129,8 +131,11 @@ use the Claude Sonnet class at high effort. `axstack-explore-codebase` and
129
131
  `axstack-monitor` adopt Haiku 5.5 high, with class `haiku` and exact pin
130
132
  `claude-haiku-5-5`. Missing that ID or high effort in saved T3 capabilities
131
133
  holds those roles without substitution. `codex-only` keeps its Codex
132
- assignments for those roles. Mixed web-google and X retain their source-specific
133
- Antigravity and Grok routes.
134
+ assignments for those roles. Scout adds a Luna xhigh codebase seat in `mixed`
135
+ and `codex-only`, and an optional Antigravity Flash medium seat in `mixed`.
136
+ In `claude-only`, Luna and Flash are intentionally absent; Flash is also
137
+ intentionally absent in `codex-only`. Mixed web-google and X retain their
138
+ source-specific Antigravity and Grok routes.
134
139
  The mixed `axstack-auditor` uses Haiku 5.5 xhigh, pinned to `claude-haiku-5-5`;
135
140
  missing that ID or xhigh effort holds without substitution. The mixed
136
141
  `axstack-explainer-review` uses Sol medium; `axstack-explainer` stays Sonnet high.
@@ -418,6 +423,9 @@ Proven verification is required for every own PR. Use the authored receipt:
418
423
  Earlier-head red-to-green evidence in the PR's patch lineage counts only when
419
424
  the reviewer records that it still applies to the final change.
420
425
  An applicable `verify-<app>` passing result is required for the changed behavior.
426
+ The passing result must come from the reviewer's or `axstack-ui-verifier`'s local drive at that head.
427
+ The author's log alone never satisfies this requirement.
428
+ A preview URL never satisfies this requirement.
421
429
  - Verification requires no limitation tagged `changed-behavior: unproven`.
422
430
  The reviewer tags every limitation leaving changed behavior unexercised or
423
431
  unverified, in whatever words, `changed-behavior: unproven`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axstack",
3
- "version": "0.35.0",
3
+ "version": "0.36.0",
4
4
  "description": "Axstack installer and setup CLI: installs owned chat skills and role data, configures supported harness settings, and checks T3 Code capabilities.",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -173,6 +173,24 @@
173
173
  "modelClass": "haiku",
174
174
  "model": "claude-haiku-5-5"
175
175
  },
176
+ {
177
+ "id": "axstack-explore-codebase-luna",
178
+ "name": "Axstack codebase explorer Luna (unavailable)",
179
+ "provider": "claude",
180
+ "model": null,
181
+ "modeId": "bypassPermissions",
182
+ "thinkingOptionId": "xhigh",
183
+ "notes": "Intentional single-provider absence: Luna Scout seat is unavailable in claude-only."
184
+ },
185
+ {
186
+ "id": "axstack-explore-codebase-flash",
187
+ "name": "Axstack codebase explorer Flash (unavailable)",
188
+ "provider": "claude",
189
+ "model": null,
190
+ "modeId": "bypassPermissions",
191
+ "thinkingOptionId": "medium",
192
+ "notes": "Intentional single-provider absence: Flash Scout seat is unavailable in claude-only."
193
+ },
176
194
  {
177
195
  "id": "axstack-explore-execution",
178
196
  "name": "Axstack execution explorer",
@@ -172,6 +172,24 @@
172
172
  "notes": "Codebase mapper: explores repository structure and interfaces for research and handoff context. Resolve the class from saved T3 capabilities at run start; rejection and unavailable settings hold without substitution.",
173
173
  "modelClass": "sol"
174
174
  },
175
+ {
176
+ "id": "axstack-explore-codebase-luna",
177
+ "name": "Axstack codebase explorer Luna",
178
+ "provider": "codex",
179
+ "modeId": "full-access",
180
+ "thinkingOptionId": "xhigh",
181
+ "notes": "Independent read-only Luna Scout facet explorer. Searches the whole repository on the same brief without cross-reading; reports evidence for driver reconciliation. Unavailable model or effort holds without substitution.",
182
+ "modelClass": "luna"
183
+ },
184
+ {
185
+ "id": "axstack-explore-codebase-flash",
186
+ "name": "Axstack codebase explorer Flash (unavailable)",
187
+ "provider": "codex",
188
+ "model": null,
189
+ "modeId": "full-access",
190
+ "thinkingOptionId": "medium",
191
+ "notes": "Intentional single-provider absence: Flash Scout seat is unavailable in codex-only."
192
+ },
175
193
  {
176
194
  "id": "axstack-explore-execution",
177
195
  "name": "Axstack execution explorer",
@@ -173,6 +173,24 @@
173
173
  "modelClass": "haiku",
174
174
  "model": "claude-haiku-5-5"
175
175
  },
176
+ {
177
+ "id": "axstack-explore-codebase-luna",
178
+ "name": "Axstack codebase explorer Luna",
179
+ "provider": "codex",
180
+ "modeId": "full-access",
181
+ "thinkingOptionId": "xhigh",
182
+ "notes": "Independent read-only Luna Scout facet explorer. Searches the whole repository on the same brief without cross-reading; reports evidence for driver reconciliation. Unavailable model or effort holds without substitution.",
183
+ "modelClass": "luna"
184
+ },
185
+ {
186
+ "id": "axstack-explore-codebase-flash",
187
+ "name": "Axstack codebase explorer Flash",
188
+ "provider": "antigravity",
189
+ "model": "gemini-3.8-flash-medium",
190
+ "modeId": "full-access",
191
+ "thinkingOptionId": "medium",
192
+ "notes": "Optional read-only Scout breadth seat: searches the whole repository for missed boundaries and counterexamples. Reports evidence for driver reconciliation without cross-reading."
193
+ },
176
194
  {
177
195
  "id": "axstack-explore-execution",
178
196
  "name": "Axstack execution explorer",
@@ -41,6 +41,10 @@
41
41
  or high effort holds these roles without substitution.
42
42
  `axstack-monitor`: standalone watch never sends; chat-run watch: bounded
43
43
  internal reports to its Run and original driver.
44
+ - Scout requires `axstack-explore-codebase` and
45
+ `axstack-explore-codebase-luna` per facet in mixed (Haiku high + Luna
46
+ xhigh) and codex-only (Sol high + Luna xhigh). Claude-only requires
47
+ the Haiku high base seat per facet.
44
48
  - Sol pairs `axstack-auditor-sol`/`axstack-research-code-sol`/
45
49
  `axstack-explore-execution-sol`: `codex/sol` high in
46
50
  mixed/codex-only; intentionally absent in claude-only. Dispatch each
@@ -50,7 +54,8 @@
50
54
  - Optional seats: `axstack-arena-candidate-grok`,
51
55
  `axstack-arena-candidate-antigravity`, `axstack-research-web-google`,
52
56
  `axstack-research-x`, `axstack-checker`, `axstack-research-code-sol`,
53
- `axstack-explore-execution-sol`, `axstack-auditor-sol`.
57
+ `axstack-explore-execution-sol`, `axstack-auditor-sol`,
58
+ `axstack-explore-codebase-flash`.
54
59
  Always dispatch optional seats when configured and available. Only a
55
60
  launch failure, trust/login prompt, or prompt block makes one absent:
56
61
  fence the attempt, record `absent (<reason>)`, name it once in the next
@@ -47,6 +47,7 @@ If a PR changes a mapped feature, its author updates the feature file in the sam
47
47
  For a missing skill, add "suggest `axstack-verify create`" to the receipt's `Unverified:` line.
48
48
  Never generate a verification skill automatically.
49
49
  For a broken or stale recipe, report the gap.
50
+ Report a broken or stale recipe as a `low` finding naming `axstack-verify maintain`.
50
51
  Never let a broken or stale recipe waive existing acceptance obligations.
51
52
  Keep browser recipes tool-neutral for the verifier.
52
53
 
@@ -149,6 +149,11 @@ approval; record chosen document names and paths once per run.
149
149
  gaps. For substantial work, this summary becomes part of the draft spec in
150
150
  `axstack-spec`; spec approval is the one human checkpoint. Included and
151
151
  excluded work must be distinguishable, and no open item may appear settled.
152
+ When scope changes runnable behavior, the read-back records a Verification decision.
153
+ For an applicable `verify-<app>` skill, record the features that cover the change.
154
+ For a missing skill, the plan always includes `axstack-verify create` as the first PR.
155
+ Skipping this first PR requires plain AGREE from both `axstack-advisor-astra` and `axstack-advisor-opus` that a verification skill is unnecessary.
156
+ Record both advisers' reason in the Verification decision.
152
157
  2. Classify the result with the shared
153
158
  [proportional scope identity](../axstack/references/routing.md#proportional-scope-identity):
154
159
  - For work clarified as small, return a **small-change intent** handoff with
@@ -175,6 +175,7 @@ If a PR changes a mapped feature, its author updates the feature file in the sam
175
175
  For a missing skill, add "suggest `axstack-verify create`" to the receipt's `Unverified:` line.
176
176
  Never generate a verification skill automatically.
177
177
  For a broken or stale recipe, report the gap.
178
+ Report a broken or stale recipe as a `low` finding naming `axstack-verify maintain`.
178
179
  Never let a broken or stale recipe waive existing acceptance obligations.
179
180
  Keep browser recipes tool-neutral for the verifier.
180
181
 
@@ -16,9 +16,9 @@ improvement is a valid result.
16
16
  Before acting, load [Standing contracts](../axstack/references/contracts.md),
17
17
  then follow its lifecycle and audit pointers. Immediately before any useful
18
18
  role dispatch, load the [T3 runtime
19
- sequence](../axstack/references/t3-runtime.md). Use existing
20
- `axstack-explore-codebase` or `axstack-research-code` roles only when their
21
- specialization materially helps; create no new profile.
19
+ sequence](../axstack/references/t3-runtime.md). For broad codebase mapping,
20
+ use `axstack-scout`. Use `axstack-research-code` only when its specialization
21
+ materially helps. Do not create a new profile.
22
22
  When dispatching `axstack-research-code`, dispatch `axstack-research-code-sol`
23
23
  independently on the same bounded brief without cross-reading. The driver
24
24
  reconciles findings per claim and never averages them. Record an intentionally
@@ -50,7 +50,8 @@ is part of research.
50
50
  - `axstack-research-web`: web and external sources.
51
51
  - `axstack-research-web-google`: Google-Search-grounded web sources via Gemini/Antigravity.
52
52
  - `axstack-research-x`: X (Twitter) posts and threads via Grok; cite post URLs and dates.
53
- - `axstack-explore-codebase`: broad codebase mapping.
53
+ - For broad codebase mapping, use `axstack-scout`.
54
+ Never dispatch `axstack-explore-codebase` directly for broad mapping.
54
55
  - `axstack-explore-execution`: execution and runtime traces.
55
56
  - `axstack-explore-execution-sol`: independent Sol execution investigation.
56
57
 
@@ -330,6 +330,14 @@ This section applies to peer and authored PR modes.
330
330
  mode-required receipt records concrete evidence and consequences, coverage,
331
331
  limitations, and findings without a finding quota.
332
332
 
333
+ If a `verify-<app>` skill covers affected behavior, the authored reviewer runs its base-revision Launch and Doctor against the pinned final head in its detached checkout.
334
+ For an `axstack-verify create` PR, the reviewer drives the candidate's recipe because the base has none.
335
+ The author never performs this review drive.
336
+ The reviewer drives each affected feature and records that drive as the `Final-head check`.
337
+ Delegate browser drives to `axstack-ui-verifier` with the feature file path.
338
+ Running the applicable surface counts as spin-up; a CLI run qualifies.
339
+ Use loopback and isolated instances under [axstack-verify](../axstack-verify/SKILL.md#isolate-every-attempt).
340
+
333
341
  For each finding, name its defect class and list every instance of that
334
342
  class in the pinned diff and dependent surfaces: callers, sibling docs,
335
343
  README, and tests. A later instance of an already-named class is a coverage
@@ -393,6 +401,7 @@ Authored receipt requirements:
393
401
  Report Coverage: COMPLETE | INCOMPLETE with covered angles, acceptance and executable evidence.
394
402
  Tag each limitation leaving changed behavior unexercised or unverified, in whatever words, changed-behavior: unproven.
395
403
  Record Final-head check: <command> -> <log path> for a check the reviewer ran at the final head; keep the log in the run's evidence folder.
404
+ Applicable verify-<app>: Final-head check records the reviewer's local drive of each affected feature at the pinned final head. Use n/a — <reason> when no skill covers the affected behavior.
396
405
  Record a Safety fact: about the change itself rather than the review process.
397
406
  Rate each non-agent comment at the current head above low | low | addressed | uncertain.
398
407
  Re-rate each non-agent comment at every new head.
@@ -420,6 +429,7 @@ Verdict: <APPROVE | REQUEST_CHANGES | INCOMPLETE>
420
429
  Coverage: COMPLETE | INCOMPLETE — <angles + acceptance + executable evidence checked>
421
430
  Limitations: <unverified boundaries + why; tag each limitation leaving changed behavior unexercised or unverified, in whatever words, changed-behavior: unproven>
422
431
  Final-head check: <command> -> <log path> — <check the reviewer ran at the final head; log kept in the run's evidence folder>
432
+ Applicable verify-<app>: <Final-head check records the reviewer's local drive of each affected feature at the pinned final head>. Use n/a — <reason> when no skill covers the affected behavior.
423
433
  Findings: <severity + evidence + consequence each>
424
434
  Revert: <declared line + diff-based assessment in authored mode>
425
435
  Agent-authored comment and thread IDs: <receipt-recorded IDs or none>
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: axstack-scout
3
+ description: When an agent needs codebase evidence across several areas or unfamiliar code, use axstack-scout to gather cited findings.
4
+ ---
5
+
6
+ # Scout
7
+
8
+ On driver entry, sweep under [Workspace hygiene](../axstack/references/workspace-hygiene.md); dispatched workers do not sweep.
9
+ For every dispatch brief, name its private `<run dir>/evidence/<dispatch>/` folder.
10
+
11
+ Before acting, load [Standing contracts](../axstack/references/contracts.md)
12
+ and follow its lifecycle and audit pointers. Immediately before dispatch,
13
+ read the [T3 runtime boundary](../axstack/references/t3-runtime.md) and
14
+ [Role roster](../axstack/references/role-roster.md). A Scout call from an
15
+ ordinary chat creates a run with `run-init`.
16
+
17
+ ## 1. Bound the exploration
18
+
19
+ Use Scout for questions spanning several codebase areas, unfamiliar code, or
20
+ claims that something does not exist. A single factual lookup stays in the
21
+ current chat. Ordinary file reading also stays in the current chat.
22
+ Only a driver or PR owner dispatches Scout. Workers, authors and reviewers
23
+ request exploration from their driver; they do not launch a fan-out.
24
+
25
+ Split the question into 1–3 facets, with each facet searching the whole
26
+ repository for its concern, such as definitions, callers, tests or config.
27
+ Facet briefs must never restrict the search to one directory. Scale by facet
28
+ count; keep every required seat within each facet.
29
+
30
+ ## 2. Dispatch independent seats
31
+
32
+ Use the run's selected preset and role snapshot. Give seats for one facet the
33
+ same brief without cross-reading; the optional Flash seat searches the whole
34
+ question for missed boundaries and counterexamples.
35
+
36
+ - In mixed, each facet requires an independent Haiku and Luna pair: one
37
+ `axstack-explore-codebase` (Haiku 5.5 high) and one
38
+ `axstack-explore-codebase-luna` (Luna xhigh).
39
+ - In codex-only, each facet requires an independent Sol and Luna pair:
40
+ `axstack-explore-codebase` (Sol high) and
41
+ `axstack-explore-codebase-luna` (Luna xhigh).
42
+ - In claude-only, each facet requires one Haiku seat:
43
+ `axstack-explore-codebase` (Haiku 5.5 high).
44
+
45
+ In mixed, dispatch one optional `axstack-explore-codebase-flash` for the Scout
46
+ call, for at most seven seats across three facets.
47
+
48
+ Sol and Luna agreement is not cross-family corroboration. An unavailable or
49
+ rejected required seat holds Scout without substitution. The first dispatch
50
+ for each provider/model/effort must reach a running or completed run before
51
+ siblings launch, and its rejection stops siblings of that configuration.
52
+
53
+ A Flash launch failure, trust/login prompt, or prompt block records
54
+ `absent (<reason>)` and Scout continues with the required seats. Fence the
55
+ failed attempt and name its absence once in the next read-back. A Flash model
56
+ missing from saved capabilities holds that seat under the existing unavailable
57
+ model rule, without substitution. A Flash hold covers only the Flash seat,
58
+ and Scout returns the other seats' summary while naming that hold. An
59
+ uncertain dispatch is reconciled, not recorded absent.
60
+
61
+ ## 3. Pin evidence and report
62
+
63
+ Pin each brief to the working tree's content identity. Content identity pins
64
+ HEAD SHA, SHA-256 of `git diff --binary HEAD` when dirty, and a path and
65
+ SHA-256 for each untracked, non-ignored file from
66
+ `git ls-files -o --exclude-standard`. Ignored files are outside the search
67
+ scope. Seats search the pinned working tree. Each seat is read-only and
68
+ writes only to its private evidence folder.
69
+
70
+ Each seat report has at most about 15 claims, each labeled `verified`,
71
+ `inference`, or `unverified` using Research labels. Every present claim
72
+ cites `file:line` evidence. A not-found claim says `not found in <scope>`
73
+ and includes the exact search command, scope, and content identity; it never
74
+ claims absence beyond that scope.
75
+
76
+ The driver reconciles per claim without averaging and names disagreements.
77
+ Cross-family agreement corroborates but does not prove a claim. Before
78
+ relying on an answer-changing not-found claim, the driver rechecks its search.
79
+ Reuse findings only while content identity, including untracked file contents,
80
+ is unchanged; any identity change requires re-scouting all facets still needed.
81
+
82
+ Return a compact summary to the driver and store seat reports in the run's
83
+ evidence folder. Scout adds no mandatory gate to other phases; they may use
84
+ its evidence when useful.
@@ -69,7 +69,8 @@ Keep that folder outside scratch selected for deletion.
69
69
  Clean up owned resources by literal absolute paths.
70
70
  Follow [Safe deletion](../axstack/references/workspace-hygiene.md#safe-deletion).
71
71
 
72
- For a peer PR, read the Launch recipe and helpers from the base revision and execute against the pinned candidate.
72
+ For a peer PR or a review run, read the Launch recipe and helpers from the base revision and execute against the pinned candidate.
73
+ For an `axstack-verify create` PR, the reviewer drives the candidate's recipe because the base has none.
73
74
  Keep trusted base helpers separate from the candidate's recipe files.
74
75
  Bind evidence to the served SHA.
75
76
  Report an unavailable candidate run as unverified.
@@ -278,6 +278,9 @@ Proven verification is required for every own PR. Use the authored receipt:
278
278
  Earlier-head red-to-green evidence in the PR's patch lineage counts only when
279
279
  the reviewer records that it still applies to the final change.
280
280
  An applicable `verify-<app>` passing result is required for the changed behavior.
281
+ The passing result must come from the reviewer's or `axstack-ui-verifier`'s local drive at that head.
282
+ The author's log alone never satisfies this requirement.
283
+ A preview URL never satisfies this requirement.
281
284
  - Verification requires no limitation tagged `changed-behavior: unproven`.
282
285
  The reviewer tags every limitation leaving changed behavior unexercised or
283
286
  unverified, in whatever words, `changed-behavior: unproven`.
package/src/roles.js CHANGED
@@ -92,8 +92,8 @@ export function assessRoleReadiness(roles, preset) {
92
92
  (preset === 'mixed' && role.id === 'axstack-research-x' && role.provider === 'grok') ||
93
93
  (preset === 'mixed' && role.id === 'axstack-arena-candidate-grok' && role.provider === 'grok') ||
94
94
  (preset === 'mixed' && role.id === 'axstack-arena-candidate-antigravity' && role.provider === 'antigravity') ||
95
- (preset === 'codex-only' && ['axstack-advisor-opus', 'axstack-escalation-fable', 'axstack-arena-judge-opus', 'axstack-research-web-google', 'axstack-research-x', 'axstack-arena-candidate-grok', 'axstack-arena-candidate-antigravity'].includes(role.id)) ||
96
- (preset === 'claude-only' && ['axstack-advisor-astra', 'axstack-arena-judge-astra', 'axstack-research-web-google', 'axstack-research-x', 'axstack-arena-candidate-grok', 'axstack-arena-candidate-antigravity', 'axstack-auditor-sol', 'axstack-research-code-sol', 'axstack-explore-execution-sol'].includes(role.id))
95
+ (preset === 'codex-only' && ['axstack-advisor-opus', 'axstack-escalation-fable', 'axstack-arena-judge-opus', 'axstack-research-web-google', 'axstack-research-x', 'axstack-arena-candidate-grok', 'axstack-arena-candidate-antigravity', 'axstack-explore-codebase-flash'].includes(role.id)) ||
96
+ (preset === 'claude-only' && ['axstack-advisor-astra', 'axstack-arena-judge-astra', 'axstack-research-web-google', 'axstack-research-x', 'axstack-arena-candidate-grok', 'axstack-arena-candidate-antigravity', 'axstack-auditor-sol', 'axstack-research-code-sol', 'axstack-explore-execution-sol', 'axstack-explore-codebase-luna', 'axstack-explore-codebase-flash'].includes(role.id))
97
97
  );
98
98
  for (const role of roles) {
99
99
  if (!bounds.has(role.provider)) {