The agent host didn't have the lifecycle boundaries I assumed A developer built Savepoints, an agent-memory system that adds explicit lifecycle boundaries around semantic review so that an agent's own review turn cannot recursively trigger another review. Live probes in the Cursor host showed that prompt-origin metadata from beforeSubmitPrompt was not reliable enough to distinguish review scaffolding from source work, so the system now marks review follow-ups explicitly with a SAVEPOINTS_CAPTURE_REVIEW_V1 opportunity_id token. Across four substantial agent sessions, observe hooks confirmed real activity but the emit-savepoint skill was consulted inconsistently and emit-learning never ran, making it impossible to tell "reviewed the work and found nothing" from "the review never happened. As I started handing agents longer pieces of work, I stopped being present at every lifecycle boundary. In shorter copilot-style sessions I had been part of the control loop without really thinking about it. Longer agent runs broke that assumption: I was no longer present to know when work finished, what mattered, or what context should survive into the next task. One place this surfaced was memory. I wanted an agent to review completed work and decide whether anything was worth carrying into future sessions. I call the system I built for that Savepoints. Savepoints already had the semantic path: Agent work → Observe → emit-savepoint worth keeping? → emit-learning / no capture Observe what happened, decide whether anything was worth keeping, then emit a learning or explicitly capture nothing. The weak point was how that review started. It depended on the agent following instructions, but I had no reliable way to tell whether it had. Across four substantial agent sessions, observe hooks confirmed real activity, but the emit-savepoint skill was consulted inconsistently and emit-learning never ran. I could not distinguish "reviewed the work and found nothing" from "the review never happened." I added two boundaries around the semantic review: Agent work → Observe → Review opportunity ← new boundary → emit-savepoint worth keeping? → emit-learning / no capture → mark reviewed ← new boundary Open a review opportunity when observed work needed review, then mark that evidence as reviewed once the opportunity had been handled. Observation and semantic judgment stay separate. I already had a suspected shape for the larger system, and checking half a dozen agent-memory systems reinforced it: opportunity IDs, idempotent review closure, fail-open hooks, semantic judgment left to the agent. What remained uncertain was whether those invariants had reliable lifecycle boundaries to attach to in the host. For this implementation, the host was Cursor, which exposes lifecycle hooks such as beforeSubmitPrompt , afterFileEdit , and stop . The host seemed to expose enough information to establish three boundaries: whether a turn was review scaffolding or source work, whether lifecycle events belonged to the same piece of work, and whether that work had actually affected this repository. If those answers were reliable, the adapter was straightforward: register the work, watch its evidence, then open review when it completed. I expected the next pass to be production wiring. Live probes said otherwise. The straightforward implementation used Cursor's stop hook as the completion signal. When ordinary work hit stop , Savepoints would open a review opportunity and send a follow-up asking the agent to review what had just happened. That immediately created a recursion problem. The review was itself another agent turn. If that turn also ended in stop , Savepoints could mistake its own review for more completed work and open another review. ordinary work → stop → open review → review follow-up → stop? could trigger another review The natural first question was whether the host could tell me that this new turn was the review follow-up I had created. I tried making that distinction when beforeSubmitPrompt fired. If the host could tell me whether a prompt came from the user or from the follow-up I had generated, I could classify the turn before any work happened. Live probes showed that distinction was not reliable enough to build on. So I stopped asking the host to infer an identity I controlled. When Savepoints creates a review follow-up, it now marks it explicitly: SAVEPOINTS CAPTURE REVIEW V1 opportunity id=