Files
mesh-contracts/seats/node-engine/seat.json
T
jschoubben 5b4239e6d9 SD-M3: the node-engine seat's read-only verb pull-waits (design 51, A7's ENG-9)
Optional until every engine serves it; answers each failed pull waiting on a store's holder.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
2026-11-04 12:19:52 +01:00

261 lines
10 KiB
JSON

{
"format": 1,
"seat": "node-engine",
"scope": "node",
"grain": "seat-list",
"decision": "novox/hq ADR 0563",
"held-by-the-engine": true,
"verbs": [
{
"name": "hand-over",
"description": "Hand a directory this machine uses as found to the mesh (novox/hq ADR 0563 §3, §5): the engine judges the path as it does every hand-over (absolute, as it states it, used as found, reached through no link) and refuses in words, or asks the operator on their channel at the level approve, binding the owner, group and mode it will set. Nothing changes on the call: only the operator's yes hands it over. One ask is open per path; acts shows where it stands.",
"input": {
"properties": {
"path": {
"description": "the directory's absolute path, as the engine states it",
"type": "string"
},
"why": {
"description": "why it is asked, in words the operator reads",
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
}
},
{
"name": "access-act",
"description": "Ask the operator for the take act on a library whose root holds data outside its group (novox/hq ADR 0328 §7, ADR 0563 §3, §4), on the library's home engine: the access as declared and its root as last declared, judged and refused in words or asked at the level approve. Only the operator's yes sets the library's group, group write and setgid under its root. One ask is open per access.",
"input": {
"properties": {
"access": {
"description": "the access, library:<name>",
"type": "string"
},
"act": {
"description": "the act: take",
"type": "string"
},
"why": {
"description": "why it is asked, in words the operator reads",
"type": "string"
}
},
"required": [
"act",
"access"
],
"type": "object"
}
},
{
"name": "judge-directories",
"description": "Which of this machine's declared directories the engine would refuse to make or keep, one line each (novox/hq ADR 0563 §2). Read-only: changes no owner or mode.",
"input": {
"properties": {},
"type": "object"
}
},
{
"name": "setuid-search",
"description": "Throw away the engine's last search for setuid programs and start a full one (novox/hq ADR 0563 §2); until it completes root-free answers that the machine is not judged yet. Refused while one runs, and when one was started within the hour, naming when the next may start.",
"input": {
"properties": {
"why": {
"description": "why it is asked, in words",
"type": "string"
}
},
"type": "object"
}
},
{
"name": "root-free",
"description": "Whether this machine is root-free (novox/hq ADR 0259 §8, ADR 0563 §6): free only on the engine's own verdict, at most fifteen minutes old, that the account agents run as cannot become root without a person, and the login shell's execute not served here. Anything else is no pass, and says why. Answered by this machine's engine alone.",
"input": {
"properties": {},
"type": "object"
}
},
{
"name": "acts",
"description": "Every act this machine's engine was asked through this seat (novox/hq ADR 0563 §9): each hand-over, access act and setuid search, open, done or refused, with who asked, the ask and the operator's warrant. Read-only.",
"input": {
"properties": {
"id": {
"description": "one act, by its id",
"type": "string"
},
"limit": {
"description": "at most this many, newest",
"type": "string"
}
},
"type": "object"
}
},
{
"name": "packages",
"description": "The packages this machine's compositions declare, present or absent, each with the modules that declare it, as the engine keeps them in its key of `packages`; until the controller hands its lease away, beside the controller's mirror for this machine and their difference. With write, the key written again from what the engine composed.",
"optional": true,
"input": {
"properties": {
"write": {
"description": "\"true\": write this machine's key again from what the engine composed",
"enum": [
"true",
"false"
],
"type": "string"
}
},
"type": "object"
}
},
{
"name": "composition",
"description": "One module's composition on this machine beside what runs of it, read-only: the composition its want's build has in the bucket composed-<node> (the latest revision, or the one whose digest is given, from the revisions the bucket keeps), the digest of each kept revision, what runs (applied, its have, or the kept declaration), its want and have (phase running, failed, held or waiting-yes, and the digest that waits for a yes), and the move's judgement with its words: why a record module waits for a yes. With diff, every resource added, removed or changed, a provider's received file naming the consumers that join or leave.",
"optional": true,
"input": {
"properties": {
"diff": {
"description": "\"true\": list the resources that differ from what runs",
"type": "string"
},
"digest": {
"description": "a composition's digest (sha256:…), to read that revision rather than the latest",
"type": "string"
},
"module": {
"description": "the module, as placed on this machine; node for the node's own",
"type": "string"
}
},
"required": [
"module"
],
"type": "object"
}
},
{
"name": "compose",
"description": "Compose this machine's modules now and say how it went, so a composition that failed, or a module held, recovers without a restart: what the pass refused or held, each with why, and when the engine composes again on its own after a seat that did not answer (a deadline, no responders: retried with a growing wait; a refusal never). With module, that module's apply is also tried again. Changes only what a pass the engine makes on its own would change.",
"optional": true,
"input": {
"properties": {
"module": {
"description": "a module placed on this machine whose apply is also tried again (optional)",
"type": "string"
}
},
"type": "object"
}
},
{
"name": "compose-candidate",
"description": "Compose a check's candidate on this machine in shadow, with its own sealed values and the indexer's manifest verdicts, and say per module placed here whether it composes (with its digest and whether the candidate changes it), is refused by the candidate or is held without it, each with why, and the verdict of the machine's own composition (novox/hq ADR 0593 §7). Read-only: applies nothing and writes nothing. Answered by this machine's engine alone, within the asker's bound.",
"optional": true,
"input": {
"properties": {
"candidate": {
"description": "the key of the indexer's candidate, <group>.<heads hash>",
"type": "string"
},
"input": {
"description": "\"true\": also answer the composition input the candidate was composed from, for the sandbox path",
"enum": [
"true",
"false"
],
"type": "string"
}
},
"required": [
"candidate"
],
"type": "object"
}
},
{
"name": "pull-waits",
"optional": true,
"description": "The failed pulls this machine's engine waits on a store's holder for (design 51 *What a pull meets in the swap*): per module, the image, the seat it came through and that seat's holder, when the pull began, how many settled events of that holder it heard and the last, and its last retry and what started it. Read-only. Answered by this machine's engine alone.",
"input": {
"type": "object",
"properties": {}
},
"answer": {
"type": "object",
"required": [
"waits"
],
"properties": {
"waits": {
"type": "array",
"description": "every failed pull waiting on a holder",
"items": {
"type": "object",
"required": [
"module",
"image"
],
"properties": {
"module": {
"type": "string",
"description": "the module whose apply failed"
},
"image": {
"type": "string",
"description": "the image whose pull failed"
},
"seat": {
"type": "string",
"description": "the seat the image came through"
},
"holder": {
"type": "string",
"description": "that seat's holder, whose settled the retry waits on"
},
"pull-began": {
"type": "string",
"description": "when the failed pull began, RFC 3339"
},
"settled-count": {
"type": "integer",
"description": "the settled events of the holder heard since the engine started"
},
"settled-last": {
"type": "string",
"description": "when the last was heard, RFC 3339"
},
"retry-last": {
"type": "string",
"description": "when it was last tried again, RFC 3339"
},
"retry-trigger": {
"type": "string",
"description": "what started that retry: settled, or the engine's start"
}
}
}
}
}
}
}
],
"events": [
{
"name": "asked"
},
{
"name": "done"
},
{
"name": "refused"
}
]
}