Skip to content

Continuity contract

HeyAira separates three durable layers:

Record Use it for Do not use it for
Memory decisions, facts, constraints, proposals, open topics task status or code contents
Task goal, status, handoff, optimistic version long conversation or test log replacement
Work receipt attributable execution evidence and Git checkpoint unverified claims or a second task description

Memory and Task each carry a required summary (1–280 characters, written by whoever calls memory_add/task_create) and optional tags — see Index vs detail.

Startup projection

continuity_context is a bounded recovery index. It returns project identity, recent active memory and open tasks as title/summary/tags (never the full body/description/handoff_* text — ADR-0002), and recent work-session receipts. work.unattended lists tasks needing interactive follow-up; workflow merge reminders and stalls are not included. Task indexes have no workflow field. task_get.workflow references the highest-revision stored workflow with {id, revision, phase, is_current}, even when retired, or is null if none exists. A versioned task read returns null; use workflow_get for workflow history. The task organization projection continues to reflect a current workflow when one exists.

It is not a conversation transcript and it is not a permission grant.

Identity projection

server_identity returns the configured resource, instance, environment, service revision, and authenticated project. The agent compares those values with its selected connection profile before any mutation.

Repository boundary

Git remains the source of truth for files, branches, commits, and pull requests. HeyAira stores references to Git state, not a repository copy.

Durable handoff

A handoff must state what was completed, what happens next, blockers, and the exact Git checkpoint when code was involved. The next agent should be able to continue using HeyAira and Git alone. Step-by-step procedure for closing a session and resuming in a new one: session-handoff.md.

Current versus historical memory

A correction is not effective merely because a newer note exists. Create a complete replacement, preserving unaffected facts, then use memory_supersede with a reason and an idempotency key. Only an interactive project owner/admin can make this transition. Search and startup exclude replaced entries by default. If a task names an old ID, memory_get returns a replacement notice and current content; follow that content instead of reinstating the old rule. Use include_history=true only for an explicitly historical investigation. Formal decisions and historical task contracts have their own lifecycle.