axstack 0.52.2 → 0.53.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/docs/workflows.md CHANGED
@@ -137,10 +137,15 @@ Haiku 5.5 high, with class `haiku` and exact pin
137
137
  holds that role without substitution. `codex-only` keeps its Codex
138
138
  assignments for those roles. Scout adds a Luna xhigh codebase seat in `mixed`
139
139
  and `codex-only`. In `claude-only`, Luna is intentionally absent.
140
+ For a needed web claim in mixed, pair `axstack-research-web` (Sonnet high)
141
+ with optional `axstack-research-web-sol` (Terra high), independently on the same
142
+ bounded brief without cross-reading. Both single-provider presets explicitly
143
+ mark the web pair absent and keep their base web researcher. Optional launch
144
+ failures retain fencing and the mixed research provider floor.
140
145
  The mixed X route uses Grok.
141
146
  The mixed `axstack-auditor` uses Haiku 5.5 xhigh, pinned to `claude-haiku-5-5`;
142
147
  missing that ID or xhigh effort holds without substitution. The mixed
143
- `axstack-explainer-review` uses Terra medium; `axstack-explainer` pins
148
+ `axstack-explainer-review` uses Terra high; `axstack-explainer` pins
144
149
  `claude-sonnet-5-5` high with class `sonnet`. Both roles cover every Explain
145
150
  visual, including chat Mermaid and anatomy figures. The existing mixed
146
151
  `axstack-ui-verifier` resolves the Codex Terra class at high effort with
@@ -166,7 +171,7 @@ Peer roles use the stable IDs `axstack-reviewer-primary` and
166
171
  `axstack-reviewer-peer`; their provider/class mappings come only from the
167
172
  selected preset and the ordered reviewer table above. The mixed peer coordinator and review-lane binding
168
173
  `axstack-owner` uses Sol high and never reviews. `axstack-reviewer-secondary`
169
- uses Terra xhigh for Sol-authored candidates in `codex-only`. It is used
174
+ uses Terra high for Sol-authored candidates in `codex-only`. It is used
170
175
  in the authored mapping and, alongside `axstack-reviewer-primary`,
171
176
  in codebase findings mode.
172
177
 
@@ -622,3 +627,15 @@ runtime receipts; evidence from one route does not establish support for all rol
622
627
  Bun >=1.3.14, with no runtime dependencies. Workflow checks use
623
628
  `bun test tests/workflows/`; the only approved Node built-ins are Bun-backed
624
629
  `node:fs` and `node:fs/promises`.
630
+
631
+ ## UI improvement
632
+
633
+ For “improve this screen”, Improve reports ranked defects for a named screen or
634
+ flow using Playwright evidence from the existing read-only UI verifier. Each
635
+ fix has observable acceptance criteria; missing renders remain unverified.
636
+ Authorized bounded changes enter Implement's [UI improvement loop](../skills/axstack/references/ui-improvement-loop.md):
637
+ one writer and hypothesis, a frozen capture protocol, fresh renders each attempt,
638
+ independent blind A/B, hard functional/accessibility/interaction gates and
639
+ keep/revert to the best-known candidate. Record a finite budget and plateau
640
+ threshold before editing; stop at goal, plateau or budget. Aesthetic scores
641
+ alone cannot establish success. Existing exact-revision delivery gates remain.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axstack",
3
- "version": "0.52.2",
3
+ "version": "0.53.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",
@@ -118,6 +118,15 @@
118
118
  "notes": "Sonnet high research web reader: gathers primary-source facts efficiently. T3 resolves Claude classes from saved capabilities; a Claude rejection holds.",
119
119
  "modelClass": "sonnet"
120
120
  },
