axstack 0.10.1 → 0.11.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.
@@ -17,12 +17,9 @@ binding state and receipts to exact revisions.
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 five-minute driver is the automation session
21
- itself, a mutating owner for the PRs it handles with no `axstack-monitor` or
22
- `axstack-owner` role row. `axstack-monitor` is an optional read-only observer
23
- that never sends. `axstack-watchdog` is the hourly health checker that never
24
- mutates GitHub and performs exactly one kind of send, a gate-authorized
25
- automation-health escalation recorded in `watchdog.json`.
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.
26
23
  - Auditor (`axstack-auditor`): report-only; never edits, merges, activates, or
27
24
  audits itself.
28
25
 
@@ -99,19 +96,18 @@ Tracking grants no merge, release, model-substitution, or scope authority.
99
96
 
100
97
  ## Deadline (one rule for every owned timer)
101
98
 
102
- The default 24-hour deadline covers every task-owned timer, including open-PR
103
- monitors and watchdogs. Stop at deadline; remaining work gets a resumable
104
- handoff, never silent renewal. Merge-ready differs from merged; human merges.
99
+ The default 24-hour deadline covers standalone task-owned timers. Stop them at
100
+ deadline and preserve remaining work; there is no watch deadline for
101
+ automations. Merge-ready differs from merged; human merges.
105
102
 
106
103
  ## Watch health
107
104
 
108
- The user lifted the native-watch hold by user decision on 2026-09-16. The driver
109
- automation is a mutating owner for its PRs; `axstack-watchdog` stays
110
- independent and read-only, with quiet healthy snapshots, deduplicated events,
111
- restart reconciliation, and one shared deadline. Native Orca automations expose
112
- a provider but cannot pin model, effort, or permission, so the driver records
113
- its model identity every tick and the watchdog treats a mismatch as a safety
114
- hold. Build no custom scheduler and use no legacy fallback. Details live in
105
+ The user lifted the native-watch hold by user decision on 2026-09-16. The
106
+ driver automation is a mutating owner for its PRs; `axstack-watchdog` stays
107
+ independent and read-only. The driver every 15 minutes dispatches and exits;
108
+ the watchdog is model-free, has no gate, and records `watchdog.log`; there is
109
+ no watch deadline for automations. Build no custom scheduler and use no legacy
110
+ fallback. Details live in
115
111
  [Watch runtime](../../axstack-watch/references/watch-runtime.md).
116
112
 
117
113
  ## Audit hook (end of run and meaningful checkpoints)
@@ -63,12 +63,12 @@ listing all pass.
63
63
 
64
64
  ## Preserve identity and authority
65
65
 
66
- Delivery is one-way. Hermes does not route a Telegram reply back to the
67
- sending session; its own agent answers replies. A reply is therefore never a
68
- receipt, decision, or authority for this session, and no persistent owner is
69
- needed to send. Every message must say where the user acts: the current Orca
70
- conversation, the Orca worktree, or the GitHub PR. Do not ask the user to reply with
71
- decision words, and do not poll Telegram for answers.
66
+ Delivery is one-way; no session polls Telegram. Hermes does not route a reply
67
+ back to the sending session; its own agent answers replies. Outside the fixed
68
+ decision-token flow below, a reply is never a receipt, decision, or authority
69
+ for this session, and no persistent owner is needed to send. Every ordinary
70
+ message must say where the user acts: the current Orca conversation, the Orca
71
+ worktree, or the GitHub PR. Do not invent reply commands.
72
72
 
73
73
  Send authority comes from the explicit request or applicable standing policy.
74
74
  It grants no merge, publication, ownership-transfer, or model-substitution
@@ -76,6 +76,24 @@ authority. Delivery is transport evidence only. Revalidate any user decision
76
76
  that arrives through an authorized channel against the current task and
77
77
  existing action boundaries before acting; silence never grants permission.
78
78
 
79
+ ## Decision tokens
80
+
81
+ An automation escalation is the narrow exception defined by
82
+ [Automation sessions](../axstack/references/automations.md). The PR agent opens
83
+ an immutable-bound decision token, sends one message with the exact
84
+ `approve <token>` and `reject <token>` replies, records the send receipt, and
85
+ exits without waiting. The Hermes script decides by validating the private
86
+ channel and updating only an open token file; Hermes never performs the bound
87
+ GitHub or Git action. The driver consumes the file on a later tick, revalidates
88
+ all bound state, marks an approval spent before acting, performs only that
89
+ action, and records its receipt.
90
+
91
+ This does not create a reply channel for the sending agent: Hermes pushes the
92
+ decision to the file through the fixed `axstack-decide` script, and the driver
93
+ reads that file. Delivery is one-way; no session polls Telegram. Token creation,
94
+ decision, and consumption keep their separate writers and authority; a message
95
+ receipt alone authorizes nothing.
96
+
79
97
  ## Reconcile, deliver, and record
