# Upgrade Guide — vNEXT

<!-- assembled-by: assemble-next-md -->
<!-- bump: patch -->

## What Changed

The mentor runner's lastResult now persists to the agent state directory (mentor-last-result.json, atomic write, corrupt-tolerant load) and rehydrates at construction, so GET /mentor/status .lastResult survives server restarts. Accepted ticks log one start line and one outcome line in the server log; previously only failures logged anything.

## What to Tell Your User

Nothing user-visible — diagnosis plumbing. If you ever ask "is the mentor loop doing anything?", the status endpoint and server log can now actually answer, even right after an update restart.

## Summary of New Capabilities

- GET /mentor/status .lastResult is restart-survivable (persisted per outcome, hydrated at boot).
- Server log shows one line per accepted mentor tick and one per outcome (mentor tick accepted / tick result).

## Evidence

Live trace (2026-06-05): mentor enabled+live with a */15 schedule, yet lastResult was empty at every read and server.log had ZERO mentor outcome lines across three days — while the reap-log showed every job-mentor-onboarding session ending boot-purge-dead and only two tick POSTs were visible (deduped auth warnings). Restart cadence matched tick cadence, so the in-memory record was wiped before any read. Pinned by 5 new unit tests in tests/unit/MentorOnboardingRunner.test.ts (hydration at construction, absent-services back-compat, throwing load contained, save invoked on all three write paths, throwing save contained).
