axstack 0.16.0 → 0.17.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
@@ -77,7 +77,7 @@ targets are reported without normal-path adoption. Install exits nonzero when
77
77
  an instruction conflict is preserved, while clean and idempotent installs exit
78
78
  successfully.
79
79
 
80
- The public bundle preserves three canonical 23-role inputs:
80
+ The public bundle preserves three canonical 24-role inputs:
81
81
  [mixed](profiles/presets/mixed.json),
82
82
  [codex-only](profiles/presets/codex-only.json), and
83
83
  [claude-only](profiles/presets/claude-only.json). Each is exactly
@@ -51,7 +51,7 @@ profiles/presets/codex-only.json
51
51
  profiles/presets/claude-only.json
52
52
  ```
53
53
 
54
- Each has exactly `{ "version": 1, "roles": [...] }` with the same 23 stable
54
+ Each has exactly `{ "version": 1, "roles": [...] }` with the same 24 stable
55
55
  role IDs. Installation writes `<skills-dir>/axstack/roles.json` as
56
56
  `{ "version": 1, "preset": "<selected preset>", "roles": [...] }` and records
57
57
  its ownership hash like every other installed skill asset. There is no second
@@ -118,9 +118,10 @@ The complete bundle is validated before writes:
118
118
  - each preset is a real JSON file with version 1, a non-empty `roles` array,
119
119
  the filename's selected identity supplied by the caller, and the same role-ID
120
120
  set as its peers;
121
- - every role has valid preserved fields, while the mixed checker and, in each
122
- single-provider preset, the unavailable adviser and its matching arena judge
123
- seat explicitly permit `model: null`;
121
+ - every role has valid preserved fields, while the mixed checker and the mixed
122
+ `axstack-research-x` launch-by-agent-id route explicitly permit `model: null`;
123
+ in each single-provider preset, the unavailable adviser and its matching arena
124
+ judge seat explicitly permit `model: null`, as does `axstack-research-x`;
124
125
  - obsolete runtime configuration flags fail before mutation with migration
125
126
  guidance.
126
127
 
@@ -148,12 +149,16 @@ to rewrite them.
148
149
  ## Role behavior after installation
149
150
 
150
151
  The runtime reads `roles.json` from the installed shared root `skills/axstack/`.
151
- A new run records the selected preset plus all 23 role rows. An active run keeps
152
+ A new run records the selected preset plus all 24 role rows. An active run keeps
152
153
  that snapshot after a later preset install unless the user explicitly changes
153
154
  it and accepts the resulting evidence invalidation.
154
155
 
155
156
  The mixed checker has `model: null`; checker dispatch is held and never inherits
156
- a provider default. The single-provider presets configure the checker. Their
157
+ a provider default. Mixed `axstack-research-x` has `model: null` because Orca exposes
158
+ no `--model` override for `grok`; its explicit note authorizes launch by agent ID,
159
+ and the run record snapshots the model reported by the TUI. The single-provider
160
+ presets configure the checker and keep `axstack-research-x` as an intentional
161
+ absence. Their
157
162
  unavailable adviser and its matching arena judge seat remain explicit
158
163
  same-provider `model: null` roles, which do not make installation unready;
159
164
  Align and Spec still hold until both Astra and Fable can return independent
package/docs/workflows.md CHANGED
@@ -40,7 +40,7 @@ only affected work.
40
40
 
41
41
  Installation requires one explicit canonical preset. The three bundle files
42
42
  under `profiles/presets/` each contain exactly
43
- `{ "version": 1, "roles": [...] }` and the same 23 stable IDs.
43
+ `{ "version": 1, "roles": [...] }` and the same 24 stable IDs.
44
44
 
45
45
  The current chat drives on whatever model runs it; no preset carries a driver
46
46
  role.
@@ -64,7 +64,9 @@ The unavailable adviser in each single-provider preset stays explicitly
64
64
  `model: null` within that provider's bounds. Installer readiness accepts that
65
65
  intentional absence, but Align and Spec hold because both independent receipts
66
66
  are required. The mixed checker also stays explicitly `model: null`; checker work holds instead of
67
- launching a provider default. Missing or unavailable roles hold only affected
67
+ launching a provider default. Launch-by-agent-id routes for which Orca exposes no
68
+ `--model` override (today: `grok`) record `model: null` with an explicit note and are
69
+ launchable; the run record snapshots the model the TUI reports. Missing or unavailable roles hold only affected
68
70
  work. Model, effort, and permission values express requested intent until real
69
71
  Orca receipts establish the effective session. Stored `modeId` is not permission
70
72
  parity or a sandbox. No route is inferred from subscription, quota, harness,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axstack",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "Axstack installer and setup CLI: installs owned chat skills and role data, configures supported harness settings, and checks Orca capabilities.",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -91,6 +91,15 @@
91
91
  "thinkingOptionId": "low",
92
92
  "notes": "Research web reader: gathers primary-source facts efficiently. Validate configured availability at launch; hold affected work without fallback."
93
93
  },
94
+ {
95
+ "id": "axstack-research-x",
96
+ "name": "Axstack research X (unavailable)",
97
+ "provider": "claude",
98
+ "model": null,
99
+ "modeId": "bypassPermissions",
100
+ "thinkingOptionId": "high",
101
+ "notes": "Intentional single-provider absence: X/Twitter research via Grok is unavailable in claude-only. The explicit null holds this route without provider substitution."
102
+ },
94
103
  {
95
104
  "id": "axstack-explainer",
96
105
  "name": "Axstack explainer",
@@ -91,6 +91,15 @@
91
91
  "thinkingOptionId": "low",
92
92
  "notes": "Research web reader: gathers primary-source facts efficiently. Validate configured availability at launch; hold affected work without fallback."
93
93
  },
94
+ {
95
+ "id": "axstack-research-x",
96
+ "name": "Axstack research X (unavailable)",
97
+ "provider": "codex",
98
+ "model": null,
99
+ "modeId": "full-access",
100
+ "thinkingOptionId": "high",
101
+ "notes": "Intentional single-provider absence: X/Twitter research via Grok is unavailable in codex-only. The explicit null holds this route without provider substitution."
102
+ },
94
103
  {
95
104
  "id": "axstack-explainer",
96
105
  "name": "Axstack explainer",
@@ -91,6 +91,15 @@
91
91
  "thinkingOptionId": "low",
92
92
  "notes": "Research web reader: gathers primary-source facts efficiently. Validate configured availability at launch; hold affected work without fallback."
93
93
  },
94
+ {
95
+ "id": "axstack-research-x",
96
+ "name": "Axstack research X",
97
+ "provider": "grok",
98
+ "model": null,
99
+ "modeId": "full-access",
100
+ "thinkingOptionId": "high",
101
+ "notes": "X/Twitter-only research branch: Grok can read X; use for questions where posts, threads, announcements, or sentiment on X are answer-changing evidence. Cites post URLs and dates; never the sole source for a verified claim; report-only, no writes. Launch by agent id grok; model selected by the Grok TUI default."
102
+ },
94
103
  {
95
104
  "id": "axstack-explainer",
96
105
  "name": "Axstack explainer",
@@ -128,13 +128,14 @@ nothing without tested independent review.
128
128
 
129
129
  ## Close-out
130
130
 
131
- After required PRs merge by forge state—not local branch ancestry—close out in
132
- order: (1) settle every worker terminal through the orchestration guide; (2)
133
- write a compact record with counts and denominators for
134
- user interventions, deviations from plan, and repairs; (3) dispatch
135
- `axstack-auditor` only when any count is non-zero or the user asks—an unavailable
136
- auditor leaves close-out pending, never skipped silently; (4)
137
- release merged run worktrees and branches and close Linear tickets
138
- (driver-owned); (5) mark the [Run record](run-record.md) `Archived`. The driver
139
- cannot report the run done before steps (1)-(5) have receipts. Small one-step
140
- lookups keep the run record's exemption.
131
+ PRs merge by forge state—not branch ancestry; close out: (1) settle every worker
132
+ terminal; (2) compact record with counts and denominators—user
133
+ interventions/deviations from plan/repairs; (3) `axstack-auditor`: settle
134
+ non-zero/requested, else `counts zero`; an unavailable auditor leaves close-out
135
+ pending, never skipped silently; (4) release merged run worktrees and branches;
136
+ close Linear tickets; (5) mark the [Run record](run-record.md) `Archived`.
137
+ `Archived`—one each:
138
+ settlement receipt; compact record path; auditor decision plus settlement
139
+ receipt or `counts zero`; release and ticket receipts; archive timestamp.
140
+ `active`/receipt-incomplete record: close-out pending, never done. One-step
141
+ lookups exempt.
@@ -26,11 +26,13 @@ Read `roles.json` from the installed shared root `skills/axstack/`. The installe
26
26
  shape is `{ "version": 1, "preset": "<name>", "roles": [...] }`. Bundled
27
27
  profiles are setup inputs shaped as
28
28
  `{ "version": 1, "roles": [...] }`. A new run records the selected preset and
29
- all 23 role rows once. An active run keeps the exact snapshot until the user
29
+ all 24 role rows once. An active run keeps the exact snapshot until the user
30
30
  explicitly changes it.
31
31
 
32
32
  Select the requested role by stable ID. A missing or null model holds only that role;
33
- never launch a provider default. Validate provider, model, and effort
33
+ never launch a provider default. Launch-by-agent-id routes for which Orca exposes no
34
+ `--model` override (today: `grok`) record `model: null` with an explicit note and are
35
+ launchable; the run record snapshots the model the TUI reports. Validate provider, model, and effort
34
36
  against the guide and actual launch capability. Stored `modeId` and other
35
37
  permission fields are conservative intent, not proof of effective permission
36
38
  parity or a security boundary. Requested settings, input acceptance, effective
@@ -11,7 +11,7 @@ only with exactly one unambiguous preset; missing or contradictory sources are
11
11
  a setup gap: hold. Never infer from live profiles or `list_profiles`, harness,
12
12
  tools, credentials, quota, subscription, or default to `mixed`.
13
13
 
14
- At run start, capture one **routing snapshot**: the complete map of all 23 role
14
+ At run start, capture one **routing snapshot**: the complete map of all 24 role
15
15
  IDs with provider/model/mode/effort, absent or unconfigured roles recorded
16
16
  explicitly, and no invented provider default. An absent or unconfigured role
17
17
  holds only that role's work, not the run. A role installed or changed later
@@ -18,8 +18,15 @@ This preserves the required contracts -> lifecycle -> audit load edge.
18
18
 
19
19
  1. **Research and map dependencies.** Inspect the available code, docs, and
20
20
  tools before asking the user. Separate facts from preferences, name evidence
21
- gaps, and map which decisions unlock others. Unresolved research blocks only
22
- its dependent branch while safe fact work and independent branches continue.
21
+ gaps, and map which decisions unlock others. When a fact needed for the
22
+ frontier is not derivable from the local repo or docs by ordinary reading,
23
+ dispatch `axstack-research` branches through Orca by source type:
24
+ requirements, code, web, and, once configured, X. Give one owner per branch,
25
+ use cross-harness routes where the roles allow, and require a cited note per
26
+ the research skill's source standards. The driver folds verified claims into
27
+ the frontier and records the receipts. Ordinary reading stays in-chat; a
28
+ single factual lookup never dispatches. Unresolved research blocks only its
29
+ dependent branch while safe fact work and independent branches continue.
23
30
  2. **Prioritize the ready frontier.** Rank questions whose prerequisites are
24
31
  settled by consequence, uncertainty, and the branches they unlock. Probe
25
32
  vague terms, assumptions, success criteria, exclusions, failures, and edge
@@ -36,6 +36,7 @@ is part of research.
36
36
  - `axstack-research-requirements`: requirements and intent.
37
37
  - `axstack-research-code`: code behavior.
38
38
  - `axstack-research-web`: web and external sources.
39
+ - `axstack-research-x`: X (Twitter) posts and threads via Grok — only when X evidence is answer-changing; cite post URLs and dates.
39
40
  - `axstack-explore-codebase`: broad codebase mapping.
40
41
  - `axstack-explore-execution`: execution and runtime traces.
41
42
 
@@ -39,7 +39,7 @@ head and current base, and writing authority are recorded.
39
39
 
40
40
  Independently check the
41
41
  [proportional scope identity](../axstack/references/routing.md#proportional-scope-identity)
42
- before an approval or merge-ready declaration:
42
+ before an approval or [merge-ready declaration](#authored-mode-own-pr):
43
43
 
44
44
  - Substantial new work: confirm the approved spec identity and matching ticket
45
45
  map.
@@ -49,9 +49,12 @@ before an approval or merge-ready declaration:
49
49
  author provenance. Never assume an imported own PR's author. That
50
50
  snapshot is accepted without repeated approval.
51
51
 
52
- The mode is ready when the applicable identity matches the candidate and no
53
- material scope change remains unaccepted. Readonly investigation may continue
54
- while an identity gap holds declarations.
52
+ The mode is ready when the applicable identity matches the candidate, no
53
+ material scope change remains unaccepted, and an independent review receipt
54
+ records `APPROVE` from the required non-author, non-owner reviewer at the exact
55
+ current head. Green CI, passing tests, or an older-head receipt leave readiness
56
+ `UNKNOWN`, never merge-ready. Readonly investigation may continue while an
57
+ identity gap holds declarations.
55
58
 
56
59
  Resolve actual author provenance from authoring session receipts and candidate
57
60
  history. The orchestrator model, provider, profile, or owner name is not author
@@ -244,7 +247,8 @@ Escalate to user: <yes | no> — <criterion> — <reason>
244
247
  At any point, promptly raise credible serious security issues, possible
245
248
  downtime or data loss, and major design concerns without waiting for every
246
249
  mode-required reviewer. Present evidence, likely impact, options, and the user
247
- decision needed. An urgent hold blocks approval, merge-ready declarations, and
250
+ decision needed. An urgent hold blocks approval,
251
+ [merge-ready declarations](#authored-mode-own-pr), and
248
252
  dependent dangerous actions, but does not block safe investigation, unrelated
249
253
  work, or reporting validated risk as `REQUEST_CHANGES`. Disagreement and
250
254
  silence leave the hold open.
@@ -267,7 +271,7 @@ without waiting; `proceed` never overrides a validated blocking finding.
267
271
  ## Publishing rule
268
272
 
269
273
  Mode-required exact-revision completeness gates external approval,
270
- merge-ready declarations, and authorized submission. It never gates returning
274
+ [merge-ready declarations](#authored-mode-own-pr), and authorized submission. It never gates returning
271
275
  evidence, limitations, validated risk, or an internal `INCOMPLETE` report.
272
276
 
273
277
  - Peer mode requires both current reviews and no unresolved material finding
@@ -6,7 +6,8 @@ description: When babysitting an existing PR, use axstack-watch to monitor or ma
6
6
  # Watch
7
7
 
8
8
  Leave each adopted PR with one accountable owner, current readiness evidence,
9
- and a bounded watch that ends cleanly or preserves enough state to resume.
9
+ and user-facing updates that name its current milestone and next wake or
10
+ condition.
10
11
 
11
12
  Before acting, load [Standing contracts](../axstack/references/contracts.md).
12
13
  Its required edge loads [Shared lifecycle](../axstack/references/lifecycle.md),
@@ -79,14 +80,17 @@ no children or recursive teams, and the adoption watcher is never the writer.
79
80
 
80
81
  A live watch has verified role and timer receipts, handshakes, watched scope,
81
82
  wake ownership, and a common expiry. A missing runtime capability is a setup gap,
82
- not a reason to invent a call or create a duplicate registration. Wait through
83
- native wake-ups; no model remains active between events.
83
+ not a reason to invent a call or create a duplicate registration. Native
84
+ wake-ups drive observation; never poll or keep a model active between events.
84
85
 
85
86
  ## 4. Route each wake
86
87
 
87
88
  Re-read the remote head and base, then reconcile the event against acknowledged
88
89
  IDs and the recorded mode. A changed head, CI result, or review comment is an
89
90
  event, not repair authority. Stale or ambiguous observations authorize nothing.
91
+ Every user-facing update is actionable: name the current milestone, the next
92
+ wake or condition, and an ETA when the forge exposes one, such as CI median.
93
+ A healthy unchanged observation produces no user-facing message.
90
94
 
91
95
  Observation-only and peer wakes produce a read-only report and stop. For an
92
96
  authorized maintenance wake that may require a repair or public reply, read and
package/src/roles.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const PROVIDER_BOUNDS = Object.freeze({
2
- mixed: new Set(['codex', 'claude']),
2
+ mixed: new Set(['codex', 'claude', 'grok']),
3
3
  'codex-only': new Set(['codex']),
4
4
  'claude-only': new Set(['claude']),
5
5
  });
@@ -64,8 +64,9 @@ export function assessRoleReadiness(roles, preset) {
64
64
  const gaps = [];
65
65
  const isIntentionalAbsence = (role) => role.model === null && (
66
66
  (preset === 'mixed' && role.id === 'axstack-checker') ||
67
- (preset === 'codex-only' && ['axstack-advisor-fable', 'axstack-arena-judge-fable'].includes(role.id)) ||
68
- (preset === 'claude-only' && ['axstack-advisor-astra', 'axstack-arena-judge-astra'].includes(role.id))
67
+ (preset === 'mixed' && role.id === 'axstack-research-x' && role.provider === 'grok') ||
68
+ (preset === 'codex-only' && ['axstack-advisor-fable', 'axstack-arena-judge-fable', 'axstack-research-x'].includes(role.id)) ||
69
+ (preset === 'claude-only' && ['axstack-advisor-astra', 'axstack-arena-judge-astra', 'axstack-research-x'].includes(role.id))
69
70
  );
70
71
  for (const role of roles) {
71
72
  if (!bounds.has(role.provider)) {