| 1595 | return { ok: false, message: "No active experimental goal was found." }; |
| 1596 | const parsed = parseGoalToolText(args, ["summary", "next", "evidence"]); |
| 1597 | const item = { time: new Date().toISOString(), summary: parsed.summary || "Progress recorded.", next: parsed.next || "", evidence: parsed.evidence || "" }; |
| 1598 | job.goalProgress = [...job.goalProgress || [], item].slice(-30); |
| 1599 | if (parsed.evidence) |
| 1600 | job.goalEvidence = parsed.evidence; |
| 1601 | job.noProgressCount = 0; |
| 1602 | job.lastProgressAt = now(); |
| 1603 | state.jobs = (state.jobs || []).map((candidate) => candidate.id === job.id ? job : candidate); |
| 1604 | await writeState(directory, sessionID, state); |
| 1605 | await writeGoalReport(directory, sessionID, job); |
| 1606 | await appendLoopLog(directory, "goal-progress", { sessionID, job: job.name || job.id, summary: item.summary }); |