axstack 0.49.0 → 0.50.0

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.
Files changed (43) hide show
  1. package/README.md +5 -7
  2. package/docs/concepts.md +11 -51
  3. package/docs/host-operations.md +24 -99
  4. package/docs/installation.md +27 -52
  5. package/docs/workflows.md +48 -35
  6. package/package.json +1 -1
  7. package/profiles/presets/claude-only.json +0 -37
  8. package/profiles/presets/codex-only.json +0 -36
  9. package/profiles/presets/mixed.json +4 -41
  10. package/skills/axstack/references/automations.md +28 -2
  11. package/skills/axstack/references/autopilot.md +7 -5
  12. package/skills/axstack/references/candidate-publication.md +1 -0
  13. package/skills/axstack/references/contracts.md +56 -7
  14. package/skills/axstack/references/lifecycle.md +20 -5
  15. package/skills/axstack/references/pr-shape.md +15 -0
  16. package/skills/axstack/references/pr-triage-nightly.md +14 -2
  17. package/skills/axstack/references/review-manager-prompt.md +18 -11
  18. package/skills/axstack/references/role-roster.md +4 -9
  19. package/skills/axstack/references/routing.md +3 -7
  20. package/skills/axstack/references/t3-runtime.md +122 -103
  21. package/skills/axstack/references/test-audit-weekly.md +14 -2
  22. package/skills/axstack/references/workspace-hygiene.md +14 -2
  23. package/skills/axstack/scripts/dispatch-plan.js +10 -27
  24. package/skills/axstack/scripts/resolve-models.js +9 -18
  25. package/skills/axstack-brainstorm/references/arena.md +2 -2
  26. package/skills/axstack-cleanup/SKILL.md +6 -3
  27. package/skills/axstack-implement/SKILL.md +5 -4
  28. package/skills/axstack-research/SKILL.md +3 -5
  29. package/skills/axstack-review/SKILL.md +7 -3
  30. package/skills/axstack-scout/SKILL.md +2 -12
  31. package/skills/axstack-watch/SKILL.md +43 -8
  32. package/skills/axstack-watch/references/escalation.md +12 -5
  33. package/skills/axstack-watch/references/proven-verification.md +1 -1
  34. package/skills/axstack-watch/references/readiness.md +13 -2
  35. package/skills/axstack-watch/references/repair-publication.md +1 -1
  36. package/skills/axstack-watch/references/watch-runtime.md +46 -33
  37. package/src/instructions.js +4 -3
  38. package/src/roles.js +3 -6
  39. package/skills/axstack/scripts/account-usage.js +0 -79
  40. package/skills/axstack/scripts/pick-instance.js +0 -57
  41. package/skills/axstack/scripts/sync-default.js +0 -191
  42. package/skills/axstack/systemd/axstack-default-sync.service +0 -8
  43. package/skills/axstack/systemd/axstack-default-sync.timer +0 -11
@@ -118,15 +118,6 @@
118
118
  "notes": "Sonnet high research web reader: gathers primary-source facts efficiently. T3 resolves Claude classes from saved capabilities; a Claude rejection holds.",
119
119
  "modelClass": "sonnet"
120
120
  },
121
- {
122
- "id": "axstack-research-web-google",
123
- "name": "Axstack research web (Google unavailable)",
124
- "provider": "claude",
125
- "model": null,
126
- "modeId": "bypassPermissions",
127
- "thinkingOptionId": "high",
128
- "notes": "Intentional single-provider absence: Google-Search-grounded web research via Gemini/Antigravity is unavailable in claude-only. The explicit null holds this route without provider substitution."
129
- },
130
121
  {
131
122
  "id": "axstack-research-x",
132
123
  "name": "Axstack research X (unavailable)",
@@ -182,15 +173,6 @@
182
173
  "thinkingOptionId": "xhigh",
183
174
  "notes": "Intentional single-provider absence: Luna Scout seat is unavailable in claude-only."
184
175
  },
185
- {
186
- "id": "axstack-explore-codebase-flash",
187
- "name": "Axstack codebase explorer Flash (unavailable)",
188
- "provider": "claude",
189
- "model": null,
190
- "modeId": "bypassPermissions",
191
- "thinkingOptionId": "medium",
192
- "notes": "Intentional single-provider absence: Flash Scout seat is unavailable in claude-only."
193
- },
194
176
  {
195
177
  "id": "axstack-explore-execution",
196
178
  "name": "Axstack execution explorer",
@@ -209,16 +191,6 @@
209
191
  "thinkingOptionId": "high",
210
192
  "notes": "Intentional single-provider absence: Sol pair seat axstack-explore-execution-sol is unavailable in claude-only. The explicit null records the absent pair without substitution; the Sonnet seat proceeds alone."
211
193
  },
