Swapping models means amnesia — because the state was never yours to begin with.
Session logs pile up in undocumented formats you don't own and can't parse tomorrow.
Identity, skills, and learnings live inside one harness. Switch tools and the agent forgets who it is.
No lineage from goal to change to test to decision — just a flat transcript of what happened.
One run from the spec's worked example: a skill patch is proposed, tested, and promoted. Domain events record the why; each state.ops_applied event folds into the graph.
Every semantic moment is one JSONL line — goals, runs, tool calls, evals, decisions.
The log folds into a typed graph along the causal spine.
Git commits it, git ships it. The same agent resumes anywhere.
An agent has an executor and its state. GASP governs only state — swap the executor freely. Events reference git artifacts; git stores them. Neither duplicates the other.
Code, identity/, skills/, commits, diffs.
Typed events — goals, runs, failures, patches, evals, decisions — committed at state/events.jsonl.
Five rules, seven mechanical checks, one canonical fixture. Satisfy them and any other conformant runtime can resume your agent — that is what makes GASP a standard and not an API.
At the standard layout — log, identity, skills, projections.
Committed, and using the shared event vocabulary.
Committed, loaded at runtime, never compiled in.
Fold the committed log into state; load identity and skills.
Swapping model or runtime touches .agent/config.toml, nothing else.
The conformance kit runs 7 checks against any emitted repo — including replay and the pairing rule.
Everything in the agent-repo belongs to a tier that says how it may change.
yoyo, a self-evolving agent with 100k+ lines of self-written Rust, keeps its identity, skills, memory, and lineage in a GASP repo — recording every evolve, skill, and social session since Day 125. Its state repo passes all 7 checks.
"Clone yoyo-gasp and yoyo wakes up knowing who it is."