80
98
 
81
99
  Before any new send, check the caller's run record for an existing receipt
@@ -18,10 +18,8 @@ load and verify the
18
18
  [candidate-publication boundary](../axstack/references/candidate-publication.md).
19
19
  When the caller is an Orca driver automation, load
20
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.
21
+ carry the required escalation field and every eligible peer PR takes a binding
22
+ `APPROVE` or `REQUEST_CHANGES` verdict under the automation exception below.
25
23
 
26
24
  ## Peer mode (colleague PR)
27
25
 
@@ -221,11 +219,10 @@ Escalate to user: yes | no — <criterion> — <reason>
221
219
 
222
220
  Every brief ends with the `Escalate to user` field and the reviewer answers it
223
221
  in the receipt. A reviewer may cite only a security concern, a permanent
224
- on-chain state change, or an architectural change in approach; the automation
225
- health criterion belongs to the watchdog and safety-hold path and is never a
226
- reviewer criterion. The answer is input to the escalation gate, not a veto and
227
- not a verdict; see [Automation sessions](../axstack/references/automations.md)
228
- for the gate.
222
+ on-chain state change, or an architectural change in approach. Health is not a
223
+ reviewer criterion. The answer is input to the PR escalation gate, not a veto
224
+ and not a verdict; see
225
+ [Automation sessions](../axstack/references/automations.md) for the gate.
229
226
 
230
227
  ## Template: review receipt (one block per revision)
231
228
 
@@ -260,9 +257,9 @@ private transport values or configuration.
260
257
  Under an automation session, credible serious risk found by a reviewer still
261
258
  raises the standing internal prompt and dependent-action hold immediately, and
262
259
  the gate governs only external notification: the internal prompt lands in the
263
- run record and the automation session's own Orca conversation, and no
264
- `hermes send` occurs without the gate's `escalate` token. `proceed` never
265
- overrides a validated blocking finding.
260
+ run record and the automation session's own Orca conversation. `escalate`
261
+ opens the bound decision token, sends through `axstack-relay`, and exits
262
+ without waiting; `proceed` never overrides a validated blocking finding.
266
263
 
267
264
  ## Publishing rule
268
265
 
@@ -308,44 +305,26 @@ for a complete `APPROVE` or `REQUEST_CHANGES` verdict:
308
305
  Submission is complete only when the remote receipt confirms the review bound
309
306
  to the intended commit.
310
307
 
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.
321
-
322
- ## Automation publication (`COMMENT`)
323
-
324
- The pair A/B driver automation, as owner for a peer PR under
325
- [Automation sessions](../axstack/references/automations.md), uses this branch:
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.
331
-
332
- 1. Complete the mode-required review: every mode-required receipt is current
333
- for the head SHA and current base, and each carries its escalation field.
334
- `INCOMPLETE`, unresolved material disagreement, or an unavailable required
335
- reviewer publishes nothing and records a hold that pauses mutation for the
336
- PR.
337
- 2. The gate returns exactly one token, `escalate` or `proceed`. `escalate`
338
- records the hold and the relay receipt and publishes nothing. Only
339
- `proceed` plus no unresolved validated blocking finding permits
340
- publication.
341
- 3. Read back the remote head and base immediately before submit; stop if
342
- either differs from the reviewed candidate.
343
- 4. Submit one owner-synthesized `COMMENT` review bound to the reviewed commit
344
- through the actual GitHub commit parameter, carrying every receipt's
345
- findings and limitations, then verify the submission receipt.
346
- 5. A receipt for an unchanged head SHA is never published twice; on ambiguity,
347
- look up remote state and submit only when absent.
348
-
349
- Publication is complete when the remote receipt confirms one `COMMENT` review
350
- bound to the intended commit, or when the recorded hold names the missing
351
- input and the next owner.
308
+ ## Automation exception
309
+
310
+ For a peer PR selected under
311
+ [Automation sessions](../axstack/references/automations.md), apply the same
312
+ complete-review and exact-commit requirements, then run the Luna gate.
313
+ `escalate` opens a bound decision token, sends its message, and exits without
314
+ submitting. `proceed` permits `APPROVE` only with no validated blocker and
315
+ permits `REQUEST_CHANGES` only with at least one evidenced validated blocker.
316
+ `INCOMPLETE`, unavailable inputs, unresolved disagreement, or unknown GitHub
317
+ state submits nothing.
318
+
319
+ Immediately before `gh pr review`, re-read self's reviews at the head. If one
320
+ already exists, skip submission and record its id. Otherwise re-check head,
321
+ base, draft status, authorship, and allowlist, bind the verdict to the exact
322
+ commit parameter, and end the body with this marker line:
323
+
324
+ ```text
325
+ <!-- axstack-automation verdict head=<sha> -->
326
+ ```
327
+
328
+ After submission, read back and record the review id at the bound head. An
329
+ ambiguous result is looked up before any retry. The automation never submits a
330
+ `COMMENT` review.
@@ -22,7 +22,7 @@ The authenticated human login selects PRs. Runtime session IDs coordinate work
22
22
  only and establish neither human identity nor write, reply, or merge authority.
