axstack 0.33.0 → 0.34.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 +1 -1
- package/docs/workflows.md +6 -3
- package/package.json +1 -1
- package/profiles/presets/mixed.json +11 -10
- package/skills/axstack/references/role-roster.md +8 -5
- package/skills/axstack/scripts/readiness.js +41 -10
- package/skills/axstack-audit/SKILL.md +3 -3
- package/skills/axstack-review/SKILL.md +2 -2
- package/src/roles.js +1 -1
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ coordination. You can start at the phase you need.
|
|
|
15
15
|
| Failure mode | How Axstack responds |
|
|
16
16
|
| --- | --- |
|
|
17
17
|
| Wrong thing built | Align rounds clarify the request; every brainstorm runs a light arena across configured families. Use judges only for Rung 2 hard-to-reverse choices. |
|
|
18
|
-
| Nobody really reviewed it | Strict TDD checks behavior first; mixed authored review is cross-provider, and mixed peer review pairs Sol high with Opus
|
|
18
|
+
| Nobody really reviewed it | Strict TDD checks behavior first; mixed authored review is cross-provider, and mixed peer review pairs Sol high with Opus medium in isolated sessions at the exact revision. |
|
|
19
19
|
| Design rot | The design lens sketches boundaries before a build; Improve surfaces evidenced changes later. |
|
|
20
20
|
| Agents left a mess | T3 makes delegation visible, one writer owns each PR, cleanup stays bounded, and watched own PRs merge under guarded rules. |
|
|
21
21
|
|
package/docs/workflows.md
CHANGED
|
@@ -119,11 +119,11 @@ role.
|
|
|
119
119
|
|
|
120
120
|
| Preset | Author | Ordered peer reviewers | Astra / Opus advisers | Auditor |
|
|
121
121
|
| --- | --- | --- | --- | --- |
|
|
122
|
-
| `mixed` | Sol high | Sol high; Opus
|
|
122
|
+
| `mixed` | Sol high | Sol high; Opus medium | Astra high / Opus xhigh | Haiku xhigh + Sol high |
|
|
123
123
|
| `codex-only` | Sol high | Sol high; Luna xhigh | Astra high / unavailable | Luna xhigh + Sol high |
|
|
124
124
|
| `claude-only` | Opus medium | Opus medium; Sonnet high | unavailable / Opus xhigh | Sonnet high (Sol absent) |
|
|
125
125
|
|
|
126
|
-
In `mixed` and `claude-only`, `axstack-
|
|
126
|
+
In `mixed` and `claude-only`, `axstack-research-requirements`,
|
|
127
127
|
`axstack-research-code`, `axstack-research-web`, and `axstack-explore-execution`
|
|
128
128
|
use the Claude Sonnet class at high effort. `axstack-explore-codebase` and
|
|
129
129
|
`axstack-monitor` adopt Haiku 5.5 high, with class `haiku` and exact pin
|
|
@@ -131,6 +131,9 @@ use the Claude Sonnet class at high effort. `axstack-explore-codebase` and
|
|
|
131
131
|
holds those roles without substitution. `codex-only` keeps its Codex
|
|
132
132
|
assignments for those roles. Mixed web-google and X retain their source-specific
|
|
133
133
|
Antigravity and Grok routes.
|
|
134
|
+
The mixed `axstack-auditor` uses Haiku 5.5 xhigh, pinned to `claude-haiku-5-5`;
|
|
135
|
+
missing that ID or xhigh effort holds without substitution. The mixed
|
|
136
|
+
`axstack-explainer-review` uses Sol medium; `axstack-explainer` stays Sonnet high.
|
|
134
137
|
The new `-sol` auditor, research-code, and explore-execution seats use Sol high
|
|
135
138
|
in `mixed` and `codex-only`; `claude-only` records each as intentionally absent.
|
|
136
139
|
Dispatch the base and Sol seats independently on the same brief, then reconcile
|
|
@@ -148,7 +151,7 @@ later installation changes without re-resolution.
|
|
|
148
151
|
Peer roles use the stable IDs `axstack-reviewer-primary` and
|
|
149
152
|
`axstack-reviewer-peer`; their provider/class mappings come only from the
|
|
150
153
|
selected preset. The mixed cross-provider peer pair is Sol high followed by
|
|
151
|
-
Opus
|
|
154
|
+
Opus medium. The mixed peer coordinator and review-lane binding
|
|
152
155
|
`axstack-owner` uses Sol high and never reviews. `axstack-reviewer-secondary`
|
|
153
156
|
is used in the authored mapping and, alongside `axstack-reviewer-primary`,
|
|
154
157
|
in codebase findings mode.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "axstack",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.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",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"provider": "codex",
|
|
44
44
|
"modeId": "full-access",
|
|
45
45
|
"thinkingOptionId": "high",
|
|
46
|
-
"notes": "Primary reviewer in the ordered mixed peer pair: Sol high followed by Opus
|
|
46
|
+
"notes": "Primary reviewer in the ordered mixed peer pair: Sol high followed by Opus medium. Eligible authored reviewer for an Opus-authored candidate. Never author or owner; review exact SHA and base across all six angles and acceptance. Peer first pass stays isolated.",
|
|
47
47
|
"modelClass": "sol"
|
|
48
48
|
},
|
|
49
49
|
{
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"name": "Axstack reviewer (secondary)",
|
|
52
52
|
"provider": "claude",
|
|
53
53
|
"modeId": "bypassPermissions",
|
|
54
|
-
"thinkingOptionId": "
|
|
54
|
+
"thinkingOptionId": "high",
|
|
55
55
|
"notes": "Eligible authored reviewer for a Sol-authored candidate. Never author or owner; review exact SHA and base across all six angles and acceptance. T3 resolves Claude classes from saved capabilities; a Claude rejection holds.",
|
|
56
56
|
"modelClass": "opus"
|
|
57
57
|
},
|
|
@@ -60,8 +60,8 @@
|
|
|
60
60
|
"name": "Axstack reviewer (peer)",
|
|
61
61
|
"provider": "claude",
|
|
62
62
|
"modeId": "bypassPermissions",
|
|
63
|
-
"thinkingOptionId": "
|
|
64
|
-
"notes": "Second reviewer in the ordered mixed peer pair: Sol high followed by Opus
|
|
63
|
+
"thinkingOptionId": "medium",
|
|
64
|
+
"notes": "Second reviewer in the ordered mixed peer pair: Sol high followed by Opus medium. Never author or owner; review exact SHA and base across all six angles and acceptance. Peer first pass stays isolated. T3 resolves Claude classes from saved capabilities; a Claude rejection holds.",
|
|
65
65
|
"modelClass": "opus"
|
|
66
66
|
},
|
|
67
67
|
{
|
|
@@ -150,9 +150,9 @@
|
|
|
150
150
|
"name": "Axstack explainer reviewer",
|
|
151
151
|
"provider": "codex",
|
|
152
152
|
"modeId": "full-access",
|
|
153
|
-
"thinkingOptionId": "
|
|
154
|
-
"notes": "Independent explanation reviewer: reviews consequential or complex claims, archify output, or on request. Checks the exact artifact for text and source fidelity. The rendered 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.",
|
|
155
|
-
"modelClass": "
|
|
153
|
+
"thinkingOptionId": "medium",
|
|
154
|
+
"notes": "Independent Sol medium explanation reviewer: reviews consequential or complex claims, archify output, or on request. Checks the exact artifact for text and source fidelity. The rendered 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.",
|
|
155
|
+
"modelClass": "sol"
|
|
156
156
|
},
|
|
157
157
|
{
|
|
158
158
|
"id": "axstack-ui-verifier",
|
|
@@ -206,9 +206,10 @@
|
|
|
206
206
|
"name": "Axstack auditor",
|
|
207
207
|
"provider": "claude",
|
|
208
208
|
"modeId": "bypassPermissions",
|
|
209
|
-
"thinkingOptionId": "
|
|
210
|
-
"notes": "
|
|
211
|
-
"modelClass": "
|
|
209
|
+
"thinkingOptionId": "xhigh",
|
|
210
|
+
"notes": "Haiku 5.5 xhigh read-only end-of-run and checkpoint auditor. Collects scope and outcome evidence with counts and denominators and reports PASS, FAIL, or UNKNOWN without inventing numbers. Never edits, merges, activates, or audits itself. T3 uses the exact claude-haiku-5-5 pin from saved capabilities; a Claude rejection holds. Missing model or xhigh effort holds without substitution.",
|
|
211
|
+
"modelClass": "haiku",
|
|
212
|
+
"model": "claude-haiku-5-5"
|
|
212
213
|
},
|
|
213
214
|
{
|
|
214
215
|
"id": "axstack-auditor-sol",
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
Only the recorded owning watch thread merges, including `axstack-owner`
|
|
8
8
|
for authorized standalone maintenance. Other roles never acquire merge authority.
|
|
9
9
|
- `axstack-reviewer-primary` and `axstack-reviewer-peer` are the ordered
|
|
10
|
-
peer pair. In `mixed`, the cross-provider pair is Sol high followed by Opus
|
|
10
|
+
peer pair. In `mixed`, the cross-provider pair is Sol high followed by Opus medium.
|
|
11
11
|
Peer review uses both; authored review uses this table:
|
|
12
12
|
|
|
13
13
|
| Preset | Author class | Reviewer (class/effort) |
|
|
14
14
|
| --- | --- | --- |
|
|
15
|
-
| `mixed` | `codex/sol` | `axstack-reviewer-secondary` (`claude/opus`
|
|
15
|
+
| `mixed` | `codex/sol` | `axstack-reviewer-secondary` (`claude/opus` high) |
|
|
16
16
|
| `mixed` | `claude/opus` | `axstack-reviewer-primary` (`codex/sol` high) |
|
|
17
17
|
| `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/luna` xhigh) |
|
|
18
18
|
| `claude-only` | `claude/opus` | `axstack-reviewer-secondary` (`claude/sonnet` high) |
|
|
@@ -24,15 +24,18 @@
|
|
|
24
24
|
`axstack-auditor` audits; `axstack-checker` reports discrepancies.
|
|
25
25
|
- `axstack-explainer` authors archify only on an explicit viewer request.
|
|
26
26
|
- `axstack-explainer-review` reviews consequential or complex claims, archify
|
|
27
|
-
output, or on request.
|
|
27
|
+
output, or on request; `codex/sol` medium in mixed.
|
|
28
28
|
- `axstack-diligence`: read-only [diligence checks](diligence.md) for every PR
|
|
29
29
|
review round and bounded research, spec, ticket, receipt, and release claims.
|
|
30
30
|
- `axstack-ui-verifier`: owns the inline page interaction pass under [UI checks](ui-verification.md)
|
|
31
31
|
for every interactive page, bound to the exact bytes and SHA-256.
|
|
32
|
-
- `axstack-
|
|
32
|
+
- `axstack-research-requirements`/
|
|
33
33
|
`axstack-research-code`/`axstack-research-web`/
|
|
34
34
|
`axstack-explore-execution`:
|
|
35
35
|
`claude/sonnet` high in mixed/claude-only.
|
|
36
|
+
- `axstack-auditor`: `claude/haiku` xhigh in mixed, pinned to
|
|
37
|
+
`claude-haiku-5-5`. Missing that exact model or xhigh effort holds without
|
|
38
|
+
substitution. `claude/sonnet` high in claude-only; `codex/luna` xhigh in codex-only.
|
|
36
39
|
- `axstack-explore-codebase`/`axstack-monitor`: `claude/haiku` high in
|
|
37
40
|
mixed/claude-only, pinned to `claude-haiku-5-5`. Missing that exact model
|
|
38
41
|
or high effort holds these roles without substitution.
|
|
@@ -41,7 +44,7 @@
|
|
|
41
44
|
- Sol pairs `axstack-auditor-sol`/`axstack-research-code-sol`/
|
|
42
45
|
`axstack-explore-execution-sol`: `codex/sol` high in
|
|
43
46
|
mixed/codex-only; intentionally absent in claude-only. Dispatch each
|
|
44
|
-
independently from its
|
|
47
|
+
independently from its base seat on the same bounded brief without
|
|
45
48
|
cross-reading. The driver reconciles findings per claim, never averages.
|
|
46
49
|
Record intentional absence and continue with Sonnet alone.
|
|
47
50
|
- Optional seats: `axstack-arena-candidate-grok`,
|
|
@@ -89,12 +89,19 @@ const definitions = [
|
|
|
89
89
|
['security.pr-tests', 'Governance/Security'], ['security.status-checks', 'Governance/Security'], ['security.updates', 'Governance/Security'], ['security.secrets', 'Governance/Security'],
|
|
90
90
|
];
|
|
91
91
|
|
|
92
|
-
function packageManager(files) {
|
|
92
|
+
function packageManager(files, pkg) {
|
|
93
93
|
const locks = [
|
|
94
94
|
['bun', ['bun.lock', 'bun.lockb']], ['npm', ['package-lock.json', 'npm-shrinkwrap.json']],
|
|
95
95
|
['pnpm', ['pnpm-lock.yaml']], ['yarn', ['yarn.lock']],
|
|
96
96
|
].filter(([, names]) => names.some(files.has));
|
|
97
|
-
if (!locks.length)
|
|
97
|
+
if (!locks.length) {
|
|
98
|
+
const dependencyFields = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies', 'bundledDependencies', 'bundleDependencies', 'workspaces'];
|
|
99
|
+
if (!files.has('pnpm-workspace.yaml') && dependencyFields.every((field) => !pkg?.[field] || Object.keys(pkg[field]).length === 0)) {
|
|
100
|
+
if (typeof pkg?.packageManager === 'string' && /^bun@[^@\s]+$/.test(pkg.packageManager)) return { name: 'bun', paths: ['package.json: packageManager'] };
|
|
101
|
+
if (pkg?.packageManager === undefined && typeof pkg?.engines?.bun === 'string' && pkg.engines.bun.trim()) return { name: 'bun', paths: ['package.json: engines.bun'] };
|
|
102
|
+
}
|
|
103
|
+
return { reason: 'no lockfile' };
|
|
104
|
+
}
|
|
98
105
|
if (locks.length > 1) return { reason: 'ambiguous lockfile' };
|
|
99
106
|
const [name, paths] = locks[0];
|
|
100
107
|
if (name === 'yarn' && !/^__metadata:/m.test(files.read('yarn.lock'))) return { reason: 'unsupported package manager' };
|
|
@@ -150,7 +157,7 @@ function assess(files) {
|
|
|
150
157
|
}
|
|
151
158
|
configured('style.pre-commit', has(/(^|\/)(\.pre-commit-config\.ya?ml|lefthook\.ya?ml|\.lefthook\.ya?ml|\.husky\/pre-commit)$/).concat(pkg.husky?.hooks?.['pre-commit'] ? ['package.json'] : []));
|
|
152
159
|
configured('env.lockfile', has(/^(bun\.lockb?|package-lock\.json|npm-shrinkwrap\.json|pnpm-lock\.yaml|yarn\.lock)$/));
|
|
153
|
-
const manager = packageManager(files);
|
|
160
|
+
const manager = packageManager(files, pkg);
|
|
154
161
|
declaredCommands(files, pkg, manager, set, invalidPackage);
|
|
155
162
|
configured('env.toolchain', has(/^(\.tool-versions|mise\.toml|\.mise\.toml|\.nvmrc|\.devcontainer\.json|\.devcontainer\/(devcontainer\.json|[^/]+\/devcontainer\.json))$/).concat(pkg.engines && Object.keys(pkg.engines).length ? ['package.json'] : []));
|
|
156
163
|
configured('testing.files', has(/(^|\/)((tests?|__tests__)\/.*\.[cm]?[jt]sx?|[^/]+\.(test|spec)\.[cm]?[jt]sx?)$/));
|
|
@@ -168,7 +175,7 @@ function assess(files) {
|
|
|
168
175
|
const steps = Object.values(workflow?.jobs ?? {}).flatMap((job) => job?.steps ?? []);
|
|
169
176
|
const runs = steps.map((step) => step?.run).filter((run) => typeof run === 'string');
|
|
170
177
|
if (steps.some((step) => typeof step?.uses === 'string' && /^github\/codeql-action\//.test(step.uses))) codeql.push(path);
|
|
171
|
-
const invokes = (run, name) => new RegExp(`(?:^|[\\n;&|])\\s*${name}\\s
|
|
178
|
+
const invokes = (run, name) => new RegExp(`(?:^|[\\n;&|])\\s*${name}\\s+(?:run\\s+)?test(?:\\s|[;&|]|$)`).test(run);
|
|
172
179
|
if (pr && runs.some((run) => ['bun', 'npm', 'pnpm', 'yarn'].some((name) => invokes(run, name)))) prCandidate = true;
|
|
173
180
|
if (pr && manager.name && runs.some((run) => invokes(run, manager.name))) prTests = true;
|
|
174
181
|
} catch { invalid = true; }
|
|
@@ -194,19 +201,43 @@ export function summarizePillars(criteria) {
|
|
|
194
201
|
return result;
|
|
195
202
|
}
|
|
196
203
|
|
|
204
|
+
function parsePages(text) {
|
|
205
|
+
const pages = [];
|
|
206
|
+
let start = -1, depth = 0, quoted = false, escaped = false;
|
|
207
|
+
for (let i = 0; i < text.length; i++) {
|
|
208
|
+
const char = text[i];
|
|
209
|
+
if (start < 0) {
|
|
210
|
+
if (/\s/.test(char)) continue;
|
|
211
|
+
if (char !== '{' && char !== '[') throw new Error('invalid gh page');
|
|
212
|
+
start = i;
|
|
213
|
+
}
|
|
214
|
+
if (quoted) {
|
|
215
|
+
if (escaped) escaped = false;
|
|
216
|
+
else if (char === '\\') escaped = true;
|
|
217
|
+
else if (char === '"') quoted = false;
|
|
218
|
+
} else if (char === '"') quoted = true;
|
|
219
|
+
else if (char === '{' || char === '[') depth++;
|
|
220
|
+
else if (char === '}' || char === ']') depth--;
|
|
221
|
+
if (depth === 0) {
|
|
222
|
+
pages.push(JSON.parse(text.slice(start, i + 1)));
|
|
223
|
+
start = -1;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (start >= 0 || !pages.length) throw new Error('incomplete gh response');
|
|
227
|
+
return pages;
|
|
228
|
+
}
|
|
229
|
+
|
|
197
230
|
function forgeStatus(origin) {
|
|
198
231
|
const match = /^https:\/\/github\.com\/([\w.-]+\/[\w.-]+)$/.exec(origin);
|
|
199
232
|
const evidence = [];
|
|
200
233
|
const result = (status, reason) => ({ status, reason, evidence: evidence.length ? evidence : ['origin remote'] });
|
|
201
234
|
if (!match) return result('unknown', 'no GitHub origin');
|
|
202
235
|
function api(endpoint) {
|
|
203
|
-
const argv = [process.env.GH || 'gh', 'api', '--hostname', 'github.com', '--method', 'GET', '--paginate',
|
|
204
|
-
evidence.push(`gh api --method GET --paginate
|
|
236
|
+
const argv = [process.env.GH || 'gh', 'api', '--hostname', 'github.com', '--method', 'GET', '--paginate', endpoint];
|
|
237
|
+
evidence.push(`gh api --method GET --paginate ${endpoint}`);
|
|
205
238
|
const response = Bun.spawnSync(argv, { stdin: 'ignore', stdout: 'pipe', stderr: 'pipe' });
|
|
206
239
|
if (response.exitCode !== 0) throw new Error(response.stderr.toString().trim());
|
|
207
|
-
|
|
208
|
-
if (!Array.isArray(pages) || !pages.length) throw new Error('incomplete gh response');
|
|
209
|
-
return pages;
|
|
240
|
+
return parsePages(response.stdout.toString());
|
|
210
241
|
}
|
|
211
242
|
try {
|
|
212
243
|
const metadata = api(`repos/${match[1]}`);
|
|
@@ -268,7 +299,7 @@ async function report(args, paths) {
|
|
|
268
299
|
if (args['--run']) {
|
|
269
300
|
let pkg = {};
|
|
270
301
|
try { pkg = JSON.parse(files.read('package.json') || '{}'); } catch { /* Static criteria already record invalid JSON. */ }
|
|
271
|
-
execution = await executeDeclared(repo, revision, paths, criteria, packageManager(files), pkg, {
|
|
302
|
+
execution = await executeDeclared(repo, revision, paths, criteria, packageManager(files, pkg), pkg, {
|
|
272
303
|
timeoutMs: Number(args['--timeout-ms'] ?? 120000), logBytes: Number(args['--log-bytes'] ?? 1048576),
|
|
273
304
|
});
|
|
274
305
|
header.network = execution.network;
|
|
@@ -28,8 +28,8 @@ immediately before an actual auditor profile or session dispatch. Ordinary
|
|
|
28
28
|
audit reading and record writing do not load it, and the auditor never
|
|
29
29
|
dispatches.
|
|
30
30
|
|
|
31
|
-
Core owns the `axstack-auditor` profile (claude/
|
|
32
|
-
|
|
31
|
+
Core owns the `axstack-auditor` profile (claude/haiku xhigh in mixed,
|
|
32
|
+
claude/sonnet high in claude-only, codex/luna xhigh in codex-only) and its invocation.
|
|
33
33
|
This skill governs what that auditor reads, measures, and proposes.
|
|
34
34
|
Dispatch `axstack-auditor` and `axstack-auditor-sol` independently on the same
|
|
35
35
|
bounded brief, without cross-reading. The driver reconciles findings per claim;
|
|
@@ -107,7 +107,7 @@ counts with denominators plus the evidence behind the count:
|
|
|
107
107
|
|
|
108
108
|
| Preset | Author class | Reviewer (class/effort) |
|
|
109
109
|
| --- | --- | --- |
|
|
110
|
-
| `mixed` | `codex/sol` | `axstack-reviewer-secondary` (`claude/opus`
|
|
110
|
+
| `mixed` | `codex/sol` | `axstack-reviewer-secondary` (`claude/opus` high) |
|
|
111
111
|
| `mixed` | `claude/opus` | `axstack-reviewer-primary` (`codex/sol` high) |
|
|
112
112
|
| `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/luna` xhigh) |
|
|
113
113
|
| `claude-only` | `claude/opus` | `axstack-reviewer-secondary` (`claude/sonnet` high) |
|
|
@@ -223,14 +223,14 @@ This section applies to peer and authored PR modes.
|
|
|
223
223
|
- **Peer:** exactly two independent final reviewers,
|
|
224
224
|
`axstack-reviewer-primary` and `axstack-reviewer-peer` from the routing snapshot.
|
|
225
225
|
Send both the identical six-angle brief, with no first-pass cross-read or children.
|
|
226
|
-
The mixed peer pair is cross-provider (Sol high + Opus
|
|
226
|
+
The mixed peer pair is cross-provider (Sol high + Opus medium), with independence
|
|
227
227
|
still from separate sessions, the identical brief and an isolated first pass.
|
|
228
228
|
- **Authored:** exactly one eligible independent reviewer from this complete
|
|
229
229
|
mapping:
|
|
230
230
|
|
|
231
231
|
| Preset | Actual author provider/class | Reviewer role (configured class/effort) |
|
|
232
232
|
| --- | --- | --- |
|
|
233
|
-
| `mixed` | `codex/sol` | `axstack-reviewer-secondary` (`claude/opus`
|
|
233
|
+
| `mixed` | `codex/sol` | `axstack-reviewer-secondary` (`claude/opus` high) |
|
|
234
234
|
| `mixed` | `claude/opus` | `axstack-reviewer-primary` (`codex/sol` high) |
|
|
235
235
|
| `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/luna` xhigh) |
|
|
236
236
|
| `claude-only` | `claude/opus` | `axstack-reviewer-secondary` (`claude/sonnet` high) |
|
package/src/roles.js
CHANGED
|
@@ -18,7 +18,7 @@ export function deriveModelClass(model) {
|
|
|
18
18
|
|
|
19
19
|
const AUTHORED_ROUTES = Object.freeze({
|
|
20
20
|
mixed: {
|
|
21
|
-
'codex/sol': ['axstack-reviewer-secondary', 'claude/opus', '
|
|
21
|
+
'codex/sol': ['axstack-reviewer-secondary', 'claude/opus', 'high'],
|
|
22
22
|
'claude/opus': ['axstack-reviewer-primary', 'codex/sol', 'high'],
|
|
23
23
|
},
|
|
24
24
|
'codex-only': {
|