axstack 0.15.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
@@ -12,9 +12,9 @@ role choices, evidence, review policy, and one private derived run record.
12
12
 
13
13
  ## How a run works
14
14
 
15
- Invoke `axstack` or the needed phase directly: `axstack-align`,
16
- `axstack-spec`, `axstack-tickets`, `axstack-implement`, `axstack-review`, and
17
- `axstack-watch`. Direct `axstack-research`, `axstack-explain`,
15
+ Invoke the needed phase directly: `axstack-align`, `axstack-spec`,
16
+ `axstack-tickets`, `axstack-implement`, `axstack-review`, and `axstack-watch`.
17
+ Direct `axstack-research`, `axstack-explain`,
18
18
  `axstack-improve`, and `axstack-debug` routes need no spec ceremony. `axstack-relay` remains an
19
19
  optional inline route for explicit messages and authorized notifications; an
20
20
  unavailable or legacy-runtime-only relay falls back to the current conversation
@@ -68,8 +68,8 @@ See [installation details](docs/installation.md).
68
68
 
69
69
  `--instructions` manages one versioned Axstack block in `AGENTS.md`,
70
70
  `CLAUDE.md`, or `GEMINI.md`. Harness defaults resolve those files automatically. The block
71
- points at the installed entry skill and requires every subagent, delegated worker,
72
- reviewer, and cross-harness dispatch to use visible Orca orchestration via the `orca` CLI
71
+ requires direct matching phase-skill invocation and requires every subagent, delegated
72
+ worker, reviewer, and cross-harness dispatch to use visible Orca orchestration via the `orca` CLI
73
73
  rather than a harness-native subagent tool (e.g. Claude/Codex native subagents). OpenCode
74
74
  and Antigravity subagents run as Orca-supervised workers. Text and file
75
75
  mode outside the markers are preserved; edited, malformed, unowned, or unsafe
@@ -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
 
@@ -147,13 +148,17 @@ to rewrite them.
147
148
 
148
149
  ## Role behavior after installation
149
150
 
150
- The runtime reads `roles.json` relative to the actually loaded `axstack` skill.
151
- A new run records the selected preset plus all 23 role rows. An active run keeps
151
+ The runtime reads `roles.json` from the installed shared root `skills/axstack/`.
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
@@ -10,9 +10,9 @@ Axstack implements that skill's specialist capability.
10
10
 
11
11
  ## Routing and scope identity
12
12
 
13
- `axstack` classifies the request and loads only the applicable phase plus shared
14
- references for routing, lifecycle, Orca runtime boundaries, role/model/risk
15
- contracts, the run record, and PR shape.
13
+ The directly invoked phase loads the applicable shared references for routing,
14
+ lifecycle, Orca runtime boundaries, role/model/risk contracts, the run record,
15
+ and PR shape.
16
16
 
17
17
  Direct routes need no spec ceremony:
18
18
 
@@ -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.
@@ -53,7 +53,7 @@ role.
53
53
 
54
54
  The installed `<skills-dir>/axstack/roles.json` adds the selected preset name:
55
55
  `{ "version": 1, "preset": "<name>", "roles": [...] }`. The runtime reads it
56
- relative to the actually loaded `axstack` skill and records the whole table for
56
+ from the installed shared root `skills/axstack/` and records the whole table for
57
57
  a new run. Active runs retain their snapshot after later installation changes.
58
58
 
59
59
  Peer roles keep the stable IDs `axstack-reviewer-primary` and
@@ -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.15.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",
@@ -4,11 +4,11 @@ Apply these authority, scope, and model rules before consequential action.
4
4
 
5
5
  ## Required lifecycle load
6
6
 
7
- Except for `axstack-audit` itself, every independently called phase must load
8
- and follow [Shared lifecycle](lifecycle.md) before acting. When a substantive
9
- run ends or reaches a meaningful checkpoint, apply the lifecycle audit hook.
10
- The audit phase loads these contracts, writes its assigned record, and stops;
11
- it never audits itself.
7
+ Except for `axstack-audit` and `axstack-relay`, every independently called phase
8
+ must load and follow [Shared lifecycle](lifecycle.md) before acting. When a
9
+ substantive run ends or reaches a meaningful checkpoint, apply the lifecycle
10
+ audit hook. The audit phase loads these contracts, writes its assigned record,
11
+ and stops; it never audits itself.
12
12
 
