jonah-fleet 1.16.0 → 1.18.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.
package/CHANGELOG.md CHANGED
@@ -5,23 +5,39 @@ All notable changes to `jonah-fleet` will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [1.16.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.15.1...v1.16.0) (2026-09-19)
8
+ ## [1.18.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.17.0...v1.18.0) (2026-09-20)
9
9
 
10
10
 
11
11
  ### Features
12
12
 
13
- * **orchestration:** routine run failure ingestion, dynamic target binding, and auto-closure ([#232](https://github.com/juliendurandeu/jonah-fleet/issues/232)) ([b76b3fc](https://github.com/juliendurandeu/jonah-fleet/commit/b76b3fccd767e5cc9517d977fd08c8979baf64b6))
13
+ * **guard:** update routine GitHub Actions workflows to execute via run-with-loop-guard wrapper ([#227](https://github.com/juliendurandeu/jonah-fleet/issues/227)) ([#277](https://github.com/juliendurandeu/jonah-fleet/issues/277)) ([496ce8c](https://github.com/juliendurandeu/jonah-fleet/commit/496ce8c0c56ddcfd8ac09e530fb4bdaee9c934c9))
14
+
15
+ ## [1.17.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.16.0...v1.17.0) (2026-09-19)
16
+
17
+
18
+ ### Features
19
+
20
+ * **orchestration:** adopt 4-part human escalation card in peer-review routine ([#235](https://github.com/juliendurandeu/jonah-fleet/issues/235)) ([#256](https://github.com/juliendurandeu/jonah-fleet/issues/256)) ([053ef9b](https://github.com/juliendurandeu/jonah-fleet/commit/053ef9b48b7d19b1a503f59c9755b74b99624cc8))
14
21
 
15
- ## [Unreleased] - 2026-09-19
22
+ ## [Unreleased]
16
23
 
17
24
  ### Features
18
25
 
26
+ * **guard:** execute routine GitHub Actions workflows via run-with-loop-guard wrapper script ([#227](https://github.com/juliendurandeu/jonah-fleet/issues/227))
27
+ * **orchestration:** adopt 4-part human escalation card in peer-review routine on round-5 escalation ([#235](https://github.com/juliendurandeu/jonah-fleet/issues/235))
19
28
  * **orchestration:** add Routine Run Failure Ingestion & Auto-Closure Protocol to `ORCHESTRATION.md`, unifying prior failure memory and resolution lifecycle across `autowork` and `peer-review`.
20
29
  * **prompts:** add Dynamic Target Binding in Scan mode to `autowork.md` and `peer-review.md`, dynamically updating `$ROUTINE_ISSUE_NUMBER` titles with `(Issue #N)` or `(PR #M)` upon claiming so crashed runs are never anonymous.
21
30
  * **prompts:** add Prior Failure Ingestion Protocol to `autowork.md` and `peer-review.md`, inspecting past open failed routine issues to extract error logs and crash milestones before implementation or review.
22
31
  * **prompts:** add resolution-triggered auto-closure to `autowork.md` and `peer-review.md`, automatically commenting on and closing past failed routine issues for a target once work is marked ready or merged.
23
32
  * **housekeeping:** expand `issues-housekeeping.md` to sweep and close stale untargeted `status:failure` routine issues older than 48 hours or whose targets are resolved, eliminating backlog clutter.
24
33
 
34
+ ## [1.16.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.15.1...v1.16.0) (2026-09-19)
35
+
36
+
37
+ ### Features
38
+
39
+ * **orchestration:** routine run failure ingestion, dynamic target binding, and auto-closure ([#232](https://github.com/juliendurandeu/jonah-fleet/issues/232)) ([b76b3fc](https://github.com/juliendurandeu/jonah-fleet/commit/b76b3fccd767e5cc9517d977fd08c8979baf64b6))
40
+
25
41
  ## [1.15.1](https://github.com/juliendurandeu/jonah-fleet/compare/v1.15.0...v1.15.1) (2026-09-19)
26
42
 
27
43
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jonah-fleet",
3
- "version": "1.16.0",
3
+ "version": "1.18.0",
4
4
  "description": "Standalone autonomous agent fleet with Symphony orchestration, claim protocols, and continuous improvement loops",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -313,6 +313,7 @@ How autonomous routines escalate decisions, ambiguities, and blockers to human m
313
313
  - **Recommended Path**: The agent's recommended decision and reasoning, allowing maintainers to unblock execution with a simple confirmation.
314
314
  3. **Cross-Routine Enforcement**:
315
315
  - `autowork.md`: Required when tripping the Ambiguity Gate (Step 12), encountering a 2nd-strike permanent blocker (`needs-human`), or hitting the review Ping-Pong Cap (Step 3b).
316
+ - `peer-review.md`: Required when round cap `N >= 5` is reached with unresolved blocking findings, applying `needs-human` and escalating to repo maintainer.
316
317
  - `triage/SKILL.md`: Required when transitioning issues or PRs to `needs-info` or `ready-for-human`.
317
318
  - `issues-housekeeping.md`: Required when auditing and escalating ambiguous, stale, or infeasible issues with `needs-human` or `needs-info`.
318
319
 
@@ -27,7 +27,7 @@ The run is SUCCESS only if ALL of these are true:
27
27
 
28
28
  - [ ] Identified the target PR: if one was named in the invocation, reviewed exactly that PR; otherwise listed open PRs and selected one by priority
29
29
  - [ ] Ran the code-review pass (`/code-review` and security pass), and posted findings as inline review comments
30
- - [ ] Took exactly one final action: squash-merged (if PR is good, CI green and present; executed Autonomous Issue Synthesis if unlinked; closed tracking issue explicitly if referenced) OR posted findings and **converted the PR back to draft** (`gh pr ready <N> --undo`) for author/autowork in-session fixes OR, if round cap reached at round 5 with blocking findings, converted to draft and escalated to human
30
+ - [ ] Took exactly one final action: squash-merged (if PR is good, CI green and present; executed Autonomous Issue Synthesis if unlinked; closed tracking issue explicitly if referenced) OR posted findings and **converted the PR back to draft** (`gh pr ready <N> --undo`) for author/autowork in-session fixes OR, if round cap reached at round 5 with blocking findings, converted to draft and escalated to human via the 4-part escalation card with `needs-human`
31
31
  - [ ] If merging: captured deferred non-blocking findings per materiality bar (filed follow-up issues for material ones, batched or dropped immaterial ones)
32
32
  - [ ] If in Scan mode and no eligible PRs exist, logged SUCCESS with "No PRs to review"
33
33
 
@@ -35,7 +35,7 @@ If any criterion cannot be met, stop immediately and log FAILURE with the reason
35
35
 
36
36
  ## Constraints
37
37
 
38
- - **Max rounds per PR**: 5 — at round 5 the run must terminate in a merge (if no blocking findings remain) or human escalation, never another ordinary bounce.
38
+ - **Max rounds per PR**: 5 — at round 5 the run must terminate in a merge (if no blocking findings remain) or human escalation (via the mandatory 4-part escalation card with `needs-human`), never another ordinary bounce.
39
39
  - **Max iterations**: 65 — after 65 tool call rounds without completing Definition of Done, STOP. Log FAILURE with category `token_limit`.
40
40
  - **Max scope**: one PR per run. Do not review a second PR after finishing the first.
41
41
  - **No speculative work**: review only the diff in the PR.
@@ -159,7 +159,16 @@ If the PR is clean and approved for merge, but lacks a `Closes #N` tracking link
159
159
 
160
160
  - **If Blocking findings exist**:
161
161
  - If `N < 5`: Post inline comments, submit review as `COMMENT`, and convert PR to draft (`gh pr ready <N> --undo`).
162
- - If `N >= 5`: Convert PR to draft, post summary comment escalating to repo maintainer, and apply `needs-human` label.
162
+ - If `N >= 5`: Convert PR to draft, apply `needs-human` label, and post summary escalation comment to the PR formatted with the mandatory 4-part escalation card:
163
+ ```markdown
164
+ ## 🛑 Escalation: Human Decision Required
165
+ - **Decision Needed**: [1 focused question or choice]
166
+ - **Evidence ("Why I believe this")**: [Specific files, lines, test outputs, or conflicting docs]
167
+ - **Evaluated Options & Trade-offs**:
168
+ - *Option A*: [Pros / Cons]
169
+ - *Option B*: [Pros / Cons]
170
+ - **Recommended Path**: [Agent recommendation]
171
+ ```
163
172
  - **If Clean (or only Non-blocking findings)**:
164
173
  - If the PR branch has minor mechanical merge conflicts against `origin/main` (e.g. adjacent `CHANGELOG.md` entries from concurrent merges) while code and tests are sound, resolve the conflict mechanically via `/resolving-merge-conflicts` before squash-merging rather than bouncing the PR back to draft.
165
174
  - If PR lacks `Closes #N`, execute Autonomous Issue Synthesis (Step 5.5).
@@ -161,6 +161,7 @@ jobs:
161
161
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
162
162
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
163
163
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
164
+ ROUTINE: analytics-review
164
165
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
165
166
  VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
166
167
  POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
@@ -174,7 +175,8 @@ jobs:
174
175
  PROMPT="You are the Analytics Review routine for this repository. Read and follow the instructions in .github/prompts/analytics-review.md exactly. ${SKILLS_PROMPT}"
175
176
 
176
177
  set +e
177
- agy -p "$PROMPT" \
178
+ node .github/scripts/run-with-loop-guard.js \
179
+ -p "$PROMPT" \
178
180
  --model "$MODEL" \
179
181
  --output-format text \
180
182
  --print-timeout "$PRINT_TIMEOUT" \
@@ -183,6 +183,7 @@ jobs:
183
183
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
184
184
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
185
185
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
186
+ ROUTINE: autowork
186
187
  TARGET_ISSUE: ${{ inputs.target_issue || inputs.issue_number }}
187
188
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
188
189
  SKILLS_PROMPT: ${{ steps.skills.outputs.skills_prompt }}
@@ -199,7 +200,8 @@ jobs:
199
200
  fi
200
201
 
201
202
  set +e
202
- agy -p "$PROMPT" \
203
+ node .github/scripts/run-with-loop-guard.js \
204
+ -p "$PROMPT" \
203
205
  --model "$MODEL" \
204
206
  --output-format text \
205
207
  --print-timeout "$PRINT_TIMEOUT" \
@@ -139,6 +139,7 @@ jobs:
139
139
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
140
140
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
141
141
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
142
+ ROUTINE: dependency-update-security-check
142
143
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
143
144
  MODEL: ${{ steps.routine-config.outputs.model || 'gemini-3.8-flash-medium' }}
144
145
  PRINT_TIMEOUT: ${{ steps.routine-config.outputs.print_timeout || '25m' }}
@@ -149,7 +150,8 @@ jobs:
149
150
  PROMPT="You are the Dependency Update & Security Check routine. Read and follow .github/prompts/dependency-update-security-check.md exactly. Check dependencies for updates and vulnerabilities, and create or update tracking issues."
150
151
 
151
152
  set +e
152
- agy -p "$PROMPT" \
153
+ node .github/scripts/run-with-loop-guard.js \
154
+ -p "$PROMPT" \
153
155
  --model "$MODEL" \
154
156
  --output-format text \
155
157
  --print-timeout "$PRINT_TIMEOUT" \
@@ -126,6 +126,7 @@ jobs:
126
126
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
127
127
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
128
128
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
129
+ ROUTINE: design-review
129
130
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
130
131
  VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
131
132
  POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
@@ -138,7 +139,8 @@ jobs:
138
139
  PROMPT="You are the Design Review routine for this repository. Read and follow the instructions in .github/prompts/design-review.md exactly. ${SKILLS_PROMPT}"
139
140
 
140
141
  set +e
141
- agy -p "$PROMPT" \
142
+ node .github/scripts/run-with-loop-guard.js \
143
+ -p "$PROMPT" \
142
144
  --model gemini-3.8-flash-high \
143
145
  --output-format text \
144
146
  --print-timeout 50m \
@@ -139,6 +139,7 @@ jobs:
139
139
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
140
140
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
141
141
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
142
+ ROUTINE: issues-housekeeping
142
143
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
143
144
  MODEL: ${{ steps.routine-config.outputs.model || 'gemini-3.8-flash-medium' }}
144
145
  PRINT_TIMEOUT: ${{ steps.routine-config.outputs.print_timeout || '40m' }}
@@ -149,7 +150,8 @@ jobs:
149
150
  PROMPT="You are the Issues Housekeeping routine for this repository. Read and follow .github/prompts/issues-housekeeping.md exactly. Sweep open issues for staleness, duplicates, priority accuracy, and orphaned claims."
150
151
 
151
152
  set +e
152
- agy -p "$PROMPT" \
153
+ node .github/scripts/run-with-loop-guard.js \
154
+ -p "$PROMPT" \
153
155
  --model "$MODEL" \
154
156
  --output-format text \
155
157
  --print-timeout "$PRINT_TIMEOUT" \
@@ -139,6 +139,7 @@ jobs:
139
139
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
140
140
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
141
141
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
142
+ ROUTINE: optimizer
142
143
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
143
144
  MODEL: ${{ steps.routine-config.outputs.model || 'gemini-3.8-flash-high' }}
144
145
  PRINT_TIMEOUT: ${{ steps.routine-config.outputs.print_timeout || '35m' }}
@@ -149,7 +150,8 @@ jobs:
149
150
  PROMPT="You are the Prompt Optimizer routine for this repository. Read and follow .github/prompts/optimizer.md exactly. Diagnose failures, token anomalies, and review loops, and propose preventative prompt and test fixes."
150
151
 
151
152
  set +e
152
- agy -p "$PROMPT" \
153
+ node .github/scripts/run-with-loop-guard.js \
154
+ -p "$PROMPT" \
153
155
  --model "$MODEL" \
154
156
  --output-format text \
155
157
  --print-timeout "$PRINT_TIMEOUT" \
@@ -188,6 +188,7 @@ jobs:
188
188
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
189
189
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
190
190
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
191
+ ROUTINE: autowork
191
192
  TARGET_ISSUE: ${{ inputs.issue_number }}
192
193
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
193
194
  MODE: ${{ inputs.mode || 'targeted' }}
@@ -210,7 +211,8 @@ jobs:
210
211
  fi
211
212
 
212
213
  set +e
213
- agy -p "$PROMPT" \
214
+ node .github/scripts/run-with-loop-guard.js \
215
+ -p "$PROMPT" \
214
216
  --model "$MODEL" \
215
217
  --output-format text \
216
218
  --print-timeout "$PRINT_TIMEOUT" \
@@ -155,6 +155,7 @@ jobs:
155
155
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
156
156
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
157
157
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
158
+ ROUTINE: autowork
158
159
  TARGET_ISSUE: ${{ github.event.issue.number }}
159
160
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
160
161
  SKILLS_PROMPT: ${{ steps.skills.outputs.skills_prompt }}
@@ -167,7 +168,8 @@ jobs:
167
168
  PROMPT="You are the Autowork routine for this repository. A high-priority bug was filed. Read and follow .github/prompts/autowork.md. ${SKILLS_PROMPT} Your target is issue #${TARGET_ISSUE}. You are in Targeted mode: work issue #${TARGET_ISSUE} directly."
168
169
 
169
170
  set +e
170
- agy -p "$PROMPT" \
171
+ node .github/scripts/run-with-loop-guard.js \
172
+ -p "$PROMPT" \
171
173
  --model "$MODEL" \
172
174
  --output-format text \
173
175
  --print-timeout "$PRINT_TIMEOUT" \
@@ -186,6 +186,7 @@ jobs:
186
186
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
187
187
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
188
188
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
189
+ ROUTINE: autowork
189
190
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
190
191
  SKILLS_PROMPT: ${{ steps.skills.outputs.skills_prompt }}
191
192
  MODEL: ${{ steps.routine-config.outputs.model || 'gemini-3.8-flash-high' }}
@@ -197,7 +198,8 @@ jobs:
197
198
  PROMPT="You are the Autowork routine for this repository. A PR was recently merged. Read and follow .github/prompts/autowork.md. ${SKILLS_PROMPT} You are in Scan mode: converge on open PRs, close merged issues, and pick the next unblocked priority issue."
198
199
 
199
200
  set +e
200
- agy -p "$PROMPT" \
201
+ node .github/scripts/run-with-loop-guard.js \
202
+ -p "$PROMPT" \
201
203
  --model "$MODEL" \
202
204
  --output-format text \
203
205
  --print-timeout "$PRINT_TIMEOUT" \
@@ -252,6 +252,7 @@ jobs:
252
252
  GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
253
253
  ANTIGRAVITY_API_KEY: ${{ secrets.GEMINI_API_KEY }}
254
254
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
255
+ ROUTINE: peer-review
255
256
  PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number || inputs.pr_number }}
256
257
  PR_URL: ${{ github.event.pull_request.html_url || github.event.issue.html_url }}
257
258
  ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
@@ -275,7 +276,8 @@ jobs:
275
276
  fi
276
277
 
277
278
  set +e
278
- agy -p "$PROMPT" \
279
+ node .github/scripts/run-with-loop-guard.js \
280
+ -p "$PROMPT" \
279
281
  --model "$MODEL" \
280
282
  --output-format text \
281
283
  --print-timeout "$PRINT_TIMEOUT" \