axstack 0.11.1 → 0.11.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axstack",
3
- "version": "0.11.1",
3
+ "version": "0.11.5",
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",
@@ -9,8 +9,8 @@ Pair A/B is retired for this contract; its artefacts remain untouched.
9
9
 
10
10
  ## Roles and authority
11
11
 
12
- - **driver** — every 15 minutes, fresh Opus session in the dedicated Axstack
13
- automations worktree. It discovers GitHub work, binds the persistent Orca
12
+ - **driver** — every 15 minutes, fresh Opus session in the host's `root`
13
+ folder workspace, which is not a git repository and belongs to no project. It discovers GitHub work, binds the persistent Orca
14
14
  Run, creates one project-local child worktree per selected PR, dispatches the
15
15
  matching Axstack agent, reconciles completions and decisions, then exits. The
16
16
  driver is the automation session itself, with no `axstack-monitor` or
@@ -23,9 +23,9 @@ Pair A/B is retired for this contract; its artefacts remain untouched.
23
23
  - `axstack-monitor` remains an optional read-only observer that never sends.
24
24
 
25
25
  Self is resolved on every run with `gh api user --jq .login`; never hardcode
26
- it. The review allowlist is `defi-com/monorepo`, `defi-com/mobile`, and
27
- `defi-com/azure-next-hybrid`. The repair allowlist is `defi-com/monorepo` and
28
- `defi-com/mobile`. State both lists verbatim in the driver prompt. An own PR is
26
+ it. The review allowlist is `defi-com/monorepo`, `defi-com/mobile`,
27
+ `defi-com/azure-next-hybrid`, and `defi-com/ci-workflows`. The repair allowlist
28
+ is `defi-com/monorepo` and `defi-com/mobile`. State both lists verbatim in the driver prompt. An own PR is
29
29
  open, authored by self, on the repair allowlist, and not a draft. A peer PR is
30
30
  open, on the review allowlist, authored by someone else, and either officially
31
31
  review-requested from self or has a non-self comment that both mentions self
@@ -94,16 +94,21 @@ The driver performs this order and exits:
94
94
  dispatches nothing.
95
95
  2. Bind the persistent Run with `orca orchestration run-use` and read the
96
96
  inbox. For a `worker_done` matching a live marker, verify the review id at
97
- the bound head, push range, or opened token. Release the worker; remove its
98
- child worktree only after confirmed process exit and accepted settlement;
99
- then clear the marker. Unverifiable delivery stays in
97
+ the bound head, push range, or opened token. Release the worker; once its
98
+ release receipt is settled and the process has exited, run the cleanup
99
+ under "Run directory" below, which proves the worktree disposable before
100
+ removing it; then clear the marker. Unverifiable delivery stays in
100
101
  `pending_settlement[]` and blocks only that PR.
101
102
  3. Consume decisions as their sole consumer under "Decision tokens" below.
102
103
  4. Reconcile every marker older than 3 h. A live worker gets `worker-stop`; an
103
104
  exited worker gets `worker-abandon`. Unknown liveness or user takeover
104
- retains worktree and marker and blocks only that PR. After confirmed
105
- abandon, remove the worktree, append one health line, increment the head's
106
- `abandon_count`, and drop that head so normal selection retries once. For a
105
+ retains worktree and marker and blocks only that PR. An abandon is
106
+ confirmed by its accepted abandon receipt plus proven process exit; there
107
+ is no release receipt on this path. After confirmed abandon, run the same
108
+ cleanup under "Run directory" below with its extra clean-tree condition — a
109
+ dirty or unproven worktree is retained, not removed — append one health
110
+ line, increment the head's `abandon_count`, and drop that head so normal
111
+ selection retries once. For a
107
112
  review-triggered dispatch, use the marker's `trigger` to remove exactly its
108
113
  review id and digest from `processed_reviews[]`. A second abandon at that
109
114
  head is a user-owned hold.
@@ -112,7 +117,9 @@ The driver performs this order and exits:
112
117
  marker. Dispatch within the repair and review rules below.
