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
|
@@ -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
|
|
13
|
-
|
|
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`,
|
|
27
|
-
`defi-com/azure-next-hybrid
|
|
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;
|
|
98
|
-
|
|
99
|
-
|
|
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.
|
|
105
|
-
|
|
106
|
-
|
|
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
|
|
144
|
-
worktree
|
|
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
|
|
187
|
-
`review-azure-next-hybrid-PR-<num>.html`
|
|
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
|
|
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
|
-
|
|
289
|
-
|
|
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
|
|
312
|
-
|
|
313
|
-
|
|
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
|
-
|
|
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
|