Skip to content

Commit 4c384ef

Browse files
author
Test
committed
fix(training): add safe_jq_update to prevent crashes on JSON parse errors
1 parent 2108d11 commit 4c384ef

File tree

1 file changed

+35
-12
lines changed

1 file changed

+35
-12
lines changed

training-sandbox/training_loop_v2.sh

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,37 @@ cat > "$RESULTS_FILE" << 'EOF'
3535
}
3636
EOF
3737

38-
jq ".started_at = \"$(date -Iseconds)\"" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
38+
safe_jq_update ".started_at = \"$(date -Iseconds)\"" "$RESULTS_FILE"
3939

4040
echo "🚀 Training Loop v2 - Self-Improving"
4141
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
4242
echo "Issues: $NUM_ISSUES"
4343
echo "Results: $RESULTS_FILE"
4444
echo ""
4545

46+
# Safe jq update function with error handling
47+
safe_jq_update() {
48+
local filter="$1"
49+
local file="$2"
50+
local temp_file="/tmp/jq_temp_$$.json"
51+
52+
# Validate current file
53+
if ! jq '.' "$file" > /dev/null 2>&1; then
54+
echo " ⚠️ JSON file corrupted, reinitializing..."
55+
cat > "$file" << 'RESET'
56+
{"version":2,"started_at":"","runs":[],"stats":{"total":0,"l1_syntax_pass":0,"l2_review_approved":0,"l3_tests_pass":0,"l4_analysis_clean":0,"full_success":0,"skipped":0,"failed":0},"model_performance":{}}
57+
RESET
58+
fi
59+
60+
# Apply update
61+
if jq "$filter" "$file" > "$temp_file" 2>/dev/null; then
62+
mv "$temp_file" "$file"
63+
else
64+
echo " ⚠️ jq update failed, skipping"
65+
rm -f "$temp_file"
66+
fi
67+
}
68+
4669
# Detect test runner for a repo
4770
detect_test_runner() {
4871
if [ -f "go.mod" ]; then echo "go test ./..."; return; fi
@@ -141,7 +164,7 @@ echo "$ISSUES" | jq -c '.[]' | while read -r issue; do
141164
# Skip spam repos
142165
if [[ "$REPO" == *"Unit_Automation"* ]] || [[ "$REPO" == *"almadhlom"* ]]; then
143166
echo " ⏭️ Skipping (spam repo)"
144-
jq ".stats.skipped += 1 | .stats.total += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
167+
safe_jq_update ".stats.skipped += 1 | .stats.total += 1" "$RESULTS_FILE"
145168
continue
146169
fi
147170

@@ -152,7 +175,7 @@ echo "$ISSUES" | jq -c '.[]' | while read -r issue; do
152175

153176
if ! /opt/homebrew/bin/gh repo clone "$REPO" "$REPO_NAME" 2>/dev/null; then
154177
echo " ❌ Failed to clone"
155-
jq ".stats.skipped += 1 | .stats.total += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
178+
safe_jq_update ".stats.skipped += 1 | .stats.total += 1" "$RESULTS_FILE"
156179
continue
157180
fi
158181

@@ -164,7 +187,7 @@ echo "$ISSUES" | jq -c '.[]' | while read -r issue; do
164187
echo " ⏭️ Skipping (repo too large: $FILE_COUNT files)"
165188
cd "$SANDBOX_DIR"
166189
rm -rf "$REPO_NAME"
167-
jq ".stats.skipped += 1 | .stats.total += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
190+
safe_jq_update ".stats.skipped += 1 | .stats.total += 1" "$RESULTS_FILE"
168191
continue
169192
fi
170193
echo " 📦 Repo size: $FILE_COUNT files"
@@ -176,7 +199,7 @@ echo "$ISSUES" | jq -c '.[]' | while read -r issue; do
176199
echo " ⏭️ Skipping (issue body too short)"
177200
cd "$SANDBOX_DIR"
178201
rm -rf "$REPO_NAME"
179-
jq ".stats.skipped += 1 | .stats.total += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
202+
safe_jq_update ".stats.skipped += 1 | .stats.total += 1" "$RESULTS_FILE"
180203
continue
181204
fi
182205

@@ -215,7 +238,7 @@ $BODY"
215238

216239
if [ -z "$DIFF" ]; then
217240
echo " ⚪ No changes (${DURATION}s)"
218-
jq ".stats.total += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
241+
safe_jq_update ".stats.total += 1" "$RESULTS_FILE"
219242
cd "$SANDBOX_DIR"
220243
rm -rf "$REPO_NAME"
221244
PROCESSED=$((PROCESSED + 1))
@@ -240,7 +263,7 @@ $BODY"
240263
if [ "$REVIEW_RESULT" = "approved" ]; then
241264
echo " ✅ L2 PASS: Review approved"
242265
L2_PASS=true
243-
jq ".stats.l2_review_approved += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
266+
safe_jq_update ".stats.l2_review_approved += 1" "$RESULTS_FILE"
244267
else
245268
echo " ❌ L2 FAIL: Review $REVIEW_RESULT"
246269
fi
@@ -255,7 +278,7 @@ $BODY"
255278
if eval "$TEST_RUNNER" > "$LOG_DIR/${REPO_NAME}_${NUMBER}_tests.log" 2>&1; then
256279
echo " ✅ L3 PASS: Tests passed"
257280
L3_PASS=true
258-
jq ".stats.l3_tests_pass += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
281+
safe_jq_update ".stats.l3_tests_pass += 1" "$RESULTS_FILE"
259282
else
260283
echo " ❌ L3 FAIL: Tests failed"
261284
fi
@@ -275,7 +298,7 @@ $BODY"
275298
if [ "$ERROR_COUNT" -eq 0 ]; then
276299
echo " ✅ L4 PASS: No error patterns"
277300
L4_PASS=true
278-
jq ".stats.l4_analysis_clean += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
301+
safe_jq_update ".stats.l4_analysis_clean += 1" "$RESULTS_FILE"
279302
else
280303
echo " ⚠️ L4 WARN: $ERROR_COUNT error pattern(s) found"
281304
fi
@@ -287,13 +310,13 @@ $BODY"
287310
if [ "$L1_PASS" = true ] && [ "$L2_PASS" = true ] && [ "$L3_PASS" = true ] && [ "$L4_PASS" = true ]; then
288311
RESULT="success"
289312
echo " 🎉 FULL SUCCESS"
290-
jq ".stats.full_success += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
313+
safe_jq_update ".stats.full_success += 1" "$RESULTS_FILE"
291314
else
292315
echo " 📊 Partial: L1=$L1_PASS L2=$L2_PASS L3=$L3_PASS L4=$L4_PASS"
293316
fi
294317

295318
# Update stats
296-
jq ".stats.total += 1 | .stats.l1_syntax_pass += 1" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
319+
safe_jq_update ".stats.total += 1 | .stats.l1_syntax_pass += 1" "$RESULTS_FILE"
297320

298321
# Record run
299322
RUN_JSON=$(cat <<EOF
@@ -311,7 +334,7 @@ $BODY"
311334
}
312335
EOF
313336
)
314-
jq ".runs += [$RUN_JSON]" "$RESULTS_FILE" > /tmp/r.json && mv /tmp/r.json "$RESULTS_FILE"
337+
safe_jq_update ".runs += [$RUN_JSON]" "$RESULTS_FILE"
315338

316339
# Write feedback for ML
317340
if [ -f "$FEEDBACK_FILE" ]; then

0 commit comments

Comments
 (0)