jonah-fleet 1.30.1 → 1.30.2

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,13 @@ 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.30.2](https://github.com/Jonah-Projects/jonah-fleet/compare/v1.30.1...v1.30.2) (2026-09-30)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **workflows:** respect routine toggle flags in agents-manifest.json during scheduled cron runs ([#509](https://github.com/Jonah-Projects/jonah-fleet/issues/509)) ([dfb188a](https://github.com/Jonah-Projects/jonah-fleet/commit/dfb188a7a4189875e6fb61efb8ea0f0093bbed65))
14
+
8
15
  ## [1.30.1](https://github.com/Jonah-Projects/jonah-fleet/compare/v1.30.0...v1.30.1) (2026-09-25)
9
16
 
10
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jonah-fleet",
3
- "version": "1.30.1",
3
+ "version": "1.30.2",
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",
@@ -453,6 +453,11 @@ async function main() {
453
453
  }
454
454
  } else if (parsed.event === 'result' && parsed.result?.response) {
455
455
  console.log(`\n${parsed.result.response}\n`);
456
+ } else if (parsed.event === 'error' || parsed.error) {
457
+ const errMsg =
458
+ parsed.error?.message ||
459
+ (typeof parsed.error === 'string' ? parsed.error : JSON.stringify(parsed.error || parsed));
460
+ console.error(`\n[agent:error] ${errMsg}`);
456
461
  }
457
462
  return;
458
463
  }
@@ -128,6 +128,7 @@ jobs:
128
128
 
129
129
  MODEL="$DEFAULT_MODEL"
130
130
  TIMEOUT="$DEFAULT_TIMEOUT"
131
+ ENABLED="true"
131
132
 
132
133
  if [ -f "agents-manifest.json" ]; then
133
134
  CONFIG_JSON=$(node -e '
@@ -137,14 +138,16 @@ jobs:
137
138
  const r = process.argv[1];
138
139
  const model = m.models?.[r] || m.models?.default;
139
140
  const timeout = m.budgets?.timeoutMinutes?.[r] || m.budgets?.timeoutMinutes?.default;
140
- console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "" }));
141
+ const enabled = m.routines?.[r] !== false;
142
+ console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "", enabled }));
141
143
  } catch (e) {
142
- console.log(JSON.stringify({ model: "", timeout: "" }));
144
+ console.log(JSON.stringify({ model: "", timeout: "", enabled: true }));
143
145
  }
144
146
  ' "$ROUTINE")
145
147
 
146
148
  RESOLVED_MODEL=$(node -e "try { console.log(JSON.parse(process.argv[1]).model || ''); } catch {}" "$CONFIG_JSON")
147
149
  RESOLVED_TIMEOUT=$(node -e "try { console.log(JSON.parse(process.argv[1]).timeout || ''); } catch {}" "$CONFIG_JSON")
150
+ RESOLVED_ENABLED=$(node -e "try { console.log(JSON.parse(process.argv[1]).enabled); } catch {}" "$CONFIG_JSON")
148
151
 
149
152
  if [ -n "$RESOLVED_MODEL" ]; then
150
153
  MODEL="$RESOLVED_MODEL"
@@ -152,13 +155,22 @@ jobs:
152
155
  if [ -n "$RESOLVED_TIMEOUT" ]; then
153
156
  TIMEOUT="$RESOLVED_TIMEOUT"
154
157
  fi
158
+ if [ -n "$RESOLVED_ENABLED" ]; then
159
+ ENABLED="$RESOLVED_ENABLED"
160
+ fi
155
161
  fi
156
162
 
157
163
  echo "model=$MODEL" >> "$GITHUB_OUTPUT"
158
164
  echo "print_timeout=${TIMEOUT}m" >> "$GITHUB_OUTPUT"
159
- echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m"
165
+ echo "enabled=$ENABLED" >> "$GITHUB_OUTPUT"
166
+ echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m, enabled=$ENABLED"
167
+
168
+ if [ "$ENABLED" = "false" ] && [ "${{ github.event_name }}" = "schedule" ]; then
169
+ echo "⏸️ Routine '$ROUTINE' is disabled in agents-manifest.json. Skipping scheduled run."
170
+ fi
160
171
 
161
172
  - name: Initialize Routine Run Issue
173
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
162
174
  id: run-issue
163
175
  env:
164
176
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
@@ -183,6 +195,7 @@ jobs:
183
195
  echo "ROUTINE_ISSUE_NUMBER=$ISSUE_NUMBER" >> "$GITHUB_ENV"