23
23
  When the session is the Orca driver automation, also load
24
24
  [Automation sessions](../axstack/references/automations.md): it is the owner
25
- for every PR it handles, and its gate and allowlist bound every mutation.
25
+ for every PR it handles, and its allowlist bounds every mutation.
26
26
 
27
27
  ## 1. Adopt and reconcile
28
28
 
@@ -63,9 +63,10 @@ Read-only checks and updates to the already-owned local record need no runtime
63
63
  load. When the watch needs a new owner or automated observation, first read
64
64
  [Watch runtime](references/watch-runtime.md) and then
65
65
  [Orca runtime](../axstack/references/orca-runtime.md). Reconcile before creating
66
- anything. The user lifted the native-watch hold by user decision: the 5 min driver
67
- automation is a mutating owner for the PRs it handles and the hourly watchdog
68
- stays independent and read-only. The driver is the automation session itself,
66
+ anything. The user lifted the native-watch hold by user decision: the driver
67
+ every 15 minutes dispatches and exits as a mutating owner; the watchdog is
68
+ model-free and read-only, has no gate, and records `watchdog.log`; there is no
69
+ watch deadline for automations. The driver is the automation session itself,
69
70
  with no `axstack-monitor` or `axstack-owner` role row; `axstack-monitor` stays
70
71
  an optional read-only observer that never sends. One read-only PR observation
71
72
  needs neither.
@@ -114,10 +115,10 @@ the current revision, and a recorded hold or next owner where work remains.
114
115
 
115
116
  When a new actionable event is eligible under a recorded `Notification policy`,
116
117
  the owner may use the optional [axstack-relay](../axstack-relay/SKILL.md).
117
- The monitor never sends, and `axstack-watchdog` never mutates GitHub and
118
- performs exactly one kind of send, a gate-authorized automation-health
119
- escalation recorded in `watchdog.json`; absent policy or failed relay uses the
120
- current Orca conversation and leaves every existing hold open.
118
+ The monitor never sends. The automation watchdog never mutates GitHub, has no
119
+ gate, and records occurrences and send receipts in `watchdog.log`; absent
120
+ policy or failed relay uses the current Orca conversation and leaves every
121
+ existing hold open.
121
122
 
122
123
  ## 5. State readiness precisely
123
124
 
@@ -128,15 +129,13 @@ observed state distinct from merged, and the human merges by default.
128
129
 
129
130
  ## 6. End and preserve continuity
130
131
 
131
- End early when all required PRs merge, or at cancel or the shared default 24h
132
- deadline. In every case, stop and verify all owned registrations. The deadline
133
- also stops timers for open PRs; never silently renew them.
132
+ End a standalone watch early when all required PRs merge, at cancellation, or
133
+ at its shared default 24 h deadline. There is no watch deadline for
134
+ automations. In every case, stop and verify all owned registrations.
134
135
 
135
136
  At every end condition, leave the compact state below in the private run record
136
137
  and report it in the current chat, even when work remains. Expiry grants neither
137
- silent renewal nor ownership-transfer authority. Under an automation, expiry
138
- marks the PR `expired` in the record and sidecar; an `expired` PR is never
139
- silently re-adopted and is skipped until the user re-arms it.
138
+ silent renewal nor ownership-transfer authority.
140
139
 
141
140
  Transfer ownership through the runtime-owned Orca handoff route only when the
142
141
  user explicitly requests it. Before transfer, follow the lifecycle-owned
@@ -36,9 +36,11 @@ exact new revision and base, all six angles, applicable acceptance, the reply
36
36
  body identities, and every affected boundary, with no unresolved material
37
37
  finding or urgent hold. Under an automation the escalation gate of