121
+ {
122
+ "id": "axstack-research-web-sol",
123
+ "name": "Axstack research web Terra",
124
+ "provider": "claude",
125
+ "model": null,
126
+ "modeId": "bypassPermissions",
127
+ "thinkingOptionId": "high",
128
+ "notes": "Intentional single-provider absence: the mixed Terra web pair is unavailable in this preset. Record the absence and use the base web researcher without substitution."
129
+ },
121
130
  {
122
131
  "id": "axstack-research-x",
123
132
  "name": "Axstack research X (unavailable)",
@@ -51,8 +51,8 @@
51
51
  "name": "Axstack reviewer (secondary)",
52
52
  "provider": "codex",
53
53
  "modeId": "full-access",
54
- "thinkingOptionId": "xhigh",
55
- "notes": "Terra xhigh authored reviewer for a Sol-authored candidate. Never author or owner; review exact SHA and base across all six angles and acceptance.",
54
+ "thinkingOptionId": "high",
55
+ "notes": "Terra high authored reviewer for a Sol-authored candidate. Never author or owner; review exact SHA and base across all six angles and acceptance.",
56
56
  "modelClass": "terra"
57
57
  },
58
58
  {
@@ -118,6 +118,15 @@
118
118
  "notes": "Research web reader: gathers primary-source facts efficiently. Resolve the class from saved T3 capabilities at run start; rejection and unavailable settings hold without substitution.",
119
119
  "modelClass": "sol"
120
120
  },
121
+ {
122
+ "id": "axstack-research-web-sol",
123
+ "name": "Axstack research web Terra",
124
+ "provider": "codex",
125
+ "model": null,
126
+ "modeId": "full-access",
127
+ "thinkingOptionId": "high",
128
+ "notes": "Intentional single-provider absence: the mixed Terra web pair is unavailable in this preset. Record the absence and use the base web researcher without substitution."
129
+ },
121
130
  {
122
131
  "id": "axstack-research-x",
123
132
  "name": "Axstack research X (unavailable)",
@@ -118,6 +118,15 @@
118
118
  "notes": "Sonnet high research web reader: gathers primary-source facts efficiently. T3 resolves Claude classes from saved capabilities; a Claude rejection holds.",
119
119
  "modelClass": "sonnet"
120
120
  },
121
+ {
122
+ "id": "axstack-research-web-sol",
123
+ "name": "Axstack research web Terra",
124
+ "provider": "codex",
125
+ "modeId": "full-access",
126
+ "thinkingOptionId": "high",
127
+ "notes": "Independent Terra high web researcher on the same bounded brief as the Sonnet base seat without cross-reading. Cites primary sources for driver reconciliation per claim; optional seat failures follow the role roster.",
128
+ "modelClass": "terra"
129
+ },
121
130
  {
122
131
  "id": "axstack-research-x",
123
132
  "name": "Axstack research X",
@@ -142,8 +151,8 @@
142
151
  "name": "Axstack explainer reviewer",
143
152
  "provider": "codex",
144
153
  "modeId": "full-access",
145
- "thinkingOptionId": "medium",
146
- "notes": "Independent Terra medium explanation reviewer: always reviews every visual. Reviews consequential or complex driver-written prose or on request. Checks the exact artifact for text and source fidelity. The browser interaction pass belongs to axstack-ui-verifier. Any artifact change invalidates its review. Resolve the class from saved T3 capabilities at run start; rejection and unavailable settings hold without substitution. Design review follows design.md hard rules and FRONTEND-DESIGN.md (calibration defaults, restraint and quality floor) for every inline HTML page and every Publish article adaptation. For inline pages the reviewer itself renders exact bytes with html_preview at 728px dark and 360px light as a non-publishing self-check. For Publish the reviewer opens axstack-ui-verifier PNGs at 728px dark and 360px light plus 390px mobile and 1440px desktop, covering all four widths in both themes with paths bound to the artifact SHA-256 and recorded before review. Inspect the 1440px desktop screenshot for balanced composition, intentional horizontal margins, bounded prose measure, typography, section spacing and chart legibility. Inspect the 360px and 390px mobile screenshots for gutters, readable text and chart labels. A page failing to look decent is a blocking design finding, repaired by the same author within the two-round visual limit. If only design findings remain after the second round, deliver the visual with each finding named. Never describe a remaining finding as fixed or a clean pass. Apply Delivery's normal holds for other failures and unknown renders. Chat Mermaid and anatomy keep their existing review.",
154
+ "thinkingOptionId": "high",
155
+ "notes": "Independent Terra high explanation reviewer: always reviews every visual. Reviews consequential or complex driver-written prose or on request. Checks the exact artifact for text and source fidelity. The browser interaction pass belongs to axstack-ui-verifier. Any artifact change invalidates its review. Resolve the class from saved T3 capabilities at run start; rejection and unavailable settings hold without substitution. Design review follows design.md hard rules and FRONTEND-DESIGN.md (calibration defaults, restraint and quality floor) for every inline HTML page and every Publish article adaptation. For inline pages the reviewer itself renders exact bytes with html_preview at 728px dark and 360px light as a non-publishing self-check. For Publish the reviewer opens axstack-ui-verifier PNGs at 728px dark and 360px light plus 390px mobile and 1440px desktop, covering all four widths in both themes with paths bound to the artifact SHA-256 and recorded before review. Inspect the 1440px desktop screenshot for balanced composition, intentional horizontal margins, bounded prose measure, typography, section spacing and chart legibility. Inspect the 360px and 390px mobile screenshots for gutters, readable text and chart labels. A page failing to look decent is a blocking design finding, repaired by the same author within the two-round visual limit. If only design findings remain after the second round, deliver the visual with each finding named. Never describe a remaining finding as fixed or a clean pass. Apply Delivery's normal holds for other failures and unknown renders. Chat Mermaid and anatomy keep their existing review.",
147
156
  "modelClass": "terra"
148
157
  },