13
13
  ## Scope identity (conditional — see routing and lifecycle)
14
14
 
@@ -1,25 +1,23 @@
1
1
  # Shared lifecycle and receipts
2
2
 
3
- Phases load through [Standing contracts](contracts.md)' mandatory edge.
4
- Substantive delegated or resumable work uses a driver-owned [Run record](run-record.md)
3
+ Phases load through [Standing contracts](contracts.md).
4
+ Delegated or resumable work uses a driver-owned [Run record](run-record.md)
5
5
  binding state and receipts to exact revisions.
6
6
 
7
7
  ## Roster (compact)
8
8
 
9
9
  - Driver: current chat; owns scope, decisions, cross-PR dependencies, Linear
10
10
  mutations, and integration.
11
- - Owner (`axstack-owner`): one persistent owner per PR; launches its author,
12
- reviewers and watches; may perform authorized PR-scoped publication within user authority.
13
- Human merge is default.
11
+ - Owner: driver owns loop PRs; `axstack-owner` only for standalone watch/review
12
+ without live driver. It may perform PR-scoped publication within user authority. Human
13
+ merge is default.
14
14
  - Author: exactly one writer per candidate; accepted fixes return there.
15
15
  Workers launch no recursive teams.
16
16
  - Reviewers: peer = two independent `axstack-reviewer-primary` and
17
17
  `axstack-reviewer-secondary` sessions with identical brief and isolated first
18
18
  pass; authored = one eligible configured reviewer from actual author
19
19
  provenance. Owner and author never review.
