axstack 0.9.0 → 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axstack",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
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",
@@ -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`, allowlist
16
- `defi-com/monorepo, defi-com/mobile, defi-com/azure-next-hybrid`.
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 rather than as one global list. One allowlist gates both own-PR
47
- repair and peer review for its own automation; there is no separate
48
- review-only list. Outside the
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, `APPROVE`,
57
- `REQUEST_CHANGES`. A need for any of these becomes a recorded hold.
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; and
139
- a per-tick push budget across all allowlisted repositories combined, configured
140
- per pair and six for pair C/D. Reaching either cap records a hold naming the cap
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 or `COMMENT` publication then
202
- additionally requires no unresolved validated blocking finding, because
203
- `proceed` never overrides a validated blocking finding. A reviewer security
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
- or publication; a push before the gate settles is forbidden.
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, or a per-PR repair
235
- cap that has expired (pair C/D only, since pair A/B has no caps). Exit 0 when the hash differs or control work is due;
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 → [axstack-watch](../../axstack-watch/SKILL.md) on the exact head
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. Follow its repair-publication reference: candidate committed locally,
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 `COMMENT` review under the review skill's
275
- COMMENT branch. `INCOMPLETE` or an unavailable required reviewer records a
276
- hold and publishes nothing.
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, pending failed-relay
348
- retries; written by the driver after each processed tick), `precheck.log` (precheck only), and
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 the Orca driver automation, load
20
- [Automation sessions](../axstack/references/automations.md): its reviewer
21
- briefs carry the required escalation field and its publication is `COMMENT`
22
- only.
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 `COMMENT` branch below, with
310
- the existing remote head/base readback and ambiguity handling, is the only
311
- submission the Orca driver automation makes. The prohibition on `APPROVE` and
312
- `REQUEST_CHANGES` is a ban on those GitHub actions; the review skill's internal
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
- Only the Orca driver automation, as owner for a peer PR under
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. It
320
- never submits `APPROVE` or `REQUEST_CHANGES`; a need for either is a
321
- recorded hold. The peer-review submission rule above is unchanged for every
322
- other caller.
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.