continuity
What this checkout's lifecycle is holding: the open episode, the record the next worker would resume from with the label that says how far to trust it, the newest progress note, and what is blocking acceptance. Read from the local half of the layer, which this process serves to the worker in front of it and never publishes.
What the lifecycle is holding
The open episode, the active task, the handover and checkpoint that resolve for this worktree and branch, each with its divergence label, the unresolved questions that refuse completion, and the record tallies. Selection is two-tiered and never repository-wide: a record from an unrelated worktree or branch is not offered, because a briefing that is quietly about somebody else is worse than none. Absence is reported as absence.
- query
- behaviorally_verified
- benchmark required
- cache process (max_entries=2, ttl_seconds=2)
- MCP tool majordomus_continuity
- MCP resource {"name": "continuity", "uri": "majordomus://continuity"}
No parameters.
Try it
The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.
curl -s "http://127.0.0.1:8741/api/v1/continuity"
Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.
Responses
| status | body | meaning |
| 200 |
Continuity |
What the lifecycle is holding: the result. |
| 400 |
ErrorBody |
invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects. |
| 404 |
ErrorBody |
not_found: The input names something the repository does not hold. |
| 500 |
ErrorBody |
internal: The capability failed for a reason of its own; the message names it. |
| default |
ErrorBody |
Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object. |
This device's identity, and its label
The device a published handover names: the mesh node key (created when this device has none, in the user's state directory and never in a repository), its node id, its public key — what a trust list admits — and the label a person reads. With a label, renames the device; the key and every signature it made are unchanged.
- command
- experimental
- benchmark waived: destructive
- cache disabled
- MCP tool majordomus_continuity_device
- $ continuity device
example default
Try it
The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.
curl -s -X POST "http://127.0.0.1:8741/api/v1/continuity/device" -H "content-type: application/json" -d '{}'Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.
Responses
| status | body | meaning |
| 200 |
DeviceView |
This device's identity, and its label: the result. |
| 400 |
ErrorBody |
invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects. |
| 404 |
ErrorBody |
not_found: The input names something the repository does not hold. |
| 422 |
ErrorBody |
refused: The command was understood and turned down for the reason the message gives. |
| 500 |
ErrorBody |
internal: The capability failed for a reason of its own; the message names it. |
| default |
ErrorBody |
Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object. |
Whether and how a published handover can be resumed here
Writes nothing. Chooses the record (named, or the one other device's handover this checkout has not resumed, on this branch first) and decides: is its signer trusted, does it diverge from the record this checkout stands on, does the local source hold the commit and branch it was written against, was it written in a dirty tree whose uncommitted files never reached a commit, may the other device still be working. The verdict is ready, ready_with_warnings, requires_source_update, conflict, choose_record, nothing_to_resume or refused, with blockers, warnings, the commands that resolve them (recommended, never run), what a resume restores and what this checkout recomputes for itself.
- query
- experimental
- benchmark required
- cache disabled
- MCP tool majordomus_continuity_plan
- $ continuity plan
Query parameters
| name | type | required | description | examples |
| record |
string |
no |
A record id, or a unique prefix of one. |
by-prefix: "0000" |
Try it
The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.
curl -s "http://127.0.0.1:8741/api/v1/continuity/plan?record=0000"
Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.
Responses
| status | body | meaning |
| 200 |
ResumePlan |
Whether and how a published handover can be resumed here: the result. |
| 400 |
ErrorBody |
invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects. |
| 404 |
ErrorBody |
not_found: The input names something the repository does not hold. |
| 500 |
ErrorBody |
internal: The capability failed for a reason of its own; the message names it. |
| default |
ErrorBody |
Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object. |
Publish this checkout's newest handover for another machine
Projects the newest handover record into a portable record — the handover body, the repository and device identity, the episode, the source state (branch, commit, and for a dirty tree the changed paths and a fingerprint, never their content), the task and its decisions, and the record it continues — refuses it when any value carries a credential, a secret environment value or a path of this machine's disk, signs it with the device's mesh key and adds it to refs/majordomus/continuity. Touches no branch, index or working tree, and no network: a sync publishes it.
- command
- experimental
- benchmark waived: destructive
- cache disabled
- MCP tool majordomus_continuity_publish
- $ continuity publish
example default
Try it
The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.
curl -s -X POST "http://127.0.0.1:8741/api/v1/continuity/publish" -H "content-type: application/json" -d '{}'Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.
Responses
| status | body | meaning |
| 200 |
Published |
Publish this checkout's newest handover for another machine: the result. |
| 400 |
ErrorBody |
invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects. |
| 404 |
ErrorBody |
not_found: The input names something the repository does not hold. |
| 422 |
ErrorBody |
refused: The command was understood and turned down for the reason the message gives. |
| 500 |
ErrorBody |
internal: The capability failed for a reason of its own; the message names it. |
| default |
ErrorBody |
Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object. |
Every published handover the local store admits
Every record of refs/majordomus/continuity that passed admission — schema, id, signature, repository identity, portability — by line, with each line's heads, and a diagnostic for every file refused and every lineage defect.
- query
- experimental
- benchmark required
- cache disabled
- MCP tool majordomus_continuity_records
- $ continuity records
No parameters.
Try it
The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.
curl -s "http://127.0.0.1:8741/api/v1/continuity/records"
Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.
Responses
| status | body | meaning |
| 200 |
Records |
Every published handover the local store admits: the result. |
| 400 |
ErrorBody |
invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects. |
| 404 |
ErrorBody |
not_found: The input names something the repository does not hold. |
| 500 |
ErrorBody |
internal: The capability failed for a reason of its own; the message names it. |
| default |
ErrorBody |
Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object. |
Resume a handover another machine published
Plans exactly as continuity.plan does and acts only on a ready or ready_with_warnings plan: writes the handover into this checkout's handovers (where handover --resolve and the session briefing find it), appends the task's decisions to the decision log once each, and records the record as the one this checkout continues, so that its next publication extends the same line. Runs nothing the record says; the start command for the task is returned as a recommendation.
- command
- experimental
- benchmark waived: destructive
- cache disabled
- MCP tool majordomus_continuity_resume
- $ continuity resume
example by-prefix
example default
Try it
The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.
curl -s -X POST "http://127.0.0.1:8741/api/v1/continuity/resume" -H "content-type: application/json" -d '{"record":"0000"}'Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.
Responses
| status | body | meaning |
| 200 |
Resumed |
Resume a handover another machine published: the result. |
| 400 |
ErrorBody |
invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects. |
| 404 |
ErrorBody |
not_found: The input names something the repository does not hold. |
| 422 |
ErrorBody |
refused: The command was understood and turned down for the reason the message gives. |
| 500 |
ErrorBody |
internal: The capability failed for a reason of its own; the message names it. |
| default |
ErrorBody |
Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object. |
Where this device stands in the work published from every device
This device and repository identity, the record this checkout continues on its branch, how the local continuity store stands towards the remote's (from the refs alone, no network), every line of work with its heads, the handovers other devices published that this checkout could resume, and every refused record or broken lineage as a diagnostic. A diverged line — the same work continued twice — is reported; separate lines of work on separate devices are not a conflict.
- query
- experimental
- benchmark required
- cache disabled
- MCP tool majordomus_continuity_status
- $ continuity status
No parameters.
Try it
The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.
curl -s "http://127.0.0.1:8741/api/v1/continuity/status"
Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.
Responses
| status | body | meaning |
| 200 |
Status |
Where this device stands in the work published from every device: the result. |
| 400 |
ErrorBody |
invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects. |
| 404 |
ErrorBody |
not_found: The input names something the repository does not hold. |
| 500 |
ErrorBody |
internal: The capability failed for a reason of its own; the message names it. |
| default |
ErrorBody |
Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object. |
Exchange published handovers with a git remote
Fetches the remote's refs/majordomus/continuity, merges it into the local store as the union of both (records are content-addressed, so a name holding different bytes is reported and the local copy kept), and pushes the result, never forced. Reports each line as equal, remote_newer, local_newer, diverged, local_only or remote_only. An unreachable remote changes nothing and leaves what is pending pending.
- command
- experimental
- benchmark waived: external_dependency
- cache disabled
- MCP tool majordomus_continuity_sync
- $ continuity sync
Request body — SyncInput, JSON
example default
Try it
The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.
curl -s -X POST "http://127.0.0.1:8741/api/v1/continuity/sync" -H "content-type: application/json" -d '{}'Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.
Responses
| status | body | meaning |
| 200 |
Synced |
Exchange published handovers with a git remote: the result. |
| 400 |
ErrorBody |
invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects. |
| 404 |
ErrorBody |
not_found: The input names something the repository does not hold. |
| 422 |
ErrorBody |
refused: The command was understood and turned down for the reason the message gives. |
| 500 |
ErrorBody |
internal: The capability failed for a reason of its own; the message names it. |
| default |
ErrorBody |
Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object. |
Schemas
The components only this tag's operations use. Each row is the type's own field, its doc comment the description; a type another page owns links there.
Component
"handover" | "intent" | "issue" | "decisions" | "next_action" | "lineage" | "provenance" | "worktree" | "repository_id" | "episode" | "working_context" | "source_state"
What a resume writes, recomputes or leaves.
handoverThe handover, into this checkout's handovers.intentThe task's title and scope, offered as the start to run.issueThe issue and milestone.decisionsThe decisions the task recorded, into this checkout's decision log.next_actionThe handover's next action.lineageThe record this checkout continues: the parent of its next publication.provenanceWho published it, where, when, from which source state.worktreeThis checkout's path, recomputed rather than copied.repository_idThe repository id the shell compares, recomputed.episodeThe episode, opened here by the provider's hooks.working_contextThe working context, compiled here from the restored records and this git.source_stateThe source state, from this checkout's git.
Used by ResumePlan
Continuity
object
What the lifecycle of this checkout is holding.
| property | type | required | description |
| present |
boolean |
yes |
Whether this checkout's lifecycle has ever run: a ledger line, a task, an episode or
a record. False in a fresh clone, which is not a fault.
It is not "the directory exists". Several things create that directory before
anything has been recorded in it, so a reader that took its presence for evidence
would be told the lifecycle had run in a checkout where it never had. |
| worktree |
string |
yes |
The worktree this answer is about. Every selection below is scoped to it. |
| branch |
string |
yes |
The branch, or DETACHED. |
| head |
string |
no |
The commit this checkout is on. |
| working_tree |
string |
no |
clean or dirty. |
| session |
OpenSession | null → OpenSession |
no |
The open episode, or None. |
| task |
ActiveTask | null → ActiveTask |
no |
The active task, or None. |
| handover |
Record | null → Record |
no |
The record the next worker would resume from, or None when nothing resolves here. |
| checkpoint |
Record | null → Record |
no |
The newest progress note for this worktree and branch, or None. |
| blockers |
array of string |
no |
Unresolved questions on this branch. Every one refuses finish --outcome completed,
whichever task opened it. |
| tallies |
map of integer (uint) |
yes |
How many records of each kind this checkout holds, against the policy's caps. |
| findings |
array of string |
no |
What a reader should know before trusting any of the above: a diverged record, a
foreign open session, a malformed file that was skipped. Empty is the good case. |
Used by continuity.state
Device
object
The device a record was written on: the mesh node key's id and the label its identity
file carries. The label is presentation; the node id is identity.
| property | type | required | description |
| node |
string |
yes |
The node id: the first 32 hex of the SHA-256 of the device's Ed25519 public key. |
| label |
string |
yes |
The display label of the device's identity file (macbook-pro), or the first eight
hex of its node id when it has none. |
Used by DeviceView RecordView Status
DeviceInput
object
The input of continuity.device.
| property | type | required | description |
| label |
string | null |
no |
A label to give this device (macbook-pro, mac-mini): letters, digits, ., _,
-. The key, and so the identity, is unchanged. |
Used by continuity.device
DeviceView
object
The answer of continuity device.
| property | type | required | description |
| device |
Device → Device |
yes |
The node id and label. |
| public_key |
string |
yes |
The Ed25519 public key (hex): what a trust list names. |
Used by continuity.device
LineState
"linear" | "diverged"
Whether a line has one current record or several.
linearOne head: the line continues from it.divergedMore than one head: the same work was continued in more than one place.
Used by LineView
LineSync
"equal" | "remote_newer" | "local_newer" | "diverged" | "local_only" | "remote_only"
How the local store and a remote's stand towards each other, for one line.
equalBoth hold the same heads.remote_newerThe remote holds records that continue the local heads: fetching brings them.local_newerThe local store holds records that continue the remote's: publishing sends them.divergedEach holds a continuation the other lacks: after merging, the line has two heads.local_onlyOnly the local store holds the line.remote_onlyOnly the remote holds the line.
Used by LineSyncView
LineSyncView
object
One line's comparison in a sync.
| property | type | required | description |
| line |
string |
yes |
The line. |
| relation |
LineSync → LineSync |
yes |
How the local store and the remote's stood before the merge. |
| heads |
array of string |
yes |
The line's heads after the merge. |
Used by Synced
LineView
object
A line of work as status shows it.
| property | type | required | description |
| id |
string |
yes |
The line id. |
| state |
LineState → LineState |
yes |
Linear or diverged. |
| records |
integer (uint) |
yes |
How many records it holds. |
| heads |
array of RecordView → RecordView |
yes |
Its heads. |
Used by Records Status
Match
"same_worktree_same_branch" | "same_branch"
Which tier of the resolution rule matched. There is no third tier on purpose: a record
from an unrelated worktree or branch is never offered.
same_worktree_same_branchSame repository, same worktree, same branch.same_branchSame repository, same branch, another worktree of it.
Used by Record
OpenSession
object
The open episode this checkout points at, when there is one.
One execution episode belongs to one provider session, and several can be open in one
checkout at once — two windows of the same provider are two workers. What is read here
is state/session-current.yaml, the pointer to the episode of this checkout; a worker
that knows its own provider session resolves its own episode instead, which is what
mj_session_here_file in lib/common.sh does and what stamps each ledger line.
| property | type | required | description |
| session_id |
string |
yes |
The episode's id. |
| started_at |
string |
yes |
When it opened. |
| owner |
string |
no |
Who opened it. |
| worker |
string |
no |
The worker identity, when one was supplied. Never inferred. |
| provider |
string |
no |
The provider whose event opened it, when one did. |
| provider_session |
string |
no |
That provider's own session identity — the string the prompt archive stamps on the
same worker's records, and the name this episode is keyed by. Empty for an episode
opened by hand, which is the one episode no provider session owns. |
| branch |
string |
no |
The branch it opened on. |
| start_head |
string |
no |
The commit it opened at. |
| foreign |
boolean |
yes |
True when the open record here belongs to another checkout. Such a record is
reported and never treated as this checkout's episode. |
Used by Continuity
PlanItem
object
One thing a plan says about itself.
| property | type | required | description |
| code |
string |
yes |
A stable code: source_incomplete, line_diverged, origin_untrusted, … |
| message |
string |
yes |
What it means here. |
Used by ResumePlan
PlanStatus
"ready" | "ready_with_warnings" | "requires_source_update" | "conflict" | "choose_record" | "nothing_to_resume" | "refused"
The verdict of a resume plan.
readyResume restores everything; nothing needs attention.ready_with_warningsResume restores everything; the warnings say what is not what it was at the origin.requires_source_updateThe local source does not hold what the record was written against: update git
first, as the actions say.conflictThe same work was continued twice, or the source histories diverged: a person
chooses.choose_recordMore than one record could be meant: name one with --record.nothing_to_resumeNothing to resume.refusedThe record is not one this checkout may resume from (an untrusted signer).
Used by ResumePlan
Position
object
The record this checkout continues on one branch.
| property | type | required | description |
| line |
string |
yes |
The line. |
| record |
string |
yes |
The record: the parent of this checkout's next publication on the branch. |
| via |
Via → Via |
yes |
Published here or resumed here. |
| at |
string |
yes |
When, by this machine's clock. |
Used by Resumed Status
PublishInput
object
The input of continuity.publish.
| property | type | required | description |
| handover |
string | null |
no |
The file name of a handover record under .ai/local/state/handovers/; the newest
when absent. |
| issue |
string | null |
no |
The issue the work belongs to (#184, I0042). |
| milestone |
string | null |
no |
The milestone it belongs to. |
Used by continuity.publish
Published
object
The answer of continuity publish.
| property | type | required | description |
| record |
RecordView → RecordView |
yes |
The record. |
| written |
boolean |
yes |
False when the same handover at the same source state was already the record this
checkout stands on: nothing new was written. |
| tip |
string |
yes |
The local ref's commit. |
| handover |
string |
yes |
The handover record it was read from, relative to the checkout. |
| next |
array of string |
yes |
What is next: the record reaches another machine only through a sync. |
Used by continuity.publish
Record
object
One durable record of the local half, as much of it as a reader needs to decide whether
to open the file.
| property | type | required | description |
| path |
string |
yes |
Repository-relative path. The body is at the path; it is not copied here. |
| created_at |
string |
yes |
When the record says it was written. |
| task_id |
string |
yes |
The task it belongs to, or none. |
| branch |
string |
yes |
The branch it was written on. |
| head |
string |
yes |
The commit it was written at. |
| working_tree |
string |
yes |
Whether the working tree was clean or dirty then. |
| matched |
Match → Match |
yes |
Which tier of the resolution rule matched. |
| divergence |
Divergence → Divergence |
yes |
How far its commit is from this one. |
| freshness |
Freshness → Freshness |
yes |
How old it is, judged against session.freshness. Independent of divergence: a
record is routinely advanced and stale at once, and that pair is what a reader
must not collapse into "trustworthy". |
| age_minutes |
integer | null |
no |
Its age in whole minutes, when it has a timestamp that parses. |
| freshness_reason |
string |
yes |
Why it was judged that way, in one phrase. Never empty: a verdict a reader cannot
act on is the failure this subsystem is being corrected for. |
| next_action |
string |
no |
The section a resuming worker acts on, when the record has one and is still current.
A handover's Next Action; empty for a record that carries no sections, and
deliberately empty for one that is stale or invalid — see next_action_withheld. |
| next_action_withheld |
string |
no |
Why next_action is empty despite the record having one. Set only when it was
withheld, never when the record simply carries no such section, so that a reader can
tell "there is nothing to do" from "what there was to do is six days old". |
Used by Continuity
RecordInput
object
The input of continuity.plan and continuity.resume: which record, by id or a prefix
of one. Absent, the one handover another device published that this checkout has not
resumed — on this branch when there is one there.
| property | type | required | description |
| record |
string | null |
no |
A record id, or a unique prefix of one. |
Used by continuity.resume
RecordView
object
One record as every surface shows it.
| property | type | required | description |
| id |
string |
yes |
The record id. |
| line |
string |
yes |
Its line. |
| parent |
string | null |
no |
The record it continues. |
| device |
Device → Device |
yes |
The device that published it. |
| this_device |
boolean |
yes |
Whether that device is this one. |
| trust |
Trust → Trust |
yes |
Whether its signer is trusted here. |
| session |
string | null |
no |
The episode it was published from. |
| branch |
string | null |
no |
The branch it was written on. |
| head |
string | null |
no |
The commit it was written at. |
| working_tree |
WorkingTree → WorkingTree |
yes |
Clean or dirty at the origin. |
| changed_total |
integer (uint) |
yes |
How many paths differed from HEAD at the origin. |
| published_at |
string |
yes |
When it was published, by the publisher's clock. |
| age_minutes |
integer | null |
no |
Minutes since then, by this machine's clock; absent when either clock's reading is
unusable. |
| task |
string | null |
no |
The task's title: the intent. |
| issue |
string | null |
no |
The issue. |
| objective |
string |
no |
The handover's # Objective, first line. |
Used by LineView Published Records ResumePlan Status Synced
Records
object
The answer of continuity records.
| property | type | required | description |
| records |
array of RecordView → RecordView |
yes |
Every admitted record, by line and then by id. |
| lines |
array of LineView → LineView |
yes |
Every line. |
| diagnostics |
array of Diagnostic → Diagnostic |
yes |
Refused files and lineage findings. |
Used by continuity.records
Relation
"equal" | "newer" | "older" | "diverged" | "independent"
What one record is to another.
equalThe same record.newerThe second descends from the first: the second is newer.olderThe first descends from the second: the second is older.divergedSame line, neither descends from the other: the work was continued twice.independentDifferent lines: separate work.
Used by ResumePlan
ResumePlan
object
The answer of continuity plan, and the plan continuity resume acts on.
| property | type | required | description |
| status |
PlanStatus → PlanStatus |
yes |
The verdict. |
| record |
RecordView | null → RecordView |
no |
The record it is about. |
| candidates |
array of RecordView → RecordView |
no |
When the record is not decided: the records that could be meant. |
| source |
SourceCheck | null → SourceCheck |
no |
The source check. |
| lineage |
Relation | null → Relation |
no |
What the record is to the record this checkout stands on, when it stands on one. |
| task |
TaskRef | null → TaskRef |
no |
The task, as published: the intent. |
| milestone |
string | null |
no |
The milestone. |
| decisions |
array of string |
no |
The headings of the decisions a resume carries. |
| objective |
string |
no |
The handover's # Objective. |
| current_state |
string |
no |
The handover's # Current State. |
| next_action |
string |
no |
The handover's # Next Action. |
| blockers |
array of PlanItem → PlanItem |
yes |
What stops a resume. |
| warnings |
array of PlanItem → PlanItem |
yes |
What a resume proceeds past and a person should know. |
| actions |
array of string |
yes |
The commands that resolve the blockers or follow the resume. Recommended, never run:
nothing a record says is executed. |
| restores |
array of Component → Component |
yes |
What a resume writes into this checkout. |
| recomputes |
array of Component → Component |
yes |
What this checkout computes for itself instead of copying. |
Used by continuity.plan Resumed
Resumed
object
The answer of continuity resume.
| property | type | required | description |
| resumed |
boolean |
yes |
Whether anything was restored. False when the plan did not admit a resume. |
| plan |
ResumePlan → ResumePlan |
yes |
The plan it acted on, or declined on. |
| handover |
string | null |
no |
The handover record written into this checkout, relative to it. |
| decisions_carried |
integer (uint) |
yes |
How many decisions were appended to this checkout's log. |
| position |
Position | null → Position |
no |
The record this checkout now stands on. |
Used by continuity.resume
SourceCheck
object
The source half of a plan.
| property | type | required | description |
| expected_branch |
string | null |
no |
The branch the record was written on. |
| expected_head |
string | null |
no |
The commit it was written at. |
| local_branch |
string | null |
no |
This checkout's branch. |
| local_head |
string | null |
no |
This checkout's commit. |
| relation |
SourceRelation → SourceRelation |
yes |
How they stand. |
| origin_dirty |
boolean |
yes |
Whether the origin's tree was dirty. |
| origin_changed |
array of string |
no |
The paths that were uncommitted at the origin, as listed. |
| origin_changed_total |
integer (uint) |
yes |
How many were uncommitted. |
| local_dirty |
boolean |
yes |
Whether this checkout's tree is dirty. |
| same_uncommitted_work |
boolean | null |
no |
Whether this checkout holds the very uncommitted work the origin held (their
fingerprints agree); absent when either side is clean. |
Used by ResumePlan
SourceRelation
"exact" | "local_ahead" | "local_behind" | "diverged" | "head_missing" | "branch_differs" | "unknown"
How the local source stands towards the record's.
exactSame branch, same commit.local_aheadSame branch; the local branch has commits the record did not see.local_behindSame branch; the record's commit is ahead of the local one.divergedSame branch; neither commit contains the other.head_missingThe record's commit is not in this clone.branch_differsThis checkout is on another branch.unknownThe record carries no commit, or git could not answer.
Used by SourceCheck
Status
object
The answer of continuity status.
| property | type | required | description |
| repository |
string |
yes |
This repository's identity (32 hex), the same on every clone. |
| device |
Device → Device |
yes |
This device. |
| branch |
string |
yes |
The branch this checkout is on, or DETACHED. |
| head |
string | null |
no |
The commit it is on. |
| working_tree |
WorkingTree → WorkingTree |
yes |
Clean or dirty. |
| position |
Position | null → Position |
no |
The record this checkout continues on its branch. |
| store |
StoreView → StoreView |
yes |
The stores. |
| last_sync |
SyncNote | null → SyncNote |
no |
The last sync, as this checkout recorded it. |
| lines |
array of LineView → LineView |
yes |
Every line, by id. |
| resumable |
array of RecordView → RecordView |
yes |
What other devices published that this checkout could resume, newest first. |
| diagnostics |
array of Diagnostic → Diagnostic |
yes |
Refused files, broken lineage, diverged lines. |
| next |
array of string |
no |
The command to run next, when there is an obvious one. |
Used by continuity.status
StoreView
object
The two stores, as refs.
| property | type | required | description |
| reference |
string |
yes |
The local ref. |
| tip |
string | null |
no |
Its commit. |
| remote |
string | null |
no |
The remote sync uses. |
| remote_tip |
string | null |
no |
The commit last fetched from or pushed to it. |
| sync |
SyncState → SyncState |
yes |
How they stand. |
| records |
integer (uint) |
yes |
Records admitted. |
| refused |
integer (uint) |
yes |
Files refused. |
Used by Status Synced
SyncAction
"none" | "fetched" | "published" | "exchanged" | "unreachable" | "no_remote"
What a sync did.
noneNothing to move: both held the same records.fetchedRecords were fetched.publishedRecords were published.exchangedBoth.unreachableThe remote could not be reached; nothing local changed, and what is pending stays
pending.no_remoteNo remote is configured.
Used by Synced
SyncInput
object
The input of continuity.sync.
| property | type | required | description |
| remote |
string | null |
no |
The git remote; the current branch's, else origin, when absent. |
Used by continuity.sync
SyncNote
object
What the last sync did, so that a later status can report it without the network.
| property | type | required | description |
| remote |
string |
yes |
The remote. |
| at |
string |
yes |
When, by this machine's clock. |
| outcome |
string |
yes |
ok, or unreachable when the remote could not be asked. |
| detail |
string | null |
no |
What git said when it was not ok. |
Used by Status
SyncState
"no_remote" | "never_synced" | "in_sync" | "pending" | "behind" | "diverged" | "empty"
How the local store stands towards the remote's, from the refs alone — no network.
no_remoteNo remote is configured: the store is local, and that is a valid answer.never_syncedNever synced with the remote.in_syncBoth hold the same records.pendingThis store holds records the remote has not received: a sync publishes them.behindThe last fetch brought records not merged yet.divergedBoth of the above.emptyThe store is empty and nothing was ever fetched.
Used by StoreView
Synced
object
The answer of continuity sync.
| property | type | required | description |
| remote |
string | null |
no |
The remote, when there is one. |
| action |
SyncAction → SyncAction |
yes |
What happened. |
| fetched |
integer (uint) |
yes |
Records the local store gained. |
| published |
integer (uint) |
yes |
Records the remote gained. |
| lines |
array of LineSyncView → LineSyncView |
yes |
Every line either side holds, compared. |
| store |
StoreView → StoreView |
yes |
The store after the sync. |
| resumable |
array of RecordView → RecordView |
yes |
What other devices published that this checkout could resume. |
| diagnostics |
array of Diagnostic → Diagnostic |
yes |
Refused files, collisions, diverged lines, an unreachable remote. |
Used by continuity.sync
TaskRef
object
The task the handover was written under, as the task record named it.
| property | type | required | description |
| id |
string |
yes |
The task id, t-<stamp>-<hex>. |
| title |
string |
yes |
What the task is, in its author's words: the intent. |
| profile |
string | null |
no |
The profile it ran under. |
| scope |
array of string |
no |
The repository paths it may touch. |
| outcome |
string | null |
no |
The outcome the task record held when the handover was published. |
Used by ResumePlan
Trust
"this_device" | "trusted" | "untrusted" | "undeclared"
Whether the device that signed a record is one this repository trusts.
this_deviceThis device signed it.trustedThe mesh declaration's trust list admits the key.untrustedThe mesh declaration exists and does not admit the key: never resumed from.undeclaredThe repository declares no mesh, so no list exists to check the key against. The
signature still binds the record to its key; the plan warns.
Used by RecordView
Via
"published" | "resumed"
How this checkout came to stand on a record.
publishedThis checkout published it.resumedThis checkout resumed from it.
Used by Position
WorkingTree
"clean" | "dirty"
Whether the working tree had changes git does not hold in a commit.
cleanNothing outside HEAD.dirtyModified, staged or untracked files that HEAD does not hold.
Used by RecordView Status