113
118
  6. Promote the `pending.json` fingerprint verbatim, because it records
114
119
  observation rather than completion. Write `tick_done_at` and
115
- `tick_outcome: ok`, then exit.
120
+ `tick_outcome: ok`, then close your own terminal tab and exit: each tick is
121
+ a fresh session and there is no hygiene sweep, so a tab left open outlives
122
+ the tick as a stray terminal in the root workspace.
116
123
 
117
124
  ## Dispatch and repair selection
118
125
 
@@ -140,8 +147,9 @@ An own PR needs repair when either trigger applies:
140
147
 
141
148
  Repair also requires no deploy-on-push head branch, no live repair cap, and
142
149
  selection of the lowest own PR in its stack that needs repair. Create a child
143
- worktree in that project's clone at the exact head, parented to the driver
144
- worktree, and dispatch one `axstack-watch` agent in authored repair mode. Its
150
+ worktree in that project's clone at the exact head, parented to that
151
+ project's primary worktree so it appears under the project it serves, and
152
+ dispatch one `axstack-watch` agent in authored repair mode. Its
145
153
  brief contains only the triggering checks or review findings. Each open
146
154
  descendant records one user-owned `pending restack` hold until it stops needing
147
155
  repair. The 24 h cap starts at dispatch and an abandon does not refund it.
@@ -180,11 +188,26 @@ The verdict body ends with this exact marker line:
180
188
  <!-- axstack-automation verdict head=<sha> -->
