@@ -35,14 +35,37 @@ cat > "$RESULTS_FILE" << 'EOF'
3535}
3636EOF
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
4040echo " 🚀 Training Loop v2 - Self-Improving"
4141echo " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
4242echo " Issues: $NUM_ISSUES "
4343echo " Results: $RESULTS_FILE "
4444echo " "
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
4770detect_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}
312335EOF
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