184
196
 
185
197
  - name: Run Analytics Review
198
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
186
199
  timeout-minutes: 50
187
200
  env:
188
201
  GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
@@ -224,7 +237,7 @@ jobs:
224
237
  fi
225
238
 
226
239
  - name: Emit run summary
227
- if: always()
240
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
228
241
  run: |
229
242
  if [ "$QUOTA_PAUSED" = "true" ]; then
230
243
  echo "### ⏸️ Milestone: Routine Execution Quota-Paused" >> "$GITHUB_STEP_SUMMARY"
@@ -238,7 +251,7 @@ jobs:
238
251
  fi
239
252
 
240
253
  - name: Emit Fleet Telemetry (Opt-in)
241
- if: always()
254
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
242
255
  env:
243
256
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
244
257
  TELEMETRY_ENDPOINT: ${{ secrets.JONAH_FLEET_TELEMETRY_ENDPOINT }}
@@ -252,7 +265,7 @@ jobs:
252
265
  fi
253
266
 
254
267
  - name: Reconcile Routine Run Issue
255
- if: always()
268
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
256
269
  env:
257
270
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
258
271
  ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
@@ -130,6 +130,7 @@ jobs:
130
130
 
131
131
  MODEL="$DEFAULT_MODEL"
132
132
  TIMEOUT="$DEFAULT_TIMEOUT"
133
+ ENABLED="true"
133
134
 
134
135
  if [ -f "agents-manifest.json" ]; then
135
136
  CONFIG_JSON=$(node -e '
@@ -139,14 +140,16 @@ jobs:
139
140
  const r = process.argv[1];
140
141
  const model = m.models?.[r] || m.models?.default;
141
142
  const timeout = m.budgets?.timeoutMinutes?.[r] || m.budgets?.timeoutMinutes?.default;
142
- console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "" }));
143
+ const enabled = m.routines?.[r] !== false;
144
+ console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "", enabled }));
143
145
  } catch (e) {
144
- console.log(JSON.stringify({ model: "", timeout: "" }));
146
+ console.log(JSON.stringify({ model: "", timeout: "", enabled: true }));
145
147
  }
146
148
  ' "$ROUTINE")
147
149
 
148
150
  RESOLVED_MODEL=$(node -e "try { console.log(JSON.parse(process.argv[1]).model || ''); } catch {}" "$CONFIG_JSON")
149
151
  RESOLVED_TIMEOUT=$(node -e "try { console.log(JSON.parse(process.argv[1]).timeout || ''); } catch {}" "$CONFIG_JSON")
152
+ RESOLVED_ENABLED=$(node -e "try { console.log(JSON.parse(process.argv[1]).enabled); } catch {}" "$CONFIG_JSON")
150
153
 
151
154
  if [ -n "$RESOLVED_MODEL" ]; then
152
155
  MODEL="$RESOLVED_MODEL"
@@ -154,13 +157,22 @@ jobs:
154
157
  if [ -n "$RESOLVED_TIMEOUT" ]; then
155
158
  TIMEOUT="$RESOLVED_TIMEOUT"
156
159
  fi
160
+ if [ -n "$RESOLVED_ENABLED" ]; then
161
+ ENABLED="$RESOLVED_ENABLED"
162
+ fi
157
163
  fi
158
164
 
159
165
  echo "model=$MODEL" >> "$GITHUB_OUTPUT"
160
166
  echo "print_timeout=${TIMEOUT}m" >> "$GITHUB_OUTPUT"
161
- echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m"
167
+ echo "enabled=$ENABLED" >> "$GITHUB_OUTPUT"
168
+ echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m, enabled=$ENABLED"
169
+
170
+ if [ "$ENABLED" = "false" ] && [ "${{ github.event_name }}" = "schedule" ]; then
171
+ echo "⏸️ Routine '$ROUTINE' is disabled in agents-manifest.json. Skipping scheduled run."
172
+ fi
162
173
 
163
174
  - name: Initialize Routine Run Issue
175
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
164
176
  id: run-issue
165
177
  env:
166
178
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
@@ -190,6 +202,7 @@ jobs:
190
202
  echo "ROUTINE_ISSUE_NUMBER=$ISSUE_NUMBER" >> "$GITHUB_ENV"
191
203
 
192
204
  - name: Run Autowork
205
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
193
206
  timeout-minutes: 60
194
207
  env:
195
208
  GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
@@ -234,7 +247,7 @@ jobs:
234
247
  fi
235
248
 
236
249
  - name: Emit run summary