20
- - Driver/monitor/watchdog: the driver every 15 minutes dispatches and exits as
21
- a mutating owner; the watchdog is model-free and read-only, has no gate, and
22
- records `watchdog.log`; there is no watch deadline for automations.
20
+ - Automation driver/monitor/watchdog: see [Watch health](#watch-health).
23
21
  - Auditor (`axstack-auditor`): report-only; never edits, merges, activates, or
24
22
  audits itself.
25
23
 
@@ -78,10 +76,17 @@ Store concise receipt references, not raw worker output, in the [Run record](run
78
76
  ## Execution tracking
79
77
 
80
78
  The driver consumes native Orca completion and escalation deliveries for the
81
- active Run. Process each whole delivery before acknowledgment and validate its
82
- Task, Dispatch, sender, authority, revisions, and receipts before advancing the
83
- run record. Duplicate deliveries are deduplicated by runtime identity. Healthy
84
- unchanged observations produce no user-facing update.
79
+ active Run. A driver turn does not end while a Dispatch is unsettled unless one
80
+ completion wait from the orchestration guide is armed (background where the
81
+ harness supports it, foreground otherwise) and re-armed on timeout; sleep or
82
+ poll loops are forbidden. An explicitly invoked phase dispatches its configured
83
+ roles through Orca and closes with the lifecycle close-out; in-chat execution
84
+ covers only ordinary reading, writing, and local checks. Heartbeat deliveries
85
+ are acknowledged with no user-facing text. Process each whole delivery before
86
+ acknowledgment and validate its Task, Dispatch, sender, authority, revisions,
87
+ and receipts before advancing the run record. Duplicate deliveries are
88
+ deduplicated by runtime identity. Healthy unchanged observations produce no
89
+ user-facing update.
85
90
 
86
91
  Detect completed-but-unadvanced work, failed sessions, unresolved launch
87
92
  receipts, and stalls through the version-matched orchestration guide. Never
@@ -98,7 +103,9 @@ Tracking grants no merge, release, model-substitution, or scope authority.
98
103
 
99
104
  The default 24-hour deadline covers standalone task-owned timers. Stop them at
100
105
  deadline and preserve remaining work; there is no watch deadline for
101
- automations. Merge-ready differs from merged; human merges.
106
+ automations. A PR is merge-ready only with the applicable review receipt(s) at
107
+ its exact head; green CI or tests alone never make it merge-ready. Merge-ready
108
+ differs from merged; human merges.
102
109
 
103
110
  ## Watch health
104
111
 
@@ -110,24 +117,25 @@ no watch deadline for automations. Build no custom scheduler and use no legacy
110
117
  fallback. Details live in
111
118
  [Watch runtime](../../axstack-watch/references/watch-runtime.md).
112
119
 
113
- ## Audit hook (end of run and meaningful checkpoints)
114
-
115
- Auditing defaults on for every substantive run at its end and meaningful
116
- checkpoints such as material deviation or repeated repair. Load the bundled [audit skill](../../axstack-audit/SKILL.md)
117
- and dispatch its auditor. An `axstack-audit` run is excluded: it writes its
118
- record and launches no children.
119
-
120
- The auditor reads the [Run record](run-record.md) for scope, outcomes, and
121
- metric counts/denominators; reports evidenced PASS/FAIL/UNKNOWN; and invents no
122
- numbers or cost. Proposals change nothing. Accepted proposals return as
123
- tested, independently reviewed work with a regression scenario and unchanged
124
- holdout checks. No automatic self-edit, merge, or activation. Records stay
125
- private; publication needs separate authority.
126
-
127
- ## Idle-complete archive and retain
128
-
129
- After required PRs merge or hand off, timers stop, and receipts verify, mark
130
- the same [Run record](run-record.md) `Archived` in place. Preserve
131
- scope, revisions, evidence, receipts, and expiries. Archive only idle-complete
132
- records: never active/waiting workers, unrelated host state, or ownership merely
133
- because it is idle.
120
+ ## Audit hook (close-out and meaningful checkpoints)
121
+
122
+ Audit measurement is enabled by default for every substantive run; dispatch
123
+ follows [Close-out](#close-out) or a material-deviation/repeated-repair
124
+ checkpoint. An `axstack-audit` run is excluded; it launches no children.
125
+ Load [axstack-audit](../../axstack-audit/SKILL.md). Accepted proposals
126
+ require a regression scenario and unchanged holdout checks; they change
127
+ nothing without tested independent review.
128
+
129
+ ## Close-out
130
+
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.
@@ -22,15 +22,17 @@ daemon, scheduler, database, or escalation engine.
22
22
 
23
23
  ## Bind the configured role
24
24
 
25
- Read `roles.json` relative to the actually loaded `axstack` skill. The installed
25
+ Read `roles.json` from the installed shared root `skills/axstack/`. The installed
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
@@ -47,11 +47,12 @@ Role IDs:
47
47
  only gate-authorized health escalations.
48
48
  - `axstack-debug-investigator-1..4` each probe one L1 brief.
49
49
 
50
- Provenance is matched on provider/model ID; record effort but never use it to
51
- create a mapping. Provenance absent from the preset's table row is
52
- unsupported and `INCOMPLETE`; report the exact gap and ask the user. Never
53
- derive a reverse pairing from slot position, driver, owner, or provider.
54
- Author and owner never review their own work.
50
+ Provenance is matched on provider/model ID; effort never maps. Missing table-row
51
+ provenance is unsupported and `INCOMPLETE`; report it and ask the user. Never
52
+ infer from slot, driver, owner, or provider. Author and owner never review.
53
+
54
+ The `axstack-implement` loop requires `mixed`; single-provider presets hold at
55
+ step (3) for user routing, with no substitution or same-provider review.
55
56
 
56
57
  ## Direct routes (no spec ceremony)
57
58
 
@@ -76,12 +77,11 @@ Author and owner never review their own work.
76
77
  handoff guide, and require explicit recipient acceptance before ownership
77
78
  changes. Missing capability is a setup gap; never invent one.
78
79
  - Colleague PR review -> `axstack-review`, peer mode.
79
- - Own PR maintenance or monitoring -> `axstack-review` in authored mode,
80
- `axstack-watch` for adoption.
81
-
82
- Research, explanation, improvement discovery, debugging, handoff, peer review,
83
- and adopted maintenance need no alignment, spec, or ticket map; authority and
84
- intent boundaries still apply.
80
+ - A status question about an own open PR or stack ("check now", "what's left",
81
+ "are we done", or "is it approved") -> `axstack-watch` in observation-only
82
+ mode. Explicit "address", "patch", or "fix" grants authorized maintenance.
83
+ - Other own PR work -> `axstack-review` authored mode or `axstack-watch`
84
+ adoption.
85
85
 
86
86
  ## Proportional scope identity
87
87
 
@@ -126,5 +126,4 @@ not alone a formal spec trigger. Hold affected unsafe work while reassessing.
126
126
  author provenance — then use `axstack-review` and `axstack-watch` without
127
127
  repeated approval or new spec ceremony. Never infer the author from the
128
128
  orchestrator or assume an imported own PR's author.
129
- - Direct later phase: start there and pass that phase's identity check; entry
130
- never admits work a deeper phase rejects.
129
+ - Direct later phase: start there and pass that phase's identity check.
@@ -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
@@ -161,5 +168,5 @@ approval; record chosen document names and paths once per run.
161
168
  actual dispatch. Alignment completion never dispatches a recipient.
162
169
 
163
170
  Alignment stops for both sizes only when the handoff is usable, its next scope
164
- identity is explicit, and execution has not started. The user invokes `axstack`
165
- to execute.
171
+ identity is explicit, and execution has not started. The user invokes
172
+ `axstack-implement` to execute.
@@ -5,11 +5,10 @@ description: When an approved task is ready to build or repair, use axstack-impl
5
5
 
6
6
  # Implement
7
7
 
8
- Deliver one reviewable candidate at an exact revision. Normal behavior changes
9
- have real red -> green -> refactor evidence; a narrowly accepted
10
- structure-preserving change has old-green characterization evidence. Name
11
- unverified boundaries and keep ownership unambiguous. Review and merge are
12
- later phases.
8
+ From an accepted scope identity, drive its task/PR map through author -> review
9
+ -> repair until every required PR is merge-ready or held. Keep exact revisions,
10
+ strict TDD evidence, ownership, and unverified boundaries explicit. The human
11
+ merges; the same run later reconciles those merges and closes out.
13
12
 
14
13
  ## 1. Admit the work
15
14
 
@@ -34,6 +33,9 @@ Independently confirm the applicable
34
33
  failure) returns to the author and does not increment the bug's fix ledger.
35
34
  - An adopted own-PR repair has its accepted maintenance snapshot.
36
35
 
36
+ If substantial work lacks an approved spec or matching ticket map, report that
37
+ exact gap, name `axstack-align` as the next route, and stop.
38
+
37
39
  Pin the exact base and current candidate revision. A missing, mismatched, or
38
40
  materially changed but unaccepted identity holds affected work; safe
39
41
  investigation may continue under the standing contracts. Proceed only with a
@@ -42,11 +44,9 @@ valid recorded identity and revisions; otherwise report the hold and exact gap.
42
44
  ## 2. Establish one owner and one writer
43
45
 
44
46
  For substantive delegated or resumable work, use the shared
45
- [run record](../axstack/references/run-record.md). On restart, reconcile it
46
- against actual Orca Tasks, Dispatches, sessions, Git revisions, GitHub state, the approved scope,
47
- Linear issue state, and watch registrations. Reuse the existing owner and
48
- author when valid. Ambiguous launch state is a hold on creating another writer,
49
- not evidence that the old writer disappeared.
47
+ [run record](../axstack/references/run-record.md). Reconcile it on restart with
48
+ the approved scope, Orca and forge state, exact revisions, tickets, and watches.
49
+ Reuse valid owners and authors; ambiguity holds a replacement writer.
50
50
 
51
51
  At execution start, bind work to the driver-owned Orca Run and one authoritative
52
52
  Task/Dispatch attempt. Preserve the actual IDs and process completion deliveries
@@ -57,30 +57,22 @@ Immediately before an actual role dispatch, read and follow the
57
57
  [Orca runtime boundary](../axstack/references/orca-runtime.md). Ordinary local
58
58
  reading and writing does not require that launch reference.
59
59
 
60
- One persistent owner remains accountable for the PR, fixes, evidence, and
61
- monitoring. Exactly one author writes a candidate at a time; accepted review
62
- repairs return to that author when its evidence is still usable. When the owner
63
- delegates writing, the owner does not edit that candidate concurrently. An
64
- ownership transfer occurs only when explicitly requested; follow the shared
65
- lifecycle's native capability preflight for that transfer. An ordinary restart
66
- or resume reconciles the existing sessions and run record without creating a
67
- fresh recipient.
68
-
69
- There is no fixed active-PR count. Fanout is dependency- and capacity-driven
70
- within configured host resource and spending limits, while one host owns the
71
- run and one writer owns each candidate. The driver queues conflicting or
72
- dependent work and coordinates dependent PRs through `gh stack`. Routine shape,
73
- split, fanout, and exception choices are autonomous driver decisions within the
74
- approved spec; size alone never requires user approval. A dependent candidate
75
- starts from its reviewed parent. When a reviewed parent changes, hold reliance
76
- on stale child evidence and child merge readiness. Rebase the child onto the
77
- new parent revision, re-run affected checks, and remeasure shape against the new
78
- actual base. Re-record the shape and re-check its level-matching rationale; size
79
- growth alone is not an automatic hold. A green parent does not prove the
80
- combined stack, but the parent need not wait for an independently reviewed
81
- child. Dispatch only when ownership, worktree, dependency revisions, writer
82
- exclusivity, and configured capacity agree with live state. Escalation occurs
83
- only if a split exposes an existing shared-contract hold.
60
+ One persistent owner remains accountable for each PR. Exactly one author writes
61
+ it; accepted repairs return there while its evidence is usable, and the owner
62
+ never edits concurrently. Only an explicit accepted transfer changes ownership;
63
+ ordinary resume reconciles the same sessions and record.
64
+
65
+ Fanout follows dependencies and capacity within configured limits. Queue
66
+ conflicts and dependent work; use `gh stack`, starting each child from its
67
+ reviewed parent. When the reviewed parent changes, hold reliance on
68
+ stale child evidence and child merge readiness; rebase onto the new parent revision,
69
+ re-run affected checks, and remeasure shape against it.
70
+ Size growth alone is not an automatic hold.
71
+ A parent need not wait for an
72
+ independently reviewed child. Dispatch only when ownership, worktree, dependency
73
+ revisions, writer exclusivity, and capacity agree with live state. Shape, split,
74
+ fanout, and exceptions are autonomous driver decisions within the approved scope.
75
+ Size alone never requires user approval.
84
76
 
85
77
  ## 3. Establish test-first evidence
86
78
 
@@ -95,11 +87,6 @@ restating source text or mirroring the intended implementation. Execute the
95
87
  check before changing production behavior and capture the expected behavioral
96
88
  failure. A missing-module error or unrelated setup failure is not red.
97
89
 
98
- For example, retry the same payment ID and observe one charge through the
99
- public interface. Counting internal helper calls alone would not prove that
100
- behavior. This illustrates the boundary test; it does not require a payment
101
- scenario in unrelated work.
102
-
103
90
  If no meaningful test-first check can be established, report why and hold
104
91
  dependent implementation for a scoped decision. Historical tests added after
105
92
  code remain noncompliant; they never become retroactive TDD evidence.
@@ -142,7 +129,7 @@ evidence when relevant. Name every unavailable OS, harness, credential, or
142
129
  other boundary instead of implying coverage.
143
130
 
144
131
  After the last change, pin the exact candidate revision and return this compact
145
- implementation receipt to the owner or driver:
132
+ implementation receipt to the driver:
146
133
 
147
134
  ```text
148
135
  Record: <progress.md path or tiny-task brief>
@@ -158,7 +145,55 @@ Next: <owner reconciles receipt, uses gh stack to push exact revision, confirms
158
145
  remote readback, then routes it to axstack-review>
159
146
  ```
160
147
 
161
- The author stops at that receipt and does not push. The owner follows the
162
- candidate-publication boundary without editing the candidate, and review starts
163
- only after remote readback confirms the exact revision. This grants no merge
164
- authority; the human merges by default.
148
+ The author stops at that receipt and does not push. The driver reconciles it,
149
+ uses `gh stack` to publish, confirms remote readback, and continues the loop
150
+ without editing the candidate. No step grants merge authority.
151
+
152
+ ## 6. Loop until merge-ready
153
+
154
+ Inputs are one snapshotted small-change intent or an approved spec and ticket
155
+ map. The unit is that accepted task/PR map: run independent PRs in parallel
156
+ within the fanout rule; run a dependent `gh stack` bottom-up, each child from
157
+ its reviewed parent. The driver is owner, sole record writer, dispatcher,
158
+ publisher, and wait-holder for every loop PR it creates. Resume preserves an
159
+ existing live owner absent an accepted transfer.
160
+
161
+ For each PR:
162
+
163
+ 1. Dispatch `axstack-author` under §§3-5 and consume its strict-TDD receipt.
164
+ 2. Publish through candidate-publication and read back the exact SHA.
165
+ 3. Dispatch and consume the authored-mode `axstack-review` selected from actual
166
+ author provenance.
167
+ 4. Route the verdict. `APPROVE` at that head plus `axstack-watch` §5's full
168
+ predicate—required checks, all feedback, approvals, mergeability, and
169
+ exact-revision receipts—records `merge-ready`. With required checks pending,
170
+ use the forge-native blocking check wait, bounded and used once per revision, then
171
+ re-evaluate. Timeout, error, or missing wait capability records `held` at
172
+ that revision with reason and resume condition; it never triggers author
173
+ repair. Notify “checks pending, resume when green”, not “decision needed”.
174
+ `REQUEST_CHANGES`, a failed required check, or post-readiness feedback returns
175
+ findings to the same author for a new revision, increments `repairs`, and
176
+ returns to step 1. `INCOMPLETE`, a provenance gap, unavailable model, serious
177
+ risk, or the third `REQUEST_CHANGES` on one PR records `held`. A changed
178
+ parent sends its child back to step 1.
179
+
180
+ One run-level completion wait covers every unsettled Dispatch; the bounded
181
+ forge check wait is the only other wait. End a turn only when every required PR
182
+ is `merge-ready` or `held`, after notification (b) or (a). Raise serious risk
183
+ (c) immediately when found. Notifications use `axstack-relay` under the recorded
184
+ Notification policy: (a) a user-decision hold, (b) the merge-ready set and the
185
+ all-merged event—two per run—and (c) serious risk; never progress.
186
+
187
+ Merge-ready is the human boundary: the user merges, bottom-up for a stack. The
188
+ driver resumes on the user's next message or `/axstack-watch`; no Orca merge
189
+ wake exists today. Re-read forge state: record forge-merged PRs as `merged`;
190
+ changed heads or feedback return to step 1; release nothing before Close-out.
191
+ Run Close-out once only after every required PR is forge-merged and acceptance
192
+ passes. It settles workers, records counts, makes the auditor decision and
193
+ settlement, releases worktrees, closes eligible tickets, and archives the run.
194
+
195
+ The loop requires the `mixed` two-provider authored-review row. `codex-only` or
196
+ `claude-only` holds at step (3) for an explicit user routing choice, with no
197
+ substitution or same-provider review. Derived PR states are `authoring |
198
+ published | in-review | repairing(n) | merge-ready | merged | held`. The run is
199
+ done only when every required PR is forge-merged and Close-out has receipts.
@@ -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),
@@ -69,7 +70,8 @@ model-free and read-only, has no gate, and records `watchdog.log`; there is no
69
70
  watch deadline for automations. The driver is the automation session itself,
70
71
  with no `axstack-monitor` or `axstack-owner` role row; `axstack-monitor` stays
71
72
  an optional read-only observer that never sends. One read-only PR observation
72
- needs neither.
73
+ needs neither. The publishing driver is the live owner for a status check;
74
+ materialize no `axstack-owner` and start no automation for a read-only check.
73
75
 
74
76
  For standalone adoption, materialize `axstack-owner` only when no live owner
75
77
  exists. Once it exists, the current chat is not a competing coordinator. Only
@@ -78,14 +80,17 @@ no children or recursive teams, and the adoption watcher is never the writer.
78
80
 
79
81
  A live watch has verified role and timer receipts, handshakes, watched scope,
80
82
  wake ownership, and a common expiry. A missing runtime capability is a setup gap,
81
- not a reason to invent a call or create a duplicate registration. Wait through
82
- 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.
83
85
 
84
86
  ## 4. Route each wake
85
87
 
86
88
  Re-read the remote head and base, then reconcile the event against acknowledged
87
89
  IDs and the recorded mode. A changed head, CI result, or review comment is an
88
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.
89
94
 
90
95
  Observation-only and peer wakes produce a read-only report and stop. For an
91
96
  authorized maintenance wake that may require a repair or public reply, read and
@@ -157,3 +162,6 @@ Resume: <known commands or verified refs needed to reconcile from this revision>
157
162
 
158
163
  The watch ends only when registrations are stopped, receipts are recorded, and
159
164
  the PR is either merged or represented by this resumable state.
165
+ When every required PR is merged, follow the lifecycle
166
+ [Close-out](../axstack/references/lifecycle.md#close-out) before reporting the
167
+ run as done.
package/src/installer.js CHANGED
@@ -247,12 +247,14 @@ export async function validateBundle(bundleDir, selectedPreset = null) {
247
247
 
248
248
  const files = [];
249
249
  for (const dir of skillDirs) {
250
- const skillMark = join(skillsRoot, dir.name, 'SKILL.md');
251
- try {
252
- const s = await stat(skillMark);
253
- if (!s.isFile()) throw new Error();
254
- } catch {
255
- throw new Error(`skill ${dir.name} is missing SKILL.md`);
250
+ if (dir.name !== 'axstack') {
251
+ const skillMark = join(skillsRoot, dir.name, 'SKILL.md');
252
+ try {
253
+ const s = await stat(skillMark);
254
+ if (!s.isFile()) throw new Error();
255
+ } catch {
256
+ throw new Error(`skill ${dir.name} is missing SKILL.md`);
257
+ }
256
258
  }
257
259
  await walkSkills(join(skillsRoot, dir.name), skillsRoot, files);
258
260
  }
@@ -508,7 +510,7 @@ export async function installBundle({
508
510
  }
509
511
  instructionPlan = planInstruction({
510
512
  text: existingInstructionsRaw,
511
- block: renderInstructionBlock(skillsRoot),
513
+ block: renderInstructionBlock(),
512
514
  ownership: boundInstructions.path === instructionsFile ? boundInstructions : null,
513
515
  force,
514
516
  });
@@ -1,14 +1,14 @@
1
1
  // Pure planning and byte-preserving edits for the Axstack-owned routing block.
2
2
  import { hashContent } from './manifest.js';
3
- import { join } from './posixpath.js';
4
3
 
5
4
  const BEGIN = '<!-- axstack:begin v1 -->';
6
5
  const END = '<!-- axstack:end -->';
7
6
 
8
- export function renderInstructionBlock(skillsDir) {
7
+ export function renderInstructionBlock() {
9
8
  return [
10
9
  BEGIN,
11
- `Use Axstack for engineering work. Load \`${join(skillsDir, 'axstack', 'SKILL.md')}\` to route the request.`,
10
+ 'Use Axstack for engineering work: invoke the matching `axstack-*` skill directly.',
11
+ '`axstack-implement` loops author -> review -> repair until every PR is merge-ready.',
12
12
  'Route every subagent, delegated worker, reviewer, and cross-harness dispatch through Orca orchestration via the `orca` CLI and its `orca-cli` / `orchestration` skills so the work stays visible.',
13
13
  'Do not use a harness native subagent tool for delegated work.',
14
14
  END,
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)) {
@@ -1,81 +0,0 @@
1
- ---
2
- name: axstack
3
- description: When routing an engineering run through Axstack, use axstack to select the applicable phase and scope identity.
4
- ---
5
-
6
- # Axstack entry
7
-
8
- Route the current request to one Axstack phase with the right scope identity.
9
- The current chat remains the driver; Orca owns runtime orchestration.
10
-
11
- For an explicit relay message or transport test, use
12
- [axstack-relay](../axstack-relay/SKILL.md) directly. No engineering scope
13
- identity or decision workflow is needed for that send. The same skill handles
14
- urgent or blocking notifications under an explicit standing instruction.
15
-
16
- ## Route the request
17
-
18
- 1. Classify the request with [Shared routing](references/routing.md). Direct
19
- research, explanation, improvement discovery, peer-review, adopted-watch,
20
- and handoff routes need no spec
21
- ceremony. Only an explicit user-requested ownership transfer can use the
22
- capability-gated native route in
23
- [Lifecycle and receipts](references/lifecycle.md#native-handoff-and-resume),
24
- not an Axstack handoff phase. Preparation completion, watch expiry, and
25
- ordinary resume update or reconcile the run record without launching it.
26
- 2. For new engineering work, validate scope identity before invoking any phase.
27
- Record `small`, `substantial`, or `unclear` plus a brief reason, then apply the
28
- [proportional scope identity](references/routing.md#proportional-scope-identity).
29
- A small clear change proceeds from its snapshotted small-change intent.
30
- Substantial work proceeds only from an approved spec and matching ticket
31
- map. Clarify unclear size before dispatch.
32
- 3. Only after validation passes, invoke exactly the selected phase. A directly
33
- invoked later phase starts there and must pass its own identity check. When
34
- substantial work lacks an approved spec or matching ticket map, return that
35
- exact gap, name `axstack-align` as the next route, and stop the current
36
- invocation; do not invoke align, spec, or tickets. Apply the same stop to a
37
- mismatched or invalidated identity. Never admit work that a deeper phase
38
- would reject.
39
-
40
- The route is settled when one applicable phase is named with its valid scope
41
- identity, or the exact preparation/setup gap is reported with affected work
42
- held.
43
-
44
- ## Load at the action boundary
45
-
46
- - Every independently called phase loads [Standing contracts](references/contracts.md),
47
- which requires lifecycle and audit loading before action.
48
- - Before an actual Axstack role dispatch, delivery, settlement, or handoff, load
49
- [Orca runtime](references/orca-runtime.md). Ordinary reading, writing, and
50
- local checks do not require launch discovery.
51
- - Substantive delegated or resumable work uses the
52
- [Local run record](references/run-record.md).
53
- - When the current session is an Orca PR automation (driver or watchdog), load
54
- [Automation sessions](references/automations.md) before any discovery,
55
- review, gate, or mutation.
56
- - When review escalation or watch notification is eligible and the brief has a
57
- `Notification policy`, use the optional
58
- [axstack-relay](../axstack-relay/SKILL.md); otherwise keep notification in
59
- the current Orca conversation.
60
-
61
- ## Lifecycle
62
-
63
- This is a phase map, not an automatic dispatch sequence.
64
-
65
- 1. `axstack-align` settles substantial scope and decisions.
66
- 2. `axstack-spec` creates the single user-approved execution baseline.
67
- 3. `axstack-tickets` maps capabilities, tasks, and dependencies, then
68
- preparation stops with a resumable handoff.
69
- 4. `axstack-implement` produces owned candidates with strict TDD.
70
- 5. `axstack-review` gives peer PRs the two configured independent same-brief
71
- reviewer roles; authored PRs get one complete eligible non-author/non-owner
72
- review based on actual author provenance and the routing snapshot.
73
- 6. `axstack-watch` monitors within the shared deadline and hands off remaining
74
- work.
75
- 7. The human merges by default, bottom-up for a stack. Review approval never
76
- grants merge authority.
77
-
78
- Autonomous progress, model holds, serious-risk handling, mutation authority,
79
- and the one-host ownership contract live in
80
- [Standing contracts](references/contracts.md). Load only the selected phase
81
- and the references its action requires.