212
- {
213
- "id": "axstack-monitor",
214
- "name": "Axstack monitor",
215
- "provider": "claude",
216
- "modeId": "bypassPermissions",
217
- "thinkingOptionId": "high",
218
- "notes": "Optional independent read-only Haiku 5.5 high observer for a standalone PR watch. Reads GitHub, feedback, and checks, persists event IDs, and wakes the owner only for a new actionable event. Never sends, authors, reviews, replies, or acts as either reusable PR manager. Healthy snapshots stay quiet. Chat-run mode: one same-host native read-only observer per Run; fresh finite passes report precise deltas internally to the original Run/driver and may disable/read back only their own automation at verified stop. No repair, dispatch, public notification, or replacement coordinator. Effective scheduled model/effort and wake require live proof. T3 uses the exact claude-haiku-5-5 pin from saved capabilities; a Claude rejection holds. Missing model or high effort holds without substitution.",
219
- "modelClass": "haiku",
220
- "model": "claude-haiku-5-5"
221
- },
222
194
  {
223
195
  "id": "axstack-auditor",
224
196
  "name": "Axstack auditor",
@@ -308,15 +280,6 @@
308
280
  "modeId": "bypassPermissions",
309
281
  "thinkingOptionId": "high",
310
282
  "notes": "Intentional single-provider absence in the claude-only preset; Grok candidate unavailable. Arena holds without substitution."
311
- },
312
- {
313
- "id": "axstack-arena-candidate-antigravity",
314
- "name": "Axstack arena candidate Antigravity (unavailable)",
315
- "provider": "claude",
316
- "model": null,
317
- "modeId": "bypassPermissions",
318
- "thinkingOptionId": "high",
319
- "notes": "Intentional single-provider absence in the claude-only preset; Antigravity candidate unavailable. Arena holds without substitution."
320
283
  }
321
284
  ]
322
285
  }
@@ -118,15 +118,6 @@
118
118
  "notes": "Research web reader: gathers primary-source facts efficiently. Resolve the class from saved T3 capabilities at run start; rejection and unavailable settings hold without substitution.",
119
119
  "modelClass": "sol"
120
120
  },
121
- {
122
- "id": "axstack-research-web-google",
123
- "name": "Axstack research web (Google unavailable)",
124
- "provider": "codex",
125
- "model": null,
126
- "modeId": "full-access",
127
- "thinkingOptionId": "high",
128
- "notes": "Intentional single-provider absence: Google-Search-grounded web research via Gemini/Antigravity is unavailable in codex-only. The explicit null holds this route without provider substitution."
129
- },
130
121
  {
131
122
  "id": "axstack-research-x",
132
123
  "name": "Axstack research X (unavailable)",
@@ -181,15 +172,6 @@
181
172
  "notes": "Independent read-only Luna Scout facet explorer. Searches the whole repository on the same brief without cross-reading; reports evidence for driver reconciliation. Unavailable model or effort holds without substitution.",
182
173
  "modelClass": "luna"
183
174
  },
184
- {
185
- "id": "axstack-explore-codebase-flash",
186
- "name": "Axstack codebase explorer Flash (unavailable)",
187
- "provider": "codex",
188
- "model": null,
189
- "modeId": "full-access",
190
- "thinkingOptionId": "medium",
191
- "notes": "Intentional single-provider absence: Flash Scout seat is unavailable in codex-only."
192
- },
193
175
  {
194
176
  "id": "axstack-explore-execution",
195
177
  "name": "Axstack execution explorer",
@@ -208,15 +190,6 @@
208
190
  "notes": "Independent Sol high execution explorer: runs authorized bounded runtime checks on the same brief without cross-reading. Reports findings for driver reconciliation.",
209
191
  "modelClass": "sol"
210
192
  },
211
- {
212
- "id": "axstack-monitor",
213
- "name": "Axstack monitor",
214
- "provider": "codex",
215
- "modeId": "full-access",
216
- "thinkingOptionId": "low",
217
- "notes": "Optional independent read-only observer for a standalone PR watch. Reads GitHub, feedback, and checks, persists event IDs, and wakes the owner only for a new actionable event. Never sends, authors, reviews, replies, or acts as either reusable PR manager. Healthy snapshots stay quiet. Chat-run mode: one same-host native read-only observer per Run; fresh finite passes report precise deltas internally to the original Run/driver and may disable/read back only their own automation at verified stop. No repair, dispatch, public notification, or replacement coordinator. Effective scheduled model/effort and wake require live proof.",
218
- "modelClass": "sol"
219
- },
220
193
  {
221
194
  "id": "axstack-auditor",
222
195
  "name": "Axstack auditor",
@@ -306,15 +279,6 @@
306
279
  "modeId": "full-access",
307
280
  "thinkingOptionId": "high",
308
281
  "notes": "Intentional single-provider absence in the codex-only preset; Grok candidate unavailable. Arena holds without substitution."
309
- },
310
- {
311
- "id": "axstack-arena-candidate-antigravity",
312
- "name": "Axstack arena candidate Antigravity (unavailable)",
313
- "provider": "codex",
314
- "model": null,
315
- "modeId": "full-access",
316
- "thinkingOptionId": "high",
317
- "notes": "Intentional single-provider absence in the codex-only preset; Antigravity candidate unavailable. Arena holds without substitution."
318
282
  }
319
283
  ]
320
284
  }