237
- if: always()
250
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
238
251
  run: |
239
252
  if [ "$QUOTA_PAUSED" = "true" ]; then
240
253
  echo "### ⏸️ Milestone: Routine Execution Quota-Paused" >> "$GITHUB_STEP_SUMMARY"
@@ -248,7 +261,7 @@ jobs:
248
261
  fi
249
262
 
250
263
  - name: Emit Fleet Telemetry (Opt-in)
251
- if: always()
264
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
252
265
  env:
253
266
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
254
267
  TELEMETRY_ENDPOINT: ${{ secrets.JONAH_FLEET_TELEMETRY_ENDPOINT }}
@@ -262,7 +275,7 @@ jobs:
262
275
  fi
263
276
 
264
277
  - name: Verify Atomic Handoff Invariant (PR Existence Guard)
265
- if: always()
278
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
266
279
  env:
267
280
  GH_TOKEN: ${{ github.token }}
268
281
  run: |
@@ -283,7 +296,7 @@ jobs:
283
296
  fi
284
297
 
285
298
  - name: Reconcile Routine Run Issue
286
- if: always()
299
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
287
300
  env:
288
301
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
289
302
  ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
@@ -91,6 +91,7 @@ jobs:
91
91
 
92
92
  MODEL="$DEFAULT_MODEL"
93
93
  TIMEOUT="$DEFAULT_TIMEOUT"
94
+ ENABLED="true"
94
95
 
95
96
  if [ -f "agents-manifest.json" ]; then
96
97
  CONFIG_JSON=$(node -e '
@@ -100,14 +101,16 @@ jobs:
100
101
  const r = process.argv[1];
101
102
  const model = m.models?.[r] || m.models?.default;
102
103
  const timeout = m.budgets?.timeoutMinutes?.[r] || m.budgets?.timeoutMinutes?.default;
103
- console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "" }));
104
+ const enabled = m.routines?.[r] !== false;
105
+ console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "", enabled }));
104
106
  } catch (e) {
105
- console.log(JSON.stringify({ model: "", timeout: "" }));
107
+ console.log(JSON.stringify({ model: "", timeout: "", enabled: true }));
106
108
  }
107
109
  ' "$ROUTINE")
108
110
 
109
111
  RESOLVED_MODEL=$(node -e "try { console.log(JSON.parse(process.argv[1]).model || ''); } catch {}" "$CONFIG_JSON")
110
112
  RESOLVED_TIMEOUT=$(node -e "try { console.log(JSON.parse(process.argv[1]).timeout || ''); } catch {}" "$CONFIG_JSON")
113
+ RESOLVED_ENABLED=$(node -e "try { console.log(JSON.parse(process.argv[1]).enabled); } catch {}" "$CONFIG_JSON")
111
114
 
112
115
  if [ -n "$RESOLVED_MODEL" ]; then
113
116
  MODEL="$RESOLVED_MODEL"
@@ -115,13 +118,22 @@ jobs:
115
118
  if [ -n "$RESOLVED_TIMEOUT" ]; then
116
119
  TIMEOUT="$RESOLVED_TIMEOUT"
117
120
  fi
121
+ if [ -n "$RESOLVED_ENABLED" ]; then
122
+ ENABLED="$RESOLVED_ENABLED"
123
+ fi
118
124
  fi
119
125
 
120
126
  echo "model=$MODEL" >> "$GITHUB_OUTPUT"
121
127
  echo "print_timeout=${TIMEOUT}m" >> "$GITHUB_OUTPUT"
122
- echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m"
128
+ echo "enabled=$ENABLED" >> "$GITHUB_OUTPUT"
129
+ echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m, enabled=$ENABLED"
130
+
131
+ if [ "$ENABLED" = "false" ] && [ "${{ github.event_name }}" = "schedule" ]; then
132
+ echo "⏸️ Routine '$ROUTINE' is disabled in agents-manifest.json. Skipping scheduled run."
133
+ fi
123
134
 
124
135
  - name: Initialize Routine Run Issue
136
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
125
137
  id: run-issue
126
138
  env:
127
139
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
@@ -146,6 +158,7 @@ jobs:
146
158
  echo "ROUTINE_ISSUE_NUMBER=$ISSUE_NUMBER" >> "$GITHUB_ENV"
147
159
 
148
160
  - name: Run Dependency Update Check
161
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
149
162
  timeout-minutes: 25
150
163
  env:
151
164
  GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
@@ -184,7 +197,7 @@ jobs:
184
197
  fi
185
198
 