149
158
  {
@@ -15,7 +15,7 @@
15
15
  | --- | --- | --- |
16
16
  | `mixed` | `codex/sol` | `axstack-reviewer-secondary` (`claude/opus` high) |
17
17
  | `mixed` | `claude/opus` | `axstack-reviewer-primary` (`codex/sol` high) |
18
- | `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/terra` xhigh) |
18
+ | `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/terra` high) |
19
19
  | `claude-only` | `claude/opus` | `axstack-reviewer-secondary` (`claude/sonnet` high) |
20
20
  - `axstack-advisor-astra`/`axstack-advisor-opus` advise and author candidates;
21
21
  `axstack-arena-candidate-grok` adds a family.
@@ -24,7 +24,7 @@
24
24
  `axstack-auditor` audits; `axstack-checker` reports discrepancies.
25
25
  - `axstack-explainer` authors every visual Explain delivers, including pages,
26
26
  chat Mermaid and anatomy figures; mixed pins Sonnet 5.5 high exactly.
27
- - `axstack-explainer-review` always reviews every visual; `codex/terra` medium in mixed.
27
+ - `axstack-explainer-review` always reviews every visual; `codex/terra` high in mixed.
28
28
  Consequential or complex driver-written prose keeps its review rule; every
29
29
  whiteboard defense is consequential, in chat too.
30
30
  - `axstack-diligence`: read-only [diligence checks](diligence.md) for every authored PR
@@ -52,8 +52,13 @@
52
52
  independently from its base seat on the same bounded brief without
53
53
  cross-reading. The driver reconciles findings per claim, never averages.
54
54
  Record intentional absence and continue with Sonnet alone.
55
+ - Web pair `axstack-research-web`/`axstack-research-web-sol`: Sonnet high +
56
+ Terra high in mixed, independently on the same bounded brief without
57
+ cross-reading, with driver reconciliation per claim. The `-sol` web seat is
58
+ intentionally absent in both single-provider presets; use the base seat alone.
55
59
  - Optional seats: `axstack-arena-candidate-grok`,
56
60
  `axstack-research-x`, `axstack-checker`, `axstack-research-code-sol`,
61
+ `axstack-research-web-sol`,
57
62
  `axstack-explore-execution-sol`, `axstack-auditor-sol`.
58
63
  Always dispatch optional seats when configured and available, except research