@@ -76,11 +76,11 @@
76
76
  {
77
77
  "id": "axstack-checker",
78
78
  "name": "Axstack tracker checker",
79
- "provider": "antigravity",
80
- "model": null,
81
- "modeId": "full-access",
79
+ "provider": "claude",
80
+ "modeId": "bypassPermissions",
82
81
  "thinkingOptionId": "low",
83
- "notes": "Report-only discrepancy checker for the selected external tracker (Linear or GitHub Issues). Never mutates the tracker; the driver independently verifies evidence before applying updates. Cheap report-only seat on Gemini Flash; dispatch through the T3 Antigravity ACP provider."
82
+ "notes": "Report-only discrepancy checker for the selected external tracker (Linear or GitHub Issues). Never mutates the tracker; the driver independently verifies evidence before applying updates. Sonnet low tracker checker. T3 resolves Claude classes from saved capabilities; a Claude rejection holds.",
83
+ "modelClass": "sonnet"
84
84
  },
85
85
  {
86
86
  "id": "axstack-research-requirements",
@@ -118,15 +118,6 @@
118
118
  "notes": "Sonnet high research web reader: gathers primary-source facts efficiently. T3 resolves Claude classes from saved capabilities; a Claude rejection holds.",
119
119
  "modelClass": "sonnet"
120
120
  },
121
- {
122
- "id": "axstack-research-web-google",
123
- "name": "Axstack research web (Google)",
124
- "provider": "antigravity",
125
- "model": null,
126
- "modeId": "full-access",
127
- "thinkingOptionId": "high",
128
- "notes": "Google-Search-grounded web research branch on Gemini via the T3 Antigravity ACP provider; resolve the model from saved T3 capabilities; cites URL + access date per claim and re-opens sources because the provider's search citation format is undocumented; report-only."
129
- },
130
121
  {
131
122
  "id": "axstack-research-x",
132
123
  "name": "Axstack research X",
@@ -183,15 +174,6 @@
183
174
  "notes": "Independent read-only Luna Scout facet explorer. Searches the whole repository on the same brief without cross-reading; reports evidence for driver reconciliation. Unavailable model or effort holds without substitution.",
184
175
  "modelClass": "luna"
185
176
  },
186
- {
187
- "id": "axstack-explore-codebase-flash",
188
- "name": "Axstack codebase explorer Flash",
189
- "provider": "antigravity",
190
- "model": "gemini-3.8-flash-medium",
191
- "modeId": "full-access",
192
- "thinkingOptionId": "medium",
193
- "notes": "Optional read-only Scout breadth seat: searches the whole repository for missed boundaries and counterexamples. Reports evidence for driver reconciliation without cross-reading."
194
- },
195
177
  {
196
178
  "id": "axstack-explore-execution",
197
179
  "name": "Axstack execution explorer",
@@ -210,16 +192,6 @@
210
192
  "notes": "Independent Sol high execution explorer: runs authorized bounded runtime checks on the same brief without cross-reading. Reports findings for driver reconciliation.",
211
193
  "modelClass": "sol"
212
194
  },
213
- {
214
- "id": "axstack-monitor",
215
- "name": "Axstack monitor",
216
- "provider": "claude",
217
- "modeId": "bypassPermissions",
218
- "thinkingOptionId": "high",
219
- "notes": "Optional independent read-only Haiku 5.5 high observer for a standalone PR watch. Reads GitHub, feedback, and checks, persists event IDs, and wakes the owner only for a new actionable event. Never sends, authors, reviews, replies, or acts as either reusable PR manager. Healthy snapshots stay quiet. Chat-run mode: one same-host native read-only observer per Run; fresh finite passes report precise deltas internally to the original Run/driver and may disable/read back only their own automation at verified stop. No repair, dispatch, public notification, or replacement coordinator. Effective scheduled model/effort and wake require live proof. T3 uses the exact claude-haiku-5-5 pin from saved capabilities; a Claude rejection holds. Missing model or high effort holds without substitution.",
220
- "modelClass": "haiku",
221
- "model": "claude-haiku-5-5"
222
- },
223
195
  {
224
196
  "id": "axstack-auditor",
225
197
  "name": "Axstack auditor",
@@ -310,15 +282,6 @@
310
282
  "modeId": "full-access",
311
283
  "thinkingOptionId": "high",
312
284
  "notes": "Independent Grok Rung 2 design candidate. Use the T3 Grok provider and resolve the model from saved capabilities. Receives the same brief without cross-reading; returns design, rationale, and rejected alternatives."
313
- },
314
- {
315
- "id": "axstack-arena-candidate-antigravity",
316
- "name": "Axstack arena candidate Antigravity",
317
- "provider": "antigravity",
318
- "model": null,
319
- "modeId": "full-access",
320
- "thinkingOptionId": "high",
321
- "notes": "Independent Antigravity Rung 2 design candidate. Use the T3 Antigravity ACP provider and resolve the model from saved capabilities. Receives the same brief without cross-reading; returns design, rationale, and rejected alternatives."
322
285
  }
323
286
  ]
324
287
  }
@@ -8,7 +8,7 @@ For optional weekly test audits, use the separate packaged
8
8
  The native canary below is also required before weekly activation.
9
9
 