186
199
  - name: Emit run summary
187
- if: always()
200
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
188
201
  run: |
189
202
  if [ "$QUOTA_PAUSED" = "true" ]; then
190
203
  echo "### ⏸️ Milestone: Routine Execution Quota-Paused" >> "$GITHUB_STEP_SUMMARY"
@@ -198,7 +211,7 @@ jobs:
198
211
  fi
199
212
 
200
213
  - name: Reconcile Routine Run Issue
201
- if: always()
214
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
202
215
  env:
203
216
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
204
217
  ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
@@ -91,6 +91,7 @@ jobs:
91
91
 
92
92
  MODEL="$DEFAULT_MODEL"
93
93
  TIMEOUT="$DEFAULT_TIMEOUT"
94
+ ENABLED="true"
94
95
 
95
96
  if [ -f "agents-manifest.json" ]; then
96
97
  CONFIG_JSON=$(node -e '
@@ -100,14 +101,16 @@ jobs:
100
101
  const r = process.argv[1];
101
102
  const model = m.models?.[r] || m.models?.default;
102
103
  const timeout = m.budgets?.timeoutMinutes?.[r] || m.budgets?.timeoutMinutes?.default;
103
- console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "" }));
104
+ const enabled = m.routines?.[r] !== false;
105
+ console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "", enabled }));
104
106
  } catch (e) {
105
- console.log(JSON.stringify({ model: "", timeout: "" }));
107
+ console.log(JSON.stringify({ model: "", timeout: "", enabled: true }));
106
108
  }
107
109
  ' "$ROUTINE")
108
110
 
109
111
  RESOLVED_MODEL=$(node -e "try { console.log(JSON.parse(process.argv[1]).model || ''); } catch {}" "$CONFIG_JSON")
110
112
  RESOLVED_TIMEOUT=$(node -e "try { console.log(JSON.parse(process.argv[1]).timeout || ''); } catch {}" "$CONFIG_JSON")
113
+ RESOLVED_ENABLED=$(node -e "try { console.log(JSON.parse(process.argv[1]).enabled); } catch {}" "$CONFIG_JSON")
111
114
 
112
115
  if [ -n "$RESOLVED_MODEL" ]; then
113
116
  MODEL="$RESOLVED_MODEL"
@@ -115,13 +118,22 @@ jobs:
115
118
  if [ -n "$RESOLVED_TIMEOUT" ]; then
116
119
  TIMEOUT="$RESOLVED_TIMEOUT"
117
120
  fi
121
+ if [ -n "$RESOLVED_ENABLED" ]; then
122
+ ENABLED="$RESOLVED_ENABLED"
123
+ fi
118
124
  fi
119
125
 
120
126
  echo "model=$MODEL" >> "$GITHUB_OUTPUT"
121
127
  echo "print_timeout=${TIMEOUT}m" >> "$GITHUB_OUTPUT"
122
- echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m"
128
+ echo "enabled=$ENABLED" >> "$GITHUB_OUTPUT"
129
+ echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m, enabled=$ENABLED"
130
+
131
+ if [ "$ENABLED" = "false" ] && [ "${{ github.event_name }}" = "schedule" ]; then
132
+ echo "⏸️ Routine '$ROUTINE' is disabled in agents-manifest.json. Skipping scheduled run."
133
+ fi
123
134
 
124
135
  - name: Initialize Routine Run Issue
136
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
125
137
  id: run-issue
126
138
  env:
127
139
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
@@ -146,6 +158,7 @@ jobs:
146
158
  echo "ROUTINE_ISSUE_NUMBER=$ISSUE_NUMBER" >> "$GITHUB_ENV"
147
159
 
148
160
  - name: Run Issues Housekeeping
161
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
149
162
  timeout-minutes: 40
150
163
  env:
151
164
  GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
@@ -184,7 +197,7 @@ jobs:
184
197
  fi
185
198
 
186
199
  - name: Emit run summary
187
- if: always()
200
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
188
201
  run: |
189
202
  if [ "$QUOTA_PAUSED" = "true" ]; then
190
203
  echo "### ⏸️ Milestone: Routine Execution Quota-Paused" >> "$GITHUB_STEP_SUMMARY"
@@ -198,7 +211,7 @@ jobs:
198
211
  fi
199
212
 
200
213
  - name: Reconcile Routine Run Issue
201
- if: always()
214
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
202
215
  env:
203
216
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
204
217
  ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
@@ -91,6 +91,7 @@ jobs:
91
91
 
92
92
  MODEL="$DEFAULT_MODEL"