38
38
  [Automation sessions](../../axstack/references/automations.md) also runs on
39
- the local SHA: publication additionally requires the gate to return `proceed`
40
- with no unresolved validated blocking finding, and a push before the gate
41
- settles is forbidden.
39
+ the local SHA. `escalate` creates a token, pins the candidate at
40
+ `refs/axstack/decisions/<token>`, opens the decision token, sends its message,
41
+ and exits instead of pushing. `proceed` permits publication only with no
42
+ unresolved validated blocking finding, and a push before the gate settles is
43
+ forbidden.
42
44
 
43
45
  ## 3. Revalidate immediately before publication
44
46
 
@@ -4,18 +4,16 @@ Read this before starting, resuming, or stopping automated PR observation.
4
4
 
5
5
  ## Accepted policy
6
6
 
7
- The PR owner remains accountable throughout one shared default 24-hour window.
8
- `axstack-monitor` and `axstack-watchdog` are independent, read-only roles, not
9
- authors, reviewers, repliers, or owners.
7
+ The PR owner remains accountable throughout a standalone watch's default
8
+ 24-hour window. `axstack-monitor` and `axstack-watchdog` are independent,
9
+ read-only roles, not authors, reviewers, repliers, or owners.
10
10
 
11
11
  - **Monitor:** `axstack-monitor` is an optional read-only observer that reads
12
- GitHub, all PR feedback, and latest checks every five minutes, persists event
12
+ GitHub, all PR feedback, and latest checks on its registered cadence, persists event
13
13
  IDs, wakes the owner only for a new actionable event, and never sends.
14
- - **Watchdog:** `axstack-watchdog` reads only automation health, handshake
15
- state, and snapshot freshness hourly and never mutates GitHub; it may perform
16
- exactly one kind of send, a gate-authorized automation-health escalation
17
- recorded in `watchdog.json`, and otherwise reports a verified health failure
18
- to the owner.
14
+ - **Watchdog:** for the PR automations, it is a model-free hourly shell precheck
15
+ that never mutates GitHub, has no gate, and records each tick in
16
+ `watchdog.log`.
19
17
 
20
18
  Healthy observations are snapshot-only and update quietly; they wake neither owner nor
21
19
  driver. Both roles deduplicate event IDs. Uncertain delivery is reconciled
@@ -32,25 +30,21 @@ permission pinning are unsupported, and its schedule parser cannot preserve
32
30
  the accepted bounded expiry by itself. Requested role values or a post-launch
33
31
  self-report are not effective launch evidence.
34
32
 
35
- The user lifted the native-watch hold by user decision on 2026-09-16. The accepted
36
- contract now has a new shape: the driver automation is a mutating owner for the
37
- PRs it handles, not an independent read-only monitor, and the watchdog keeps
38
- the independent read-only health contract. The driver is the automation
39
- session itself, with no `axstack-monitor` or `axstack-owner` role row
40
- materialized for it. The driver records its own model
41
- identity on every tick and the watchdog compares it with the expected model; a
42
- mismatch is a safety hold, never a silent substitution. The bounded expiry is
43
- enforced by the run record's watch deadline, not by the schedule parser. Still
33
+ The user lifted the native-watch hold by user decision on 2026-09-16. The
34
+ driver every 15 minutes dispatches and exits as the mutating owner, and the
35
+ watchdog is model-free and read-only, has no gate, and records `watchdog.log`;
36
+ there is no watch deadline for automations. The driver is the automation
37
+ session itself, with no `axstack-monitor` or `axstack-owner` role row. Still
44
38
  introduce no custom scheduler or polling loop and use no legacy runtime
45
39
  fallback. The session-level contract lives in
46
40
  [Automation sessions](../../axstack/references/automations.md).
47
41
 
48
42
  ## Preserve the contract under automation
49
43
 
50
- An automation session preserves the roles, five-minute/hourly cadences, quiet
51
- healthy behavior, deduplication, handshake, watched scope, wake owner, and
52
- shared expiry. Test active expiry, missed final ticks, restart, duplicate
53
- ticks, cancellation, session-reuse fallback, and final cleanup before enabling.
44
+ An automation session preserves its 15-minute driver and hourly model-free
45
+ watchdog cadences, quiet healthy behavior, deduplication, handshake, watched
46
+ scope, and wake owner. Test restart, duplicate ticks, cancellation,
47
+ session-reuse fallback, and final cleanup before enabling.
54
48
  A firing timestamp proves neither delivery nor work advancement. An unrequested
55
49
  fallback session reconciles ownership and never becomes owner silently.
56
50