axstack 0.9.1 → 0.10.1
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
|
@@ -12,8 +12,14 @@ own prompt; never assume.
|
|
|
12
12
|
- **Pair A/B** — driver Automation A (`*/30`) and watchdog Automation B, run id
|
|
13
13
|
`20260916-pr-automations`, allowlist `axatbhardwaj/axstack`.
|
|
14
14
|
- **Pair C/D** — driver Automation C (hourly) and watchdog Automation D, run id
|
|
15
|
-
`20260916-defi-automations`,
|
|
16
|
-
`defi-com/monorepo, defi-com/mobile,
|
|
15
|
+
`20260916-defi-automations`, carrying **two** lists rather than one:
|
|
16
|
+
- review allowlist `defi-com/monorepo, defi-com/mobile,
|
|
17
|
+
defi-com/azure-next-hybrid`;
|
|
18
|
+
- repair allowlist `defi-com/monorepo, defi-com/mobile`.
|
|
19
|
+
|
|
20
|
+
`defi-com/azure-next-hybrid` is therefore review-only: its own PRs are
|
|
21
|
+
discovered and recorded but never repaired and never pushed to, and they are
|
|
22
|
+
not review candidates either, since a PR authored by self is not a peer PR.
|
|
17
23
|
|
|
18
24
|
The two pairs share no state: each has its own run id, run directory,
|
|
19
25
|
`progress.md` and sidecars, and no sidecar is shared between them. A clause
|
|
@@ -43,9 +49,13 @@ owns policy, the run record, and evidence.
|
|
|
43
49
|
deduplicated canonically by PR URL across the three searches with own-PR
|
|
44
50
|
precedence.
|
|
45
51
|
- **Mutation allowlist:** stated verbatim in the automation prompt, per
|
|
46
|
-
automation
|
|
47
|
-
|
|
48
|
-
review
|
|
52
|
+
automation. Pair A/B carries one list gating both own-PR repair and peer
|
|
53
|
+
review. Pair C/D carries two, a review allowlist and a repair allowlist, and
|
|
54
|
+
each action reads its own list: a repository on the review list but not the
|
|
55
|
+
repair list is reviewed and never repaired. Where a clause says "allowlisted"
|
|
56
|
+
without naming an action — including the precheck's "hash only allowlisted
|
|
57
|
+
PRs" — it means the union of the applicable lists for discovery and the wake
|
|
58
|
+
fingerprint, and the action-specific list for the action itself. Outside the
|
|
49
59
|
allowlist the automation discovers and records only. The precheck writes the
|
|
50
60
|
full discovery list to `pending.json`; no review, watch, gate, or other model
|
|
51
61
|
work is launched for an external PR. External changes do not enter the wake
|
|
@@ -53,8 +63,11 @@ owns policy, the run record, and evidence.
|
|
|
53
63
|
never produce an escalation. This is a deliberate coverage reduction, not an
|
|
54
64
|
implied clean review; discovery errors themselves remain automation-health
|
|
55
65
|
findings.
|
|
56
|
-
- **Prohibited everywhere:** force-push, rebase, merge, close
|
|
57
|
-
|
|
66
|
+
- **Prohibited everywhere:** force-push, rebase, merge, close. A need for any of
|
|
67
|
+
these becomes a recorded hold, for all four automations, with no exception.
|
|
68
|
+
- **`APPROVE` and `REQUEST_CHANGES`** are prohibited for Automations A, B and D.
|
|
69
|
+
Automation C may submit them under "Binding review verdicts (pair C)" below
|
|
70
|
+
and nowhere else; a need for either outside that section is a recorded hold.
|
|
58
71
|
|
|
59
72
|
## Roles per mode
|
|
60
73
|
|
|
@@ -135,9 +148,15 @@ digest is not already recorded against that PR at that head SHA. Review-ID dedup
|
|
|
135
148
|
insufficient: a bot that re-posts the identical finding under a new review ID
|
|
136
149
|
would otherwise re-trigger a repair on every tick.
|
|
137
150
|
|
|
138
|
-
Caps: at most one repair per PR per 24 hours, counted regardless of trigger;
|
|
139
|
-
|
|
140
|
-
per pair and six for pair C/D
|
|
151
|
+
Caps: at most one repair per PR per 24 hours, counted regardless of trigger; a
|
|
152
|
+
per-tick push budget across all allowlisted repositories combined, configured
|
|
153
|
+
per pair and six for pair C/D; and, for pair C, a per-tick **review** budget
|
|
154
|
+
limiting how many binding verdicts may be submitted in one tick, configured per
|
|
155
|
+
pair and **one** for pair C. The review budget exists because C has no `COMMENT`
|
|
156
|
+
path, so an unbudgeted first tick over a backlog would place binding verdicts on
|
|
157
|
+
every discovered peer PR at once, unattended and on other people's work. Reviews
|
|
158
|
+
beyond the budget are left for the next tick, oldest `updatedAt` first so the
|
|
159
|
+
backlog drains in a stable order rather than by chance. Reaching any of the three caps records a hold naming the cap
|
|
141
160
|
and the value reached, rather than silently dropping the work. A budget hold
|
|
142
161
|
names the budget as its owner and is exempt from the hold with no owner
|
|
143
162
|
threshold. When a per-PR cap has expired the precheck wakes the driver even
|
|
@@ -186,6 +205,69 @@ repository's workflow files, recorded, and re-verified before enabling and on
|
|
|
186
205
|
any later allowlist change. It is never hardcoded to one branch name, because a
|
|
187
206
|
repository may deploy from more than one branch and may add another at any time.
|
|
188
207
|
|
|
208
|
+
## Binding review verdicts (pair C)
|
|
209
|
+
|
|
210
|
+
Automation C submits a real review verdict where pair A/B publishes a `COMMENT`.
|
|
211
|
+
The authority is narrow and every bound below is load-bearing.
|
|
212
|
+
|
|
213
|
+
Every review Automation C publishes is a binding verdict. C has no `COMMENT`
|
|
214
|
+
path: a peer PR reached through the qualifying mention trigger gets a verdict
|
|
215
|
+
exactly as an officially-requested one does. The only restriction is authorship
|
|
216
|
+
— GitHub rejects a verdict from a PR's own author, so an authored-mode review of
|
|
217
|
+
C's own repair stays internal and gates only the push. Automation D never writes
|
|
218
|
+
to GitHub at all.
|
|
219
|
+
|
|
220
|
+
`APPROVE` requires a complete mode-required review at the exact head SHA with a
|
|
221
|
+
current base, the gate's `proceed`, and zero unresolved validated blocking
|
|
222
|
+
findings. `REQUEST_CHANGES` requires the same completeness and gate token and at
|
|
223
|
+
least one validated blocking finding carrying its evidence and consequence; it
|
|
224
|
+
is the verdict that reports blockers and is not gated on their absence.
|
|
225
|
+
`INCOMPLETE`, unresolved material disagreement, an unavailable required
|
|
226
|
+
reviewer, or a gate `escalate` submits nothing and records a hold.
|
|
227
|
+
|
|
228
|
+
### Blocking obligations
|
|
229
|
+
|
|
230
|
+
A submitted `REQUEST_CHANGES` blocks the PR and a teammate's later push does not
|
|
231
|
+
clear it. Submitting a review also removes self from GitHub's `review-requested`
|
|
232
|
+
results, so a PR C has just blocked can leave discovery on the next tick and C
|
|
233
|
+
would never see it again to clear its own block.
|
|
234
|
+
|
|
235
|
+
C therefore records every unresolved blocking review in `cursor.json` as an open
|
|
236
|
+
obligation holding the PR URL, the review id, the head SHA it was bound to, and
|
|
237
|
+
the submission timestamp, and polls those PRs directly by URL every tick
|
|
238
|
+
regardless of discovery eligibility. An obligation is discharged only by
|
|
239
|
+
observing the PR merged, closed, or its blocking review resolved or superseded.
|
|
240
|
+
A failed poll retries next tick; three consecutive unpollable ticks is a health
|
|
241
|
+
finding routed to the gate.
|
|
242
|
+
|
|
243
|
+
While C holds any unresolved blocking review, every scheduled tick wakes it: an
|
|
244
|
+
outstanding obligation is due control work in the precheck's list, alongside a
|
|
245
|
+
watch deadline, a pending failed-relay retry, and an expired repair cap.
|
|
246
|
+
|
|
247
|
+
An obligation carries a narrow authority to resolve itself: C may submit exactly one superseding verdict on that PR,
|
|
248
|
+
including a clearing `APPROVE`, without a fresh review request. It follows the
|
|
249
|
+
obligation chain — an obligation opened by a verdict submitted under this
|
|
250
|
+
authority inherits it — so the authority persists on that one PR until it
|
|
251
|
+
merges, closes, or its block is resolved, and the deadlock does not reappear one
|
|
252
|
+
head later when a teammate pushes without fixing. It extends to nothing else: not
|
|
253
|
+
another PR, not a discharged obligation, and never more than one superseding
|
|
254
|
+
verdict per head SHA. A supersede whose head and base are both unchanged
|
|
255
|
+
additionally requires a recorded finding-level reason naming what changed about
|
|
256
|
+
the finding; without it C holds and submits nothing.
|
|
257
|
+
|
|
258
|
+
### Local review file
|
|
259
|
+
|
|
260
|
+
Every review C publishes, verdict or `COMMENT`, is also written to the
|
|
261
|
+
workspace review directory `~/defi/misc/reviews/`, carrying the same findings
|
|
262
|
+
and evidence as the submitted review plus the reviewed SHA. The naming is the
|
|
263
|
+
workspace convention and the prefix rules are load-bearing, because PR numbers
|
|
264
|
+
collide across repositories: `review-PR-<num>.html` with no prefix means
|
|
265
|
+
`defi-com/monorepo` by definition, and every other repository takes its prefix,
|
|
266
|
+
`review-azure-next-hybrid-PR-<num>.html` and `review-mobile-PR-<num>.html`. A
|
|
267
|
+
failure to write the file is a recorded hold; a review is never withheld or
|
|
268
|
+
retracted because the file could not be written, so the mismatch stays visible
|
|
269
|
+
rather than silent.
|
|
270
|
+
|
|
189
271
|
## Escalation gate
|
|
190
272
|
|
|
191
273
|
After every mode-required reviewer settles, the driver spawns `axstack-auditor`
|
|
@@ -198,13 +280,18 @@ escalation gate. It returns exactly one literal token, `escalate` or `proceed`.
|
|
|
198
280
|
[axstack-relay](../../axstack-relay/SKILL.md) naming the PR, the criterion,
|
|
199
281
|
every reviewer's reason, where the user acts (Orca conversation, worktree, or
|
|
200
282
|
PR), and the hold; it publishes nothing.
|
|
201
|
-
- `proceed` → no notification; a push
|
|
202
|
-
additionally requires no unresolved validated blocking finding,
|
|
203
|
-
`proceed` never overrides a validated blocking finding. A
|
|
283
|
+
- `proceed` → no notification; a push, a `COMMENT` publication, or an
|
|
284
|
+
`APPROVE` then additionally requires no unresolved validated blocking finding,
|
|
285
|
+
because `proceed` never overrides a validated blocking finding. A
|
|
286
|
+
`REQUEST_CHANGES` is the exception and the only one: it is the publication
|
|
287
|
+
that reports validated blocking findings, so it requires at least one and is
|
|
288
|
+
never gated on their absence. A reviewer security
|
|
204
289
|
"yes" that the gate does not escalate is recorded as rejected-with-evidence
|
|
205
290
|
or returned to the author before any mutation.
|
|
206
|
-
- Only `proceed` plus no unresolved validated blocking finding permits a push
|
|
207
|
-
|
|
291
|
+
- Only `proceed` plus no unresolved validated blocking finding permits a push,
|
|
292
|
+
a `COMMENT` publication or an `APPROVE`; a `REQUEST_CHANGES` needs `proceed`
|
|
293
|
+
plus at least one such finding. A push or publication before the gate settles
|
|
294
|
+
is forbidden either way.
|
|
208
295
|
- Precedence: credible serious risk found by a reviewer still produces the
|
|
209
296
|
standing internal prompt and dependent-action hold immediately, and the gate
|
|
210
297
|
governs only external notification. That hold is the serious-risk rule of
|
|
@@ -231,8 +318,9 @@ to the hashed fingerprint, so a draft becoming ready wakes the driver on its
|
|
|
231
318
|
own; pair A/B's queried fields and fingerprint are unchanged. Hash
|
|
232
319
|
only allowlisted PRs. Read `cursor.json` for the last processed fingerprint and
|
|
233
320
|
for due control work: a watch deadline at or before now (pair A/B only, since
|
|
234
|
-
pair C/D stores no deadlines), a pending failed-relay retry,
|
|
235
|
-
|
|
321
|
+
pair C/D stores no deadlines), a pending failed-relay retry, a per-PR repair cap
|
|
322
|
+
that has expired, or an outstanding blocking-review obligation (both pair C/D
|
|
323
|
+
only, since pair A/B has neither caps nor binding verdicts). Exit 0 when the hash differs or control work is due;
|
|
236
324
|
otherwise exit non-zero. Exit non-zero without running when the previous driver
|
|
237
325
|
run is still active, or on `error`. Append one line
|
|
238
326
|
`<ts> <changed|due|unchanged|error|busy>` to `precheck.log`.
|
|
@@ -265,15 +353,20 @@ repair and publication for that run and is a health finding.
|
|
|
265
353
|
|
|
266
354
|
For each changed PR:
|
|
267
355
|
|
|
268
|
-
- Own PR
|
|
356
|
+
- Own PR, and only when its repository is on the acting automation's repair
|
|
357
|
+
allowlist → [axstack-watch](../../axstack-watch/SKILL.md) on the exact head
|
|
269
358
|
SHA in a per-PR child worktree; the driver worktree never checks out a PR
|
|
270
|
-
branch
|
|
359
|
+
branch, and an own PR in a review-only repository is recorded and nothing
|
|
360
|
+
else, with no repair, no worktree and no push. Follow its repair-publication reference: candidate committed locally,
|
|
271
361
|
authored review at the local SHA, gate, then fast-forward push with the
|
|
272
362
|
publication readback immediately before it.
|
|
273
363
|
- Peer PR → two isolated `axstack-review` passes on the exact head SHA, then
|
|
274
|
-
the gate, then one owner-synthesized
|
|
275
|
-
|
|
276
|
-
|
|
364
|
+
the gate, then one owner-synthesized review bound to the reviewed commit. For
|
|
365
|
+
pair A/B that is a `COMMENT` under the review skill's COMMENT branch; for
|
|
366
|
+
every pair C peer PR it is a binding verdict under "Binding review verdicts
|
|
367
|
+
(pair C)" above, whether the PR was reached by an official review request or
|
|
368
|
+
by the qualifying mention trigger. `INCOMPLETE` or an
|
|
369
|
+
unavailable required reviewer records a hold and publishes nothing.
|
|
277
370
|
|
|
278
371
|
Watch window, pair A/B only: 24 hours per own PR from first observation, ending
|
|
279
372
|
early on merge or close. The deadline is stored in `cursor.json`; a due deadline
|
|
@@ -344,8 +437,10 @@ hermes send, target telegram (home), host VPS, gate-authorized escalations only
|
|
|
344
437
|
Machine-readable sidecars in the same directory: `pending.json` (observed
|
|
345
438
|
fingerprint plus full discovery list, written by the precheck), `cursor.json`
|
|
346
439
|
(last processed fingerprint promoted verbatim from `pending.json`, expired PR
|
|
347
|
-
list and per-PR watch deadlines for pair A/B only,
|
|
348
|
-
|
|
440
|
+
list and per-PR watch deadlines for pair A/B only, outstanding blocking-review
|
|
441
|
+
obligations for pair C only — each holding PR URL, review id, bound head SHA,
|
|
442
|
+
submission timestamp and whether its one supersede is still available — pending
|
|
443
|
+
failed-relay retries; written by the driver after each processed tick), `precheck.log` (precheck only), and
|
|
349
444
|
`watchdog.json` (watchdog only). Orca run history remains the authoritative
|
|
350
445
|
log; the record is derived progress, never authority.
|
|
351
446
|
|
|
@@ -16,10 +16,12 @@ to select the mode and scope identity, and apply the shared
|
|
|
16
16
|
[PR-shape policy](../axstack/references/pr-shape.md). For an owned candidate,
|
|
17
17
|
load and verify the
|
|
18
18
|
[candidate-publication boundary](../axstack/references/candidate-publication.md).
|
|
19
|
-
When the caller is
|
|
20
|
-
[Automation sessions](../axstack/references/automations.md): its reviewer
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
When the caller is an Orca driver automation, load
|
|
20
|
+
[Automation sessions](../axstack/references/automations.md): its reviewer briefs
|
|
21
|
+
carry the required escalation field, and its publication is `COMMENT` only for
|
|
22
|
+
the pair A/B driver. Every peer PR the pair C driver publishes on takes the
|
|
23
|
+
actual verdict instead, under "Binding review verdicts (pair C)" in that
|
|
24
|
+
reference and the authorized-submission branch below.
|
|
23
25
|
|
|
24
26
|
## Peer mode (colleague PR)
|
|
25
27
|
|
|
@@ -306,20 +308,26 @@ for a complete `APPROVE` or `REQUEST_CHANGES` verdict:
|
|
|
306
308
|
Submission is complete only when the remote receipt confirms the review bound
|
|
307
309
|
to the intended commit.
|
|
308
310
|
|
|
309
|
-
Automation exception — Authorized submission: the
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
`REQUEST_CHANGES`
|
|
313
|
-
verdict vocabulary is unchanged.
|
|
311
|
+
Automation exception — Authorized submission, pair-scoped: for the pair A/B
|
|
312
|
+
driver automation the `COMMENT` branch below, with the existing remote head/base
|
|
313
|
+
readback and ambiguity handling, is the only submission it makes, and for it the
|
|
314
|
+
prohibition on `APPROVE` and `REQUEST_CHANGES` remains a ban on those GitHub
|
|
315
|
+
actions while the review skill's internal verdict vocabulary is unchanged. The
|
|
316
|
+
pair C driver automation instead uses this authorized-submission
|
|
317
|
+
branch and submits the actual verdict on an officially-requested peer PR, under
|
|
318
|
+
"Binding review verdicts (pair C)" in
|
|
319
|
+
[Automation sessions](../axstack/references/automations.md); a peer PR it
|
|
320
|
+
reached through the qualifying mention trigger still takes the `COMMENT` branch.
|
|
314
321
|
|
|
315
322
|
## Automation publication (`COMMENT`)
|
|
316
323
|
|
|
317
|
-
|
|
324
|
+
The pair A/B driver automation, as owner for a peer PR under
|
|
318
325
|
[Automation sessions](../axstack/references/automations.md), uses this branch:
|
|
319
|
-
one `COMMENT` review, owner-synthesized and bound to the reviewed commit.
|
|
320
|
-
never submits `APPROVE` or `REQUEST_CHANGES`; a need
|
|
321
|
-
recorded hold. The
|
|
322
|
-
|
|
326
|
+
one `COMMENT` review, owner-synthesized and bound to the reviewed commit. On
|
|
327
|
+
this branch the automation never submits `APPROVE` or `REQUEST_CHANGES`; a need
|
|
328
|
+
for either is a recorded hold. The pair C driver does not use this branch at
|
|
329
|
+
all; its peer PRs take the authorized-submission branch above. The peer-review submission rule above is unchanged for every other
|
|
330
|
+
caller.
|
|
323
331
|
|
|
324
332
|
1. Complete the mode-required review: every mode-required receipt is current
|
|
325
333
|
for the head SHA and current base, and each carries its escalation field.
|