code

Savepoint Protocol

Semantic Markup for Cognitive Turning Points

Updated March 2026

I hit this working on New City, a novel. Worldbuilding sprawled across dozens of AI sessions. Then the sessions closed and the continuity was gone. Fragments survived. The connection between a character’s naming, the narrative structure, and the flooded subway canals was severed.

That loss wasn’t new. I’d been carrying sketchbooks since art school. I’d write things down, take notes, then never see them again. The book wasn’t lost. The thinking was. Twenty years of that, then AI made the same problem happen at machine speed.

The problem wasn’t forgetting. Documentation handles forgetting fine. The failure is that understanding shifts in the middle of unstructured work, and nothing captures those shifts. Notes accumulate without architecture. I stopped asking “how do I document my thinking?” and started asking “how do I mark where my thinking forked?”

Before I built anything, the reflex was already there. For five months, at the end of marathon sessions, I’d type the same request: “give me a savepoint.” The word showed up in twenty-plus conversations before it ever became a system.

The first output was a syntax. A way to mark, inline, the exact point where understanding shifted, without stopping the flow. I workshopped that tag for months.

Something I didn’t expect: I could go back through months of ideation and find the exact moment a decision locked in. A trail system through the mess.


Three versions. v1.0 was YAML frontmatter: loose, reflective, and it stripped out the concrete content it was supposed to preserve. The protocol reproduced the exact loss it was built for.

# v1.0 — YAML frontmatter (March 2025)
---
category: design
timestamp: 2025-03-01T10:00:00Z
---
[freeform narrative content that drifted
 into journaling and lost the actual decision]

v2.0 used triple-pipe attributes, still too verbose.

# v2.0 — Triple-pipe blocks (late March 2025)
||| protocol_version:2.0
||| category:system_logic
||| function:declaration
||| timestamp:2025-03-28T15:43:00Z
<Savepoint>
The content block was open-ended.
You could write paragraphs.
That was the problem.
</Savepoint>

v3.0 came from a front-end instinct: CSS selectors and HTML attributes, applied to thought. A self-closing tag. Atomic. Parseable by machines. Writable by hand.

# v3.0 — Self-closing tag (April 2025)
<Savepoint
  protocol_version:3.0
  category:system_logic
  function:declaration
  timestamp:2025-04-08T15:43:00Z
  # Recursive structures should replace version snapshots wherever drift is likely.
/>

One line of content. One moment captured.

The tag carries its own context. category marks the domain. function marks why the Savepoint exists: a declaration, a revision, a drift detected, a milestone. Optional fields for importance, confidence, and influence when the moment warrants it.

<Savepoint
  protocol_version:3.0
  category:drift_detected
  function:drift_detected
  importance:medium
  confidence:moderate
  timestamp:2025-04-15T11:22:00Z
  # Early users are writing multi-line content after the # marker. The protocol allows exactly one content line. Enforcing strictly preserves the constraint that forces clarity.
/>
<Savepoint
  protocol_version:3.0
  category:protocol_evolution
  function:revision
  importance:high
  confidence:strong
  timestamp:2025-04-10T09:15:00Z
  # The self-closing tag format is final. v1 (YAML frontmatter) was too heavy, v2 (triple-pipe) was too clever. v3 sits at the right weight.
/>
<Savepoint
  protocol_version:3.0
  category:design_philosophy
  function:declaration
  confidence:strong
  timestamp:2025-04-12T16:00:00Z
  # A Savepoint is not a note. Notes capture information. Savepoints mark inflection — the moment thinking changed shape. If you can write it without stopping, it probably wasn't a Savepoint.
/>

Along the way, the protocol became the topic of conversation. All flow gone. That’s how I knew it wasn’t done yet: when I was thinking about tagging instead of thinking about the work. If you’re conscious of Savepoint while working, it has failed.

Drop one in the middle of dense thinking. Come back weeks later. You find your way in. v3.0, open source.

This is how I work. If it sounds like what you need, let's talk.

/Æ/#|●▼||▲|||⬣⟩⟩[governance.savepoint-protocol]/