10
10
  At every scheduled pass start, follow [Provider bindings](t3-runtime.md#preflight-and-binding)
11
- for account selection and schedule ownership.
11
+ for provider binding.
12
12
 
13
13
  For nightly read-only PR reports, use the separate packaged
14
14
  [Nightly PR-triage prompt](pr-triage-nightly.md).
@@ -45,7 +45,8 @@ beside it. A no-change full pass appends at most one history line.
45
45
  Follow the quiet check in the packaged [review-manager prompt](review-manager-prompt.md).
46
46
  The full pass records in Watermarks `Quiet gate:` as the sorted list and
47
47
  `Last full pass:` as UTC only as owner-of-record, then reads back the save.
48
- The sections below govern full passes; a quiet exit bypasses their teardown.
48
+ The sections below govern full passes; a quiet exit bypasses their teardown
49
+ except the guarded pass-end self-settle.
49
50
 
50
51
  Configure the lane thread via `t3_thread_configure` with the `axstack-owner`
51
52
  binding and verify its read-back. Then `schedule_task` uses the packaged prompt,
@@ -374,6 +375,31 @@ an action. There is no programmatic decision interpreter.
374
375
 
375
376
  ## Finite-session teardown
376
377
 
378
+ At pass end, an unbound pass calls `t3_thread_organize` with `action: settle` on its
379
+ own thread only, only when it owns no PR watch, has zero unsettled descendants,
380
+ has no pending receipt and is not held, wedged or a stalled owner.
381
+ Self-settle is the one exception to terminal-before-settle: T3 returns
382
+ `settlesWhenTurnEnds:true` and the next pass verifies `settled: true`.
383
+ This deferred metadata request takes effect after the current turn ends.
384
+ The next pass uses `t3_thread_read` on the recorded prior pass threadId before replacing
385
+ its identity record, and verifies `settled: true`.
386
+ Only prior passes that no guard keeps unsettled enter unresolved recovery.
387
+ A guard includes a hold or flag, an owned watch, unsettled descendants, a pending
388
+ receipt, a wedged pass or stalled owner, and every existing pass-start protection.
389
+ If a guard keeps a prior pass unsettled, drop it from the unresolved list and retain
390
+ its existing hold or flagged-threadId record (or watch/descendant ownership record).
391
+ Held or flagged prior passes never force a full pass or failure report by their unsettled state alone.
392
+ If the prior thread is unsettled and eligible, settle it under the existing pass-start guards
393
+ below and read back `settled: true`.
394
+ For a failed request or next-pass verification, the next pass owns unresolved
395
+ recovery and records a hold or report with the exact threadId and resume action.
396
+ If identity, guards or readback are unavailable, preserve the thread and report
397
+ that gap instead of settling it; the next eligible pass retries guarded verification.
398
+ Keep unresolved prior threadIds in the same record until verified settled.
399
+ Never guess thread identity from a title.
400
+ The sole continuity-write exception records own pass threadId before duplicate
401
+ classification and on quiet exits; all other shared writes retain their existing guards.
402
+
377
403
  Decisions outliving a finite manager pass retain their receipt and hold in durable
378
404
  continuity, with the flagged thread or GitHub as the action route.
379
405
 
@@ -10,6 +10,7 @@ not a mode change.
10
10
  ## Advance and hold
11
11
 
12
12
  Follow [Advised holds](contracts.md#advised-holds) for eligible user-decision holds.
13
+ For parked holds, follow [Parked user-reply holds](contracts.md#parked-user-reply-holds).
13
14
 
14
15
  Advance only after the finishing phase returns its completed identity (a
15
16
  small-change intent, approved spec, matching ticket map, merge-ready or merged
@@ -43,7 +44,7 @@ The driver records each verified `Autopilot:` transition in the private run
43
44
  record, which remains authoritative.
44
45
  Awaiting human spec approval records `Autopilot: paused (spec approval; resume:
45
46
  human approval)` as a decision hold raised in the T3 driver thread; end the turn
46
- parked on the decision.
47
+ waiting on the decision.
47
48
 
48
49
  ## Reversible local repair
49
50
 
@@ -92,7 +93,7 @@ Never require a manual `axstack-watch` invocation.
92
93
  The driver remains the single owner and sole run-record writer.
93
94
  Never create a per-PR session or an ownership hand-off.
94
95
  Read the [T3 runtime boundary](t3-runtime.md) and use its bound
95
- `schedule_task` wake (`everyMs:1800000`), recording the scheduledTaskId.
96
+ `schedule_task` wake (`everyMs:3600000`), recording the scheduledTaskId.
96
97
  Follow [Native PR links and watches](t3-runtime.md#native-pr-links-and-watches)
97
98
  alongside that bound schedule.
98
99
  Apply [Chat-run watch runtime](../../axstack-watch/references/watch-runtime.md#chat-run-watch)
@@ -109,7 +110,8 @@ End the chat-run watch only when every watched PR is merged or closed,
109
110
  launched work is settled, and the run's release step is settled or not applicable,
110
111
  or the user cancels.
111
112
  A required PR closed without merging is incomplete scope; it does not make the run release-eligible.
112
- Keep its decision hold and wake until the user resolves scope or cancels.
113
+ Keep its decision hold until the user resolves scope or cancels.
114
+ For a required PR closed without merging, apply parking eligibility.
113
115
  The chat-run watch never expires or waits for re-authorization while PRs remain open.
114
116
  Follow [Chat-run watch runtime](../../axstack-watch/references/watch-runtime.md#chat-run-watch)
115
117
  for quiet cadence and native schedule re-arming.
@@ -170,10 +172,10 @@ Never narrow standing merge delegation without a user instruction.
170
172
  Explicit user restrictions, including `Auto-merge: off`, chat holds, and user
171
173
  instructions, always win.
172
174
 
173
- Follow [Provider bindings](t3-runtime.md#preflight-and-binding) for driver account re-selection on start, resume and run-watch wakes.
175
+ Follow [Provider bindings](t3-runtime.md#preflight-and-binding) on start, resume and run-watch wakes.
174
176
 
175
177
  Follow [Route each wake](../../axstack-watch/SKILL.md#4-route-each-wake).
176
178
  Raise decision holds, including spec and npm stage approval, and serious-risk
177
- holds in the T3 driver thread; end the turn parked on the decision.
179
+ holds in the T3 driver thread; end the turn waiting on the decision.
178
180
  Revalidate the current head and base on a user reply; it clears only its bound cause.
179
181
  Healthy ticks stay quiet.
@@ -13,6 +13,7 @@ folder: red/green logs exist, and counts, SHAs, and paths match. Resolve
13
13
  Follow [PR chains](pr-chain.md) for recorded membership and base-bound evidence.
14
14
  For ordinary PRs, use `git push origin HEAD:refs/heads/<owned branch>` and
15
15
  `gh pr create` or `gh pr edit` with the actual parent or integration base.
16
+ Follow [PR body](pr-shape.md#pr-body) for the title, description and creation fallback.
16
17
  Never use routine force push for ordinary PRs. For legacy native `gh stack`,
17
18
  prefer a fast-forward push of existing commits, preserving unrelated entries.
18
19
  Before a history rewrite, confirm expected-old remote SHA and use a narrowly
@@ -41,16 +41,10 @@ the revised scope and plan.
41
41
 
42
42
  Validate the configured provider and model at actual launch. If it is
43
43
  unavailable or exhausted, pause affected work, record the gap, and ask the
44
- user. Only same-provider, same-model account selection among instances of one
45
- driver may use headroom under [Provider bindings](t3-runtime.md#preflight-and-binding).
46
- An exhausted account with no eligible sibling still holds; dispatched roles never fail over mid-thread.
47
- Follow [Provider bindings](t3-runtime.md#preflight-and-binding) for driver account re-selection at turn boundaries.
44
+ user. Follow [Provider bindings](t3-runtime.md#preflight-and-binding).
48
45
  Never infer any other route from quota state or subscription entitlement. Every
49
46
  substitution requires the user's decision: configured alternatives are not
50
47
  defaults. Rejection, timeout, quota and auth failures hold affected work.
51
- Substitution here means changing provider or model, excluding that account selection.
52
- Exception: opt-in default sync can change only the New-chat default within the user-configured pool.
53
- Running threads, dispatched roles, schedules and roles.json keep existing rules.
54
48
  Read the [T3 runtime boundary](t3-runtime.md) before dispatch, receipt consumption
55
49
  or recovery; resolve models from the saved capabilities snapshot and verify
56
50
  requested and effective settings separately.
@@ -121,6 +115,7 @@ Never advise spec approval, npm stage approval or collaborator approval.
121
115
  Never advise access or credentials.
122
116
  Never advise forge merges by the user.
123
117
  Never advise `Auto-merge: off`.
118
+ Never advise risky-path holds.
124
119
  Never advise work-promotion, deploying-base or unknown-base report cards.
125
120
  Never advise the report-only comment-rating card.
126
121
  Never advise model unavailability or substitution.
@@ -209,6 +204,60 @@ Serious-risk holds include security, downtime, data loss and major design.
209
204
  Serious-risk advice follows as an addendum with no second alert.
210
205
  Peer serious-risk holds stay never advised under the peer-review exclusion above.
211
206
 
207
+ ### Parked user-reply holds
208
+
209
+ When late advice completes and the hold becomes user-only, re-evaluate parking
210
+ eligibility and update the existing text card under the same hold key.
211
+
212
+ A parked hold waits only on a user reply in chat.
213
+ A parked hold has no unsettled worker, pending adviser seat or pending receipt.
214
+ A parked run has no forge-resolved hold and no other member PR needing watch events (CI, review, approval or repair).
215
+ Never park holds resolved on the forge, including user merge, npm stage approval
216
+ and human review.
217
+ Scoped and forge-resolved holds use a text card only, and watches and the
218
+ 60-minute backstop stay.
219
+
220
+ For parking:
221
+
222
+ 1. Call `unwatch_pull_request` for each watched member.
223
+ 2. Post or update the text card saying "answer the prompt".
224
+ 3. Call `update_scheduled_task` `enabled:false` and read it back.
225
+ 4. Cancel queued copies of the run-watch prompt.
226
+ 5. Use the harness question tool.
227
+
228
+ Include the PR URL, cause, head and base in the question, with the recommended
229
+ option first and numbered replies.
230
+ If disable or its read-back fails, reconcile the exact schedule ID.
231
+ For either failed-disable branch, update the existing text card by posting a
232
+ corrected version under the same hold key without a new alert.
233
+ When verified enabled, roll back to the unparked user-decision state, re-arm
234
+ watches using the [native-watch recovery procedure](t3-runtime.md#native-pr-links-and-watches)
235
+ and update the existing text card to remove "answer the prompt" and omit the question.
236
+ After successful native re-arm, set cadence to 60 min.
237
+ If native re-arm fails or is rate-limited, use the 5-minute recovery cadence
238
+ under the [native-watch recovery procedure](t3-runtime.md#native-pr-links-and-watches).
239
+ When the state remains unknown, update the existing text card to remove
240
+ "answer the prompt", mark it `automatic recovery unproven`, hold UNKNOWN and
241
+ omit the question.
242
+ Never infer an enabled backstop from a failed read.
243
+
244
+ On an answer from the question tool or chat:
245
+
246
+ 1. Reconcile current PR and run state.
247
+ 2. Bind the answer to the hold key, head and base.
248
+ 3. Re-enable the schedule.
249
+ 4. Re-arm watches using the [native-watch recovery procedure](t3-runtime.md#native-pr-links-and-watches).
250
+ 5. Continue.
251
+
252
+ Stale answers clear nothing.
253
+ While parked there is no wake source and the text card is the lasting signal.
254
+ On the user's next message, if the hold is still open and
255
+ `t3_pending_request_list` shows no pending request, re-ask once under the same
256
+ hold key.
257
+ Re-ask without a new alert.
258
+ If the question tool is unavailable, follow the same parking order, omit the
259
+ question step and record `question tool unavailable`.
260
+
212
261
  ## Serious risk
213
262
 
214
263
  Raise credible serious security, downtime, data-loss, or major-design risk
@@ -18,7 +18,7 @@ binding state and receipts to exact revisions.
18
18
  pass. Peer follow-up uses one reviewer under [Peer mode](../../axstack-review/SKILL.md#peer-mode-colleague-pr);
19
19
  authored = one eligible role from author provenance. Each uses a
20
20
  separate driver-made detached checkout and private per-attempt evidence folder. Owner and author never review.
21
- - Automation review manager and monitors: see
21
+ - Automation review manager: see
22
22
  [Review automation health](#review-automation-health).
23
23
  - Auditor (`axstack-auditor`): report-only; never edits, merges, activates, or
24
24
  audits itself.
@@ -29,8 +29,8 @@ theme/size; queue dependencies under [PR chains](pr-chain.md).
29
29
 
30
30
  ## Ownership
31
31
 
32
- The PR owner is accountable for candidate, fixes, evidence, monitoring; a
33
- chat-run observer reports only to its driver. Peer code stays read-only.
32
+ The PR owner is accountable for candidate, fixes, evidence, monitoring.
33
+ Peer code stays read-only.
34
34
  Missing or idle sessions never transfer ownership.
35
35
  Owned work enters review via the revision-bound
36
36
  [candidate-publication boundary](candidate-publication.md).
@@ -86,12 +86,27 @@ Follow [T3 runtime](t3-runtime.md) for native completion, questions, launch
86
86
  recovery and run-watch waits. Delegated notifications wake the driver; a launched
87
87
  writer sends its marker with `t3_thread_send` using `mode: queue` to the recorded driver thread.
88
88
  Delegated completion requires persisted `task_status` before `t3_thread_read`, terminal `completed`, `result_available`, `hasPendingChildRuns:false`, and final `AXSTACK-DONE`.
89
- Writer completion requires `AXSTACK-DONE` plus terminal `t3_thread_wait` on the recorded run and candidate checks: non-empty diff, clean tree, and named red/green logs.
89
+ Delegated author completion requires delegated terminal checks plus candidate checks: non-empty diff, clean tree and named red/green logs.
90
+ A delegated repair uses a stable clientRequestId with `t3_thread_send(childThreadId, mode:queue, clientRequestId)` to the same author in the same worktree and branch, records the returned taskId and verifies the existing candidate head.
91
+ Repairs never repeat fresh checkout step 1.
92
+ Launched fallback writer completion requires `AXSTACK-DONE` plus terminal `t3_thread_wait` on the recorded run and candidate checks: non-empty diff, clean tree, and named red/green logs.
90
93
  Completion must match the current attempt key and candidate SHA; an older attempt never completes a newer one.
91
94
  Process the whole delivery before advancement, validating sender, scope,
92
95
  authority, revisions and artifacts. Deduplicate by native task/thread/run identity.
93
96
  A question marker stays incomplete; failure, interruption, permission prompts
94
97
  and refusals hold with preserved evidence. Receipt messages alone are progress.
98
+
99
+ For a delegated child, detect questions with `t3_pending_request_list(childThreadId)`.
100
+ Never rely on `hasPendingQuestion` alone.
101
+ Codex `request_user_input_async` does not set it.
102
+ Use `t3_pending_request_read`, then confirm the request is still pending with
103
+ `t3_pending_request_list(childThreadId)`, then answer once within existing authority
104
+ using `t3_pending_request_respond`; a second ask holds.
105
+ Independent review rounds require fresh `delegate_task` calls.
106
+ Only author continuation and an answer to a child's own question use the same child.
107
+ Providers without a question tool (grok) and launched writers keep
108
+ the `AXSTACK-QUESTION` marker route.
109
+
95
110
  Healthy unchanged passes are silent.
96
111
  An explicitly invoked phase dispatches its configured roles through T3 and
97
112
  closes with the lifecycle close-out; in-chat execution covers only ordinary
@@ -152,7 +167,7 @@ nothing without tested independent review.
152
167
 
153
168
  Close-out requires the [close-out acceptance table](run-record.md#close-out-acceptance).
154
169
 
155
- PRs merge by forge state; close out: (1) settle every T3 worker run and archive eligible threads. Settle each worker thread with `t3_thread_organize` and read back `settled: true`, because a finished task does not count; (2) compact record with counts and denominators—user
170
+ PRs merge by forge state; close out: (1) settle every T3 worker run and archive eligible threads. Settle each worker thread with `t3_thread_organize` only if needed and read back `settled: true`, because a finished task does not count. For merged or closed PR authors, follow the [native/manual read-first path](t3-runtime.md#native-pr-links-and-watches); (2) compact record with counts and denominators—user
156
171
  interventions/deviations from plan/repairs; (3) `axstack-auditor`: settle
157
172
  non-zero/requested, else `counts zero`. A base auditor preflight rejection
158
173
  (no delegated task started) records `auditor: UNKNOWN (unlaunchable)` with the
@@ -43,6 +43,21 @@ Smaller cohesive PRs are encouraged; no padding.
43
43
 
44
44
  ## PR body
45
45
 
46
+ Open every own PR description with the problem in plain words from the user's
47
+ request, then the fix.
48
+ Do not lead with an implementation inventory.
49
+ Use a title that explains why the change matters.
50
+ For repository title conventions, check recently merged PRs.
51
+
52
+ End the description with `Created with <model> in <harness>`.
53
+ Include the author and subagent models that wrote code.
54
+ Use the model name the harness reports.
55
+ If the model is unknown, name the harness without guessing a model.
56
+
57
+ Open real PRs, never drafts, so review bots run.
58
+ If `gh pr create` fails because the GraphQL rate limit is exhausted, use REST:
59
+ `gh api repos/<owner>/<repo>/pulls -f title=... -f head=... -f base=... -F body=@<file>`.
60
+
46
61
  Every own PR description must contain exactly one `Revert` line.
47
62
  Follow [Revert line](candidate-publication.md#revert-line) for its format and classification.
48
63
 
@@ -1,8 +1,8 @@
1
1
  # Nightly PR-triage prompt
2
2
 
3
3
  You are a fresh read-only nightly PR-triage pass in your own T3 thread.
4
- Read-only applies to the forge, and own schedule replacement follows [Provider bindings](t3-runtime.md#preflight-and-binding).
5
- At pass start, follow [Provider bindings](t3-runtime.md#preflight-and-binding) for your own account and schedule binding.
4
+ Read-only applies to the forge.
5
+ At pass start, follow [Provider bindings](t3-runtime.md#preflight-and-binding) for provider binding.
6
6
  Use [Nightly PR-triage setup](automations.md#nightly-pr-triage-setup) for activation.
7
7
  Read the durable activation record for the repository set.
8
8
  Resolve the user with `gh api user --jq .login`.
@@ -20,3 +20,15 @@ Never declare a PR merge-ready.
20
20
 
21
21
  Never merge, post comments, change labels, push, send user messages, dispatch
22
22
  work, or launch threads.
23
+
24
+ At pass start, read the recorded prior pass thread with `t3_thread_read` and
25
+ apply [Finite-session teardown](automations.md#finite-session-teardown)'s guarded
26
+ verification or hold/report before replacing its identity.
27
+ Record own pass threadId in the existing activation record and read back the save.
28
+
29
+ At pass end, an unbound pass calls `t3_thread_organize` with `action: settle` on its
30
+ own thread only, only when it owns no PR watch, has zero unsettled descendants,
31
+ has no pending receipt and is not held, wedged or a stalled owner.
32
+ Follow [Finite-session teardown](automations.md#finite-session-teardown) for
33
+ deferred self-settle and next-pass verification; this applies to quiet, skipped
34
+ and empty passes too.
@@ -1,11 +1,5 @@
1
1
  # Review manager prompt
2
2
 
3
- The account picker must run first, before the quiet check: from the installed
4
- `axstack` skill directory, run `bun scripts/pick-instance.js --provider <own provider> --json`.
5
- Find this pass's current instance from `t3_thread_configuration` in the picker
6
- JSON `instances` and inspect its `state`; defer reference loads until a full pass.
7
- An eligible current instance remains quiet-eligible even when `chosenInstanceId`
8
- names a different instance.
9
3
  Run the quiet check before invoking `axstack-review` or reading any `skills/**` file.
10
4
 
11
5
  Resolve self with `gh api user --jq .login`, then union two paginated `gh search prs`
@@ -19,26 +13,32 @@ PR-job descendants, using exact lane identities.
19
13
  Read continuity at `~/.local/share/axstack/runs/review-manager/progress.md` and
20
14
  compare its Watermarks with the inventory:
21
15
 
22
- - Run the full pass when the picker JSON marks this pass's current instance `excluded`.
23
- - Run the full pass when the picker exits with code 1.
24
- - Run the full pass when the picker exits with code 2.
25
16
  - Run the full pass when the sorted list differs from `Quiet gate:`.
26
17
  - Run the full pass when any other lane thread is non-terminal.
18
+ - Run the full pass only when the recorded prior pass thread is unsettled and no guard keeps it unsettled.
27
19
  - Run the full pass when continuity or either watermark is missing, malformed or unreadable.
28
20
  - Run the full pass when `Last full pass:` is at least 4 hours old or in the future.
29
21
  - Run the full pass when any call fails or pagination, PR head OIDs or thread/run liveness is incomplete or unknown.
30
22
  - Run the full pass when continuity records any unserved, capacity-deferred, `INCOMPLETE` or re-eligible event, or any open hold with a resume condition beyond a user decision (such as capacity or remeasure).
31
23
 
24
+ Held or flagged prior passes never force a full pass or failure report by their unsettled state alone.
25
+
32
26
  Holds awaiting only the user remain quiet-eligible: a user decision on the PR
33
27
  changes `updatedAt`, and the 4 h full pass reconciles replies in flagged threads.
34
28
 
35
- If every busy condition is false, end the turn with no text, no skill load, no sweep and no continuity write.
29
+ Before evaluating the quiet gate, read the recorded prior pass thread with
30
+ `t3_thread_read`; unknown identity or readback forces a full pass.
31
+ Record own pass threadId in review-manager continuity after reading the prior identity,
32
+ before duplicate classification, then read back the identity save.
33
+
34
+ If every busy condition is false, apply the guarded pass-end self-settle below,
35
+ then end the turn with no text, no skill load, no sweep and no other continuity write.
36
36
  Otherwise continue with the full pass below; incomplete evidence retains the
37
37
  existing admission and cleanup holds.
38
38
 
39
39
  ## Full pass
40
40
 
41
- Follow [Provider bindings](t3-runtime.md#preflight-and-binding) for own account selection.
41
+ Follow [Provider bindings](t3-runtime.md#preflight-and-binding) for provider binding.
42
42
 
43
43
  You are a fresh finite T3 review-manager pass in project `axstack-review-lane`
44
44
  on the VPS's existing `axatbhardwaj/axstack` clone. Fetch first; this unbound
@@ -60,3 +60,10 @@ The full pass records in Watermarks `Quiet gate:` as the sorted list and
60
60
  `Last full pass:` as UTC only as owner-of-record, then reads back the save.
61
61
  Settle descendants and end the finite turn. Stay quiet when unchanged.
62
62
  Never check out a PR branch here.
63
+
64
+ At pass end, an unbound pass calls `t3_thread_organize` with `action: settle` on its
65
+ own thread only, only when it owns no PR watch, has zero unsettled descendants,
66
+ has no pending receipt and is not held, wedged or a stalled owner.
67
+ Follow [Finite-session teardown](automations.md#finite-session-teardown) for
68
+ deferred self-settle and next-pass verification; this applies to quiet, skipped
69
+ and empty passes too.
@@ -18,8 +18,7 @@
18
18
  | `codex-only` | `codex/sol` | `axstack-reviewer-secondary` (`codex/luna` xhigh) |
19
19
  | `claude-only` | `claude/opus` | `axstack-reviewer-secondary` (`claude/sonnet` high) |
20
20
  - `axstack-advisor-astra`/`axstack-advisor-opus` advise and author candidates;
21
- `axstack-arena-candidate-grok`/
22
- `axstack-arena-candidate-antigravity` add families.
21
+ `axstack-arena-candidate-grok` adds a family.
23
22
  `axstack-arena-judge-opus` judges round 1; `axstack-escalation-fable`/`axstack-arena-judge-astra` judge round 2.
24
23
  High-stakes/trigger: fresh [contract](contracts.md) session.
25
24
  `axstack-auditor` audits; `axstack-checker` reports discrepancies.
@@ -39,11 +38,9 @@
39
38
  - `axstack-auditor`: `claude/haiku` xhigh in mixed, pinned to
40
39
  `claude-haiku-5-5`. Missing that exact model or xhigh effort holds without
41
40
  substitution. `claude/sonnet` high in claude-only; `codex/luna` xhigh in codex-only.
42
- - `axstack-explore-codebase`/`axstack-monitor`: `claude/haiku` high in
41
+ - `axstack-explore-codebase`: `claude/haiku` high in
43
42
  mixed/claude-only, pinned to `claude-haiku-5-5`. Missing that exact model
44
- or high effort holds these roles without substitution.
45
- `axstack-monitor`: standalone watch never sends; chat-run watch: bounded
46
- internal reports to its Run and original driver.
43
+ or high effort holds this role without substitution.
47
44
  - Scout requires `axstack-explore-codebase` and
48
45
  `axstack-explore-codebase-luna` per facet in mixed (Haiku high + Luna
49
46
  xhigh) and codex-only (Sol high + Luna xhigh). Claude-only requires
@@ -55,10 +52,8 @@
55
52
  cross-reading. The driver reconciles findings per claim, never averages.
56
53
  Record intentional absence and continue with Sonnet alone.
57
54
  - Optional seats: `axstack-arena-candidate-grok`,
58
- `axstack-arena-candidate-antigravity`, `axstack-research-web-google`,
59
55
  `axstack-research-x`, `axstack-checker`, `axstack-research-code-sol`,
60
- `axstack-explore-execution-sol`, `axstack-auditor-sol`,
61
- `axstack-explore-codebase-flash`.
56
+ `axstack-explore-execution-sol`, `axstack-auditor-sol`.
62
57
  Always dispatch optional seats when configured and available, except research
63
58
  branches, which follow [Research step 2](../../axstack-research/SKILL.md#procedure) sizing.
64
59
  A research branch unneeded by an open claim is recorded `not needed (<reason>)`,