181
189
  ```
182
190
 
191
+ The verdict body is written for the person reading the PR and reads as one
192
+ reviewer's findings. It never names the reviewer count, the brief, the
193
+ angles, the gate, receipts, or which reviewer found what: "two independent
194
+ reviews", "from secondary", and "the reviewers ran" are pipeline facts, not
195
+ review content. It is self-contained: every validated finding, blocking or
196
+ not, appears in full in the body — evidence and consequence, file and line
197
+ where they exist — so a reader is never told that notes exist without seeing
198
+ them, and a finding is never dropped to keep the body short. It never points
199
+ at the local review file or at anything the reader cannot open. Evidence
200
+ appears as what was checked and observed, not as who ran it: the reviewed
201
+ head and base SHAs, CI status, test counts, and diff size are reader-useful
202
+ facts and belong; "shape verified" and "pinned CI" are pipeline phrasing and
203
+ do not. The marker line is the only pipeline artefact the body carries.
204
+
183
205
  Write the local review file to the workspace review directory
184
206
  `~/defi/misc/reviews/` under the existing convention:
185
207
  `review-PR-<num>.html` with no prefix means `defi-com/monorepo`;
186
- `review-mobile-PR-<num>.html` and
187
- `review-azure-next-hybrid-PR-<num>.html` name the other repositories. A write
208
+ `review-mobile-PR-<num>.html`,
209
+ `review-azure-next-hybrid-PR-<num>.html` and `review-ci-workflows-PR-<num>.html`
210
+ name the other repositories. A write
188
211
  failure is recorded but does not withhold the verdict.
189
212
 
190
213
  Authored repair commits a local candidate, obtains one Sol review at that
@@ -235,7 +258,9 @@ Before opening a `push` token, the repair agent pins its candidate with local
235
258
  ref `refs/axstack/decisions/<token>` in the project clone, so the candidate
236
259
  survives worktree removal. It then sends one
237
260
  `hermes send --to telegram` message naming the PR, criterion, every reviewer's
238
- reason, and the exact replies `approve <token>` and `reject <token>`. Store the
261
+ reason, and the exact replies `/axstack-decide approve <token>` and
262
+ `/axstack-decide reject <token>` (the slash form loads the Hermes skill
263
+ deterministically; bare `approve <token>` is best effort). Store the
239
264
  send receipt. The driver retries a `failed` send once next tick and reconciles
240
265
  an `uncertain` send against Hermes output before any retry.
241
266
 
@@ -285,8 +310,31 @@ is no gate for health findings.
285
310
 
286
311
  ## Run directory
287
312
 
288
- One `.git/axstack/runs/<run id>/` directory under the Axstack git-common-dir
289
- contains:
313
+ The driver and watchdog run from the host's `root` folder workspace, not a
314
+ project worktree: no project owns the automation, and every child worktree
315
+ belongs to the project it serves. That workspace is not a git repository, so
316
+ the run directory is private host state, one
317
+ `~/.local/share/axstack/runs/<run id>/` directory. Settlement leaves nothing
318
+ behind, but never destroys work. Before any destructive step the driver
319
+ proves the child is disposable: the worker is settled — on the release path
320
+ a settled release receipt, on the abandon path an accepted abandon receipt,
321
+ either with proven process exit; pending or unknown stops here — the
322
+ worktree's HEAD is either the pinned head or a candidate that is durably
323
+ reachable — pushed to the head branch, tested only after a successful
324
+ targeted fetch of that exact remote branch into a per-dispatch ref, never
325
+ `FETCH_HEAD`, so neither a stale tracking ref nor a concurrent fetch in the
326
+ shared clone can fake durability, a failed fetch retaining the worktree — or held by a
327
+ `refs/axstack/decisions/<token>` ref in the project clone; and, on the
328
+ abandon path, the worktree has no uncommitted changes.
329
+ Only then it closes any terminal tab still listed, clears untracked
330
+ artefacts, removes the child worktree and its directory, deletes the branch
331
+ the worktree created, and verifies the directory is gone. On the settled path
332
+ the worker has finished, so untracked files are artefacts by definition and
333
+ are cleared; a candidate there is already pushed or token-held. An abandoned
334
+ worktree that is dirty or holds an unproven candidate is **retained**, named
335
+ in one `health[]` line with its path and SHA, and blocks only that PR with
336
+ the user as owner. A worktree, directory, branch, or terminal that outlives
337
+ its dispatch without such a retention record is a health finding. The run directory contains:
290
338
 
291
339
  - `cursor.json` — driver only, with these exact keys: `fingerprint`,
292
340
  `tick_started_at`, `tick_done_at`, `tick_outcome`, `prs{url: {head, base,
@@ -308,9 +356,11 @@ Timestamps are UTC `YYYY-MM-DDTHH:MM:SSZ`; an unparsable timestamp is an
308
356
  `error` for the precheck and `unknown` for the watchdog, never silently
309
357
  ignored.
310
358
 
311
- Orca run history is the authoritative log. The launch worktree is a dedicated
312
- Axstack worktree where nobody develops. The current `defi-automations`
313
- worktree retires with the old pair. Keep this notification-policy edge in the
359
+ Orca run history is the authoritative log. The launch workspace is the host's
360
+ `root` folder workspace, not a project worktree: nobody develops there, it is
361
+ not a git repository, and no project owns the automation. The briefs and the
362
+ escalation template are read from the axstack checkout at an absolute path
363
+ given in the prompt, never relative to the launch workspace. Keep this notification-policy edge in the
314
364
  run record: `Notification policy` authorizes the token and watchdog sends;
315
365
  delivery uses [axstack-relay](../../axstack-relay/SKILL.md).
316
366
 
@@ -81,7 +81,8 @@ existing action boundaries before acting; silence never grants permission.
81
81
  An automation escalation is the narrow exception defined by
82
82
  [Automation sessions](../axstack/references/automations.md). The PR agent opens
83
83
  an immutable-bound decision token, sends one message with the exact
84
- `approve <token>` and `reject <token>` replies, records the send receipt, and
84
+ `/axstack-decide approve <token>` and `/axstack-decide reject <token>` replies,
85
+ records the send receipt, and
85
86
  exits without waiting. The Hermes script decides by validating the private
86
87
  channel and updating only an open token file; Hermes never performs the bound
87
88
  GitHub or Git action. The driver consumes the file on a later tick, revalidates