59
64
  branches, which follow [Research step 2](../../axstack-research/SKILL.md#procedure) sizing.
@@ -32,6 +32,8 @@ provider's first listed model from saved capabilities and records its exact ID.
32
32
  A Codex or Claude role with neither model nor class is an intentional absence
33
33
  and holds.
34
34
  Resume must reuse the saved capabilities and role snapshot with no re-resolution; changes require the user’s explicit decision.
35
+ Every Terra class or explicit Terra model pin requires exactly high effort.
36
+ Missing high effort holds without substitution or silently coercing the request.
35
37
  An unavailable provider, model, role, mode or effort holds that role with no substitution.
36
38
  Preset changes apply to new runs only; an active run keeps its snapshot.
37
39
  Replacing a session needs an explicit user decision and revalidation.
@@ -68,7 +70,7 @@ step (3) for user routing: no substitution or same-provider review.
68
70
  - A bug, failing test, regression, or wrong behavior, red loop wanted ->
69
71
  `axstack-debug`: diagnose, escalate via adviser-directed investigators, hand
70
72
  off a classified repair (explain: how; debug: what's wrong).
71
- - Code quality/refactor discovery -> `axstack-improve`: rank bounded
73
+ - Code quality/refactor or named UI screen/flow discovery -> `axstack-improve`: rank bounded
72
74
  candidates with evidence; report only, no source edits.
73
75
  - Repeated mistakes need evidence and stronger checks -> `axstack-correct`:
74
76
  user-invoked, report only.
@@ -0,0 +1,75 @@
1
+ # Bounded UI improvement
2
+
3
+ Use this loop only for authorized UI changes to the named screen or flow.
4
+ Improve owns report-only discovery; Implement owns changes. Reuse the existing
5
+ PR author, `axstack-ui-verifier` and independent authored reviewer from the
6
+ run's role snapshot; create no new roles. Follow [UI verification](ui-verification.md)
7
+ for read-only Playwright capture in the verifier's isolated checkout and private
8
+ evidence folder. The author never reviews its own change.
9
+
10
+ ## Establish the comparison
11
+
12
+ Before the first edit, anchor task and visual goals to acceptance criteria.
13
+ Use the discovery's ranked defects: for example, the primary action is visible
14
+ at the agreed mobile width, labels remain legible in both themes, and the named
15
+ keyboard task completes. Describe intended users and the visual direction in
16
+ concrete terms so preference has an inspectable basis.
17
+ Before the first edit, record a finite attempt and time budget plus a plateau
18
+ threshold (consecutive attempts without a supported improvement).
19
+ Freeze the capture protocol with routes, fixtures, viewports, themes and states.
20
+ Include browser/build settings, data and authentication fixtures, font loading,
21
+ animation settling, scroll position, and the interactions used to reach each
22
+ state. Freeze the procedure, not a candidate image. Keep comparable evidence
23
+ for loading, empty, error and populated states where relevant.
24
+ Capture the baseline through the verifier before editing.
25
+ Preserve the baseline as the best-known revision with its evidence.
26
+ When the protocol changes, recapture both sides before comparison and record why.
27
+
28
+ ## Attempt, compare, decide
29
+
30
+ Use one writer and one hypothesis for each attempt.
31
+ Tie the small change to one ranked defect and its acceptance checks; keep
32
+ unrelated cleanup outside the attempt. Apply Implement's normal TDD path.
33
+ For a visual-only attempt, red requires axstack-ui-verifier to execute the
34
+ anchored acceptance check against best-known before the edit and record its
35
+ failure with capture evidence. Never count a screenshot alone as behavioral red.
36
+ Never count a subjective score as behavioral red.
37
+ Green requires the verifier's fresh candidate to pass that same acceptance
38
+ check plus all hard gates. Observable repository behavior tests remain required
39
+ where applicable. Browser checks, including red and green, remain delegated to
40
+ axstack-ui-verifier. If a meaningful test-first check is unavailable, hold
41
+ dependent implementation for a scoped decision. Never count retrospective
42
+ checks as red.
43
+ Each attempt requires fresh renders of best-known and candidate exact revisions
44
+ under the same protocol. Bind screenshots and interaction logs to revision,
45
+ route, fixture, viewport, theme and state in the private evidence manifest.
46
+ A missing or failed capture or uncertain comparison cannot justify a win.
47
+
48
+ Give an independent reviewer a blind A/B with random labels and the anchored
49
+ criteria. The driver retains the label-to-revision mapping separately from the
50
+ review packet. Hide author identity, change narrative, hypothesis and expected
51
+ winner; supply matching task context and state coverage for both sides. Review
52
+ all captures and relevant interaction evidence, with findings tied to specific
53
+ regions or actions. Record preference, reasons, regressions and uncertainty
54
+ before revealing the mapping; never treat the author's preference as review.
55
+
56
+ Functional, accessibility and interaction hard gates must pass before any keep
57
+ decision. Verify the named task, keyboard/focus behavior, accessible names,
58
+ contrast, responsive layout, reduced motion and affected tests as applicable;
59
+ an unrun applicable gate remains unknown and prevents keeping the attempt.
60
+ Keep only an evidence-backed improvement against the criteria, otherwise revert
61
+ to best-known. Record the decision, rejected hypothesis and exact resulting
62
+ revision; preserve each accepted best-known candidate and its evidence.
63
+ Resolve disagreement with specific evidence and recapture within budget, then
64
+ retain best-known if unresolved. Recheck the disputed state with a fresh blind
65
+ independent comparison; ties and unresolved tradeoffs are inconclusive, never
66
+ a forced win or averaged vote. Failed attempts consume the budget too.
67
+ Never use a numeric aesthetic score as the sole success criterion.
68
+
69
+ Stop at the goal, budget exhaustion or plateau and report unverified boundaries.
70
+ Return the best-known revision, attempt/keep/revert ledger, evidence paths,
71
+ criteria met, remaining defects and stop reason. Budget exhaustion may leave
72
+ the UI goal unmet; say so. The driver can finish an authorized bounded run
73
+ without a new human taste approval. Explain's two-round visual limit does not
74
+ apply to this loop. Existing exact-revision review, verification and merge gates
75
+ remain required; this comparison grants no publication or merge authority.
@@ -87,6 +87,9 @@ try {
87
87
  const catalog = JSON.parse(readFileSync(path, 'utf8'));
88
88
  const instance = providerFrom(catalog, provider);
89
89
  const model = modelFrom(instance.models, options);
90
+ if ((options.class === 'terra' || /^gpt-\d+(?:\.\d+)*-terra$/.test(model.id)) && effort !== 'high') {
91
+ throw new Error('Terra requires exactly high effort');
92
+ }
90
93
  const effortOptions = model.options.filter((option) => option.id === effortIds[provider]);
91
94
  if (effortOptions.length !== 1 || !effortOptions[0].options?.some((value) => value.id === effort)
92
95
  || (provider === 'grok' && effort === 'max')) {
@@ -109,7 +109,7 @@ counts with denominators plus the evidence behind the count:
109
109
  | --- | --- | --- |
110
110
  | `mixed` | `codex/sol` | `axstack-reviewer-secondary` (`claude/opus` high) |
111
111
  | `mixed` | `claude/opus` | `axstack-reviewer-primary` (`codex/sol` high) |
112
- | `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/terra` xhigh) |
112
+ | `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/terra` high) |
113
113
  | `claude-only` | `claude/opus` | `axstack-reviewer-secondary` (`claude/sonnet` high) |
114
114
  - Simplification applicability determinations evidenced / total candidate diffs,
115
115
  and complete simplification receipts / total candidates, broken down as
@@ -84,6 +84,8 @@ Size alone never requires user approval.
84
84
 
85
85
  ## 3. Establish test-first evidence
86
86
 
87
+ For authorized UI improvement work, load [UI improvement loop](../axstack/references/ui-improvement-loop.md).
88
+
87
89
  For performance work only, load [Performance loop](../axstack/references/perf-loop.md).
88
90
  For performance work, run the change loop defined in [Performance loop](../axstack/references/perf-loop.md).
89
91
  For an accepted optimization scope without new behavior explicitly marked structure-preserving, use the structure-preserving path with the same checks green before and after plus the measured delta.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: axstack-improve
3
- description: When assessing codebase quality or planning a refactor, use axstack-improve to find evidenced improvements and prepare behavior-preserving changes.
3
+ description: When assessing codebase quality, improving a named screen or flow, or planning a refactor, use axstack-improve to report evidenced improvements and prepare bounded changes.
4
4
  ---
5
5
 
6
6
  # Improve
@@ -9,8 +9,8 @@ On driver entry, sweep under [Workspace hygiene](../axstack/references/workspace
9
9
  For every dispatch brief, name its private `<run dir>/evidence/<dispatch>/` folder.
10
10
 
11
11
  Find a small set of worthwhile maintainability, architecture, or testability
12
- improvements from inspected code. This is a direct discovery route: it needs no
13
- spec or tickets and writes only the requested report. No worthwhile
12
+ improvements from inspected code or rendered UI. This is a direct discovery
13
+ route: it needs no spec or tickets and writes only the requested report. No worthwhile
14
14
  improvement is a valid result.
15
15
 
16
16
  Before acting, load [Standing contracts](../axstack/references/contracts.md),
@@ -50,6 +50,23 @@ For performance work, rank candidates in mantra order.
50
50
  4. Apply KISS, YAGNI, and SOLID as judgment, not a mandatory scorecard. Use no
51
51
  invented metrics and no arbitrary complexity targets.
52
52
 
53
+ ### UI discovery
54
+
55
+ UI discovery for a named screen or flow remains report-only.
56
+ Record the user's task, exact build/revision, inspected route and relevant
57
+ fixtures, themes, viewports and interaction states before assessing it.
58
+ UI discovery requires Playwright render evidence from `axstack-ui-verifier`
59
+ at the exact revision under [UI verification](../axstack/references/ui-verification.md).
60
+ Rank UI defects in hierarchy, typography, spacing, contrast, responsive layout
61
+ and interaction with evidence and acceptance criteria. Link each defect to a
62
+ capture or observed action, explain user impact, and rank by task blockage,
63
+ severity and likely benefit relative to effort; separate observation from preference.
64
+ UI discovery labels a missing or failed capture unverified.
65
+ Return the ranked report and capture boundaries, including a no-change result
66
+ when warranted. Clear authorized UI work routes to Implement with its accepted
67
+ small-change intent; selection alone retains section 3's action boundary.
68
+ For the execution handoff, read [UI improvement loop](../axstack/references/ui-improvement-loop.md).
69
+
53
70
  ### Test-audit lens
54
71
 
55
72
  For a test audit, load [Test value](../axstack/references/test-value.md) and
@@ -37,7 +37,9 @@ is part of research.
37
37
  For each needed source class, retain two isolated branches where configured.
38
38
  In mixed, each needed source class retains branches from different providers.
39
39
  The code pair is `axstack-research-code` +
40
- `axstack-research-code-sol`; the web branch is `axstack-research-web`;
40
+ `axstack-research-code-sol`.
41
+ In mixed the web pair is `axstack-research-web` +
42
+ `axstack-research-web-sol` (Terra high);
41
43
  the execution pair is `axstack-explore-execution` +
42
44
  `axstack-explore-execution-sol`. Requirements, code, and web use Sonnet high
43
45
  in mixed/claude-only and Codex in codex-only; X uses Grok.
@@ -57,13 +59,14 @@ is part of research.
57
59
  - `axstack-research-code`: code behavior.
58
60
  - `axstack-research-code-sol`: independent code investigation (Terra high in mixed, Sol high in codex-only).
59
61
  - `axstack-research-web`: web and external sources.
62
+ - `axstack-research-web-sol`: independent Terra high web reader in mixed; intentionally absent in both single-provider presets.
60
63
  - `axstack-research-x`: X (Twitter) posts and threads via Grok; cite post URLs and dates.
61
64
  - For broad codebase mapping, use `axstack-scout`.
62
65
  Never dispatch `axstack-explore-codebase` directly for broad mapping.
63
66
  - `axstack-explore-execution`: execution and runtime traces.
64
67
  - `axstack-explore-execution-sol`: independent execution investigation (Terra high in mixed, Sol high in codex-only).
65
68
 
66
- When dispatching `axstack-research-code` or `axstack-explore-execution`,
69
+ When dispatching `axstack-research-web`, `axstack-research-code` or `axstack-explore-execution`,
67
70
  dispatch its `-sol` pair independently on the same bounded brief without
68
71
  cross-reading. The driver reconciles agreement and disagreement per claim,
69
72
  never averaging findings. Record an intentionally absent pair and proceed
@@ -36,7 +36,7 @@ This section applies to peer and authored PR modes.
36
36
  | --- | --- | --- |
37
37
  | `mixed` | `codex/sol` | `axstack-reviewer-secondary` (`claude/opus` high) |
38
38
  | `mixed` | `claude/opus` | `axstack-reviewer-primary` (`codex/sol` high) |
39
- | `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/terra` xhigh) |
39
+ | `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/terra` high) |
40
40
  | `claude-only` | `claude/opus` | `axstack-reviewer-secondary` (`claude/sonnet` high) |
41
41
 
42
42
  The diligence receipt is separate and does not count as a reviewer receipt.
package/src/roles.js CHANGED
@@ -22,7 +22,7 @@ const AUTHORED_ROUTES = Object.freeze({
22
22
  'claude/opus': ['axstack-reviewer-primary', 'codex/sol', 'high'],
23
23
  },
24
24
  'codex-only': {
25
- 'codex/sol': ['axstack-reviewer-secondary', 'codex/terra', 'xhigh'],
25
+ 'codex/sol': ['axstack-reviewer-secondary', 'codex/terra', 'high'],
26
26
  },
27
27
  'claude-only': {
28
28
  'claude/opus': ['axstack-reviewer-secondary', 'claude/sonnet', 'high'],
@@ -66,6 +66,9 @@ export function assertBundleRoles(roles) {
66
66
  if (hasClass && typeof role.model === 'string' && deriveModelClass(role.model) !== role.modelClass) {
67
67
  throw new Error(`invalid bundle roles: ${role.id} model pin does not match model class`);
68
68
  }
69
+ if (roleClass(role) === 'terra' && role.thinkingOptionId !== 'high') {
70
+ throw new Error(`invalid bundle roles: ${role.id} Terra requires exactly high effort`);
71
+ }
69
72
  for (const field of ['icon', 'color', 'modeId', 'thinkingOptionId', 'notes']) {
70
73
  if (role[field] !== undefined && typeof role[field] !== 'string') {
71
74
  throw new Error(`invalid bundle roles: ${field} must be a string when present`);
@@ -89,8 +92,8 @@ export function assessRoleReadiness(roles, preset) {
89
92
  const isIntentionalAbsence = (role) => role.model === null && (
90
93
  (preset === 'mixed' && role.id === 'axstack-research-x' && role.provider === 'grok') ||
91
94
  (preset === 'mixed' && role.id === 'axstack-arena-candidate-grok' && role.provider === 'grok') ||
92
- (preset === 'codex-only' && ['axstack-advisor-opus', 'axstack-escalation-fable', 'axstack-arena-judge-opus', 'axstack-research-x', 'axstack-arena-candidate-grok'].includes(role.id)) ||
93
- (preset === 'claude-only' && ['axstack-advisor-astra', 'axstack-arena-judge-astra', 'axstack-research-x', 'axstack-arena-candidate-grok', 'axstack-auditor-sol', 'axstack-research-code-sol', 'axstack-explore-execution-sol', 'axstack-explore-codebase-luna'].includes(role.id))
95
+ (preset === 'codex-only' && ['axstack-advisor-opus', 'axstack-escalation-fable', 'axstack-arena-judge-opus', 'axstack-research-x', 'axstack-arena-candidate-grok', 'axstack-research-web-sol'].includes(role.id)) ||
96
+ (preset === 'claude-only' && ['axstack-advisor-astra', 'axstack-arena-judge-astra', 'axstack-research-x', 'axstack-arena-candidate-grok', 'axstack-auditor-sol', 'axstack-research-code-sol', 'axstack-explore-execution-sol', 'axstack-explore-codebase-luna', 'axstack-research-web-sol'].includes(role.id))
94
97
  );
95
98
  for (const role of roles) {
96
99
  if (!bounds.has(role.provider)) {