jonah-fleet 1.17.0 → 1.19.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,6 +5,20 @@ 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.19.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.18.0...v1.19.0) (2026-09-20)
9
+
10
+
11
+ ### Features
12
+
13
+ * **autowork:** add opportunistic operational log sweep (idle GC) to Step 9 ([#285](https://github.com/juliendurandeu/jonah-fleet/issues/285)) ([8e4cf12](https://github.com/juliendurandeu/jonah-fleet/commit/8e4cf122cb949bdc23bdc3eaa1f80e4a7739dde6))
14
+
15
+ ## [1.18.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.17.0...v1.18.0) (2026-09-20)
16
+
17
+
18
+ ### Features
19
+
20
+ * **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))
21
+
8
22
  ## [1.17.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.16.0...v1.17.0) (2026-09-19)
9
23
 
10
24
 
@@ -16,12 +30,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
16
30
 
17
31
  ### Features
18
32
 
33
+ * **guard:** execute routine GitHub Actions workflows via run-with-loop-guard wrapper script ([#227](https://github.com/juliendurandeu/jonah-fleet/issues/227))
19
34
  * **orchestration:** adopt 4-part human escalation card in peer-review routine on round-5 escalation ([#235](https://github.com/juliendurandeu/jonah-fleet/issues/235))
20
35
  * **orchestration:** add Routine Run Failure Ingestion & Auto-Closure Protocol to `ORCHESTRATION.md`, unifying prior failure memory and resolution lifecycle across `autowork` and `peer-review`.
21
36
  * **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.
22
37
  * **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.
23
38
  * **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.
24
39
  * **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.
40
+ * **autowork:** add opportunistic operational log sweep (idle GC) to Step 9 in `autowork.md`, cleaning up stale untargeted failures when the issue backlog is clear.
25
41
 
26
42
  ## [1.16.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.15.1...v1.16.0) (2026-09-19)
27
43
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jonah-fleet",
3
- "version": "1.17.0",
3
+ "version": "1.19.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",
@@ -168,7 +168,9 @@ Single source of truth for handling routine run failures, context extraction, an
168
168
  ```
169
169
  (or `PR #<PR_NUMBER>`). If prior failed runs exist, the runner extracts error messages, failing test names, or crash milestones from the Interruption Card and incorporates this context into Milestone 1 and its reproduction strategy, preventing repeated identical failures.
170
170
  3. **Resolution-Triggered Auto-Closure**: When a target issue or PR reaches terminal completion (a ready PR opened, review decision executed, or PR merged), the routine iterates through any open past failed routine issues for that target, posts a resolution comment referencing the successful run (including the Antigravity run footer), and closes them via `gh issue close <ISSUE> --reason completed`.
171
- 4. **Housekeeping Garbage Collection for Untargeted Crashes**: Routine runs that fail before claiming a target (e.g. runner VM startup errors, GitHub CLI auth failures) or whose target has already been resolved are audited by `issues-housekeeping.md` and closed once older than 48 hours, keeping consumer issue lists clean and noise-free.
171
+ 4. **Garbage Collection for Untargeted / Stale Crashes (Housekeeping & Idle Autowork)**: Routine runs that fail before claiming a target (e.g. runner VM startup errors, GitHub CLI auth failures) or whose target has already been resolved are audited and closed once older than 48 hours by:
172
+ - `issues-housekeeping.md` during scheduled backlog maintenance sweeps.
173
+ - `autowork.md` Step 9 as an opportunistic idle sweep when no eligible unclaimed work exists, ensuring repositories running minimal presets without dedicated housekeeping crons stay pristine.
172
174
 
173
175
  ---
174
176
 
@@ -165,8 +165,19 @@ _Generated by [Antigravity](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/ru
165
165
  - **Dual Execution Priority Routing**:
166
166
  - If running in **Cloud Actions** (`$GITHUB_ACTIONS` / `$CI`): Scan mode selects `priority/P0` or `priority/P1` issues first. Lower-priority `priority/P2` or `priority/P3` issues are eligible in cloud Scan mode ONLY if the issue has remained unclaimed for more than 48 hours (`created_at` older than 48h, acting as a cloud catchup sweep).
167
167
  - If running in **Local Agent** (`$LOCAL_AGENT`): Scan mode selects across all priorities (P0 → P1 → P2 → P3) without time gating, prioritizing active local backlog consumption.
168
- - Skip assigned issues (unless stale claim per `ORCHESTRATION.md`), issues with open PRs, issues with unclosed blocking dependencies (`Blocked by #N` / `Depends on #N`), issues labeled `needs-human`, `needs-design`, or `needs-info`, and issues under cross-run cooldown.
169
- 9. If no eligible candidate exists, STOP — run is SUCCESS with "No unclaimed work available".
168
+ 9. If no eligible candidate exists:
169
+ - **Opportunistic Operational Log Sweep (Idle GC)**: Before concluding an idle run, perform a lightweight sweep of open `routine-log` issues to prevent operational clutter from accumulating across repositories (especially those running minimal presets without dedicated housekeeping crons):
170
+ ```bash
171
+ STALE_FAILURES=$(gh issue list --label routine-log,status:failure --state open --limit 20 --json number,title,body,createdAt || true)
172
+ ```
173
+ For each stale failure issue:
174
+ - Check if it is untargeted (no `(Issue #N)` or `(PR #M)` in title/body) and older than 48 hours, OR if its referenced target issue or PR is already closed or merged.
175
+ - If eligible, close it with a resolution note:
176
+ ```bash
177
+ gh issue comment "$stale_num" --body "Closed by autowork idle sweep: routine failure superseded or untargeted crash older than 48 hours.\n\n_Generated by [Antigravity](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID:-})_" || true
178
+ gh issue close "$stale_num" --reason completed || true
179
+ ```
180
+ - STOP — run is SUCCESS with "No unclaimed work available; swept stale operational logs".
170
181
  10. If the candidate should be closed already (work done, merged PR found in git history or via `gh pr list --state merged --search "<ISSUE_NUMBER>"`), close it immediately (`gh issue close <ISSUE_NUMBER> --comment "Closed: work already merged in PR #<PR_NUMBER>.\n\n_Generated by [Antigravity](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID:-})_"`), close any lingering past failed routine run issues (`PAST_FAILURES=$(gh issue list --label routine-log --search "Issue #<ISSUE_NUMBER>" --state open --json number --jq '.[].number' || true); for p in $PAST_FAILURES; do if [ -n "$p" ] && [ "$p" != "$ROUTINE_ISSUE_NUMBER" ]; then gh issue comment "$p" --body "Resolved: work already merged in PR #<PR_NUMBER>.\n\n_Generated by [Antigravity](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID:-})_" || true; gh issue close "$p" --reason completed || true; fi; done`), and return to step 8.
171
182
  10a. **Stale-claim reclamation:** If candidate is a stale claim per `ORCHESTRATION.md`, re-read immediately before writing, unassign the dead owner, post reclamation comment, and proceed to claim.
172
183
  11. **Claim protocol:**
@@ -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" \