93
93
  TIMEOUT="$DEFAULT_TIMEOUT"
94
+ ENABLED="true"
94
95
 
95
96
  if [ -f "agents-manifest.json" ]; then
96
97
  CONFIG_JSON=$(node -e '
@@ -100,14 +101,16 @@ jobs:
100
101
  const r = process.argv[1];
101
102
  const model = m.models?.[r] || m.models?.default;
102
103
  const timeout = m.budgets?.timeoutMinutes?.[r] || m.budgets?.timeoutMinutes?.default;
103
- console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "" }));
104
+ const enabled = m.routines?.[r] !== false;
105
+ console.log(JSON.stringify({ model: model || "", timeout: timeout ? String(timeout) : "", enabled }));
104
106
  } catch (e) {
105
- console.log(JSON.stringify({ model: "", timeout: "" }));
107
+ console.log(JSON.stringify({ model: "", timeout: "", enabled: true }));
106
108
  }
107
109
  ' "$ROUTINE")
108
110
 
109
111
  RESOLVED_MODEL=$(node -e "try { console.log(JSON.parse(process.argv[1]).model || ''); } catch {}" "$CONFIG_JSON")
110
112
  RESOLVED_TIMEOUT=$(node -e "try { console.log(JSON.parse(process.argv[1]).timeout || ''); } catch {}" "$CONFIG_JSON")
113
+ RESOLVED_ENABLED=$(node -e "try { console.log(JSON.parse(process.argv[1]).enabled); } catch {}" "$CONFIG_JSON")
111
114
 
112
115
  if [ -n "$RESOLVED_MODEL" ]; then
113
116
  MODEL="$RESOLVED_MODEL"
@@ -115,13 +118,22 @@ jobs:
115
118
  if [ -n "$RESOLVED_TIMEOUT" ]; then
116
119
  TIMEOUT="$RESOLVED_TIMEOUT"
117
120
  fi
121
+ if [ -n "$RESOLVED_ENABLED" ]; then
122
+ ENABLED="$RESOLVED_ENABLED"
123
+ fi
118
124
  fi
119
125
 
120
126
  echo "model=$MODEL" >> "$GITHUB_OUTPUT"
121
127
  echo "print_timeout=${TIMEOUT}m" >> "$GITHUB_OUTPUT"
122
- echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m"
128
+ echo "enabled=$ENABLED" >> "$GITHUB_OUTPUT"
129
+ echo "Resolved routine configuration: model=$MODEL, timeout=${TIMEOUT}m, enabled=$ENABLED"
130
+
131
+ if [ "$ENABLED" = "false" ] && [ "${{ github.event_name }}" = "schedule" ]; then
132
+ echo "⏸️ Routine '\''$ROUTINE'\'' is disabled in agents-manifest.json. Skipping scheduled run."
133
+ fi
123
134
 
124
135
  - name: Initialize Routine Run Issue
136
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
125
137
  id: run-issue
126
138
  env:
127
139
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
@@ -146,6 +158,7 @@ jobs:
146
158
  echo "ROUTINE_ISSUE_NUMBER=$ISSUE_NUMBER" >> "$GITHUB_ENV"
147
159
 
148
160
  - name: Run Prompt Optimizer
161
+ if: steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule'
149
162
  timeout-minutes: 35
150
163
  env:
151
164
  GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
@@ -184,7 +197,7 @@ jobs:
184
197
  fi
185
198
 
186
199
  - name: Emit run summary
187
- if: always()
200
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
188
201
  run: |
189
202
  if [ "$QUOTA_PAUSED" = "true" ]; then
190
203
  echo "### ⏸️ Milestone: Routine Execution Quota-Paused" >> "$GITHUB_STEP_SUMMARY"
@@ -198,7 +211,7 @@ jobs:
198
211
  fi
199
212
 
200
213
  - name: Emit Fleet Telemetry (Opt-in)
201
- if: always()
214
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
202
215
  env:
203
216
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
204
217
  TELEMETRY_ENDPOINT: ${{ secrets.JONAH_FLEET_TELEMETRY_ENDPOINT }}
@@ -212,7 +225,7 @@ jobs:
212
225
  fi
213
226
 
214
227
  - name: Reconcile Routine Run Issue
215
- if: always()
228
+ if: always() && (steps.routine-config.outputs.enabled != 'false' || github.event_name != 'schedule')
216
229
  env:
217
230
  GH_TOKEN: ${{ secrets.GH_PAT || github.token }}
218
231
  ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}