Files
mesh-delivery/contracts/seats/git/seat.json
T
jschoubben 0c37cd6402 CT6: the seat git: its verbs with callers and error answers, tag, its events with hyphens, branch-moved kept
Builds: design 47 G §310, §311, §312 (an error answer fixture per verb), §313
(status, comment, view, note the forge bridge alone; merge-pull persons and
sessions; the reads invokers), §370 (tag, callers the builder), §396 (event names
with hyphens), §331 (branch-moved 64 MiB, 90 days), §11, §39 (state failed-steps),
§129, §111 (statuses, status), §391 (class).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:46:26 +01:00

1569 lines
47 KiB
JSON

{
"format": 1,
"seat": "git",
"scope": "mesh",
"grain": "whole",
"domain": "Delivery",
"decision": "novox/hq ADR 0111",
"description": "The forge: every read and act a delivery part makes of the mesh's git repositories, and what the forge says happened (design 47 *The seat git*, ADR 0596 \u00a71, \u00a72). A failed read answers an error, never an empty answer. The act verbs are the forge bridge's alone.",
"delivers": "git",
"verbs": [
{
"name": "pull",
"description": "One pull request, by its repository and number or by its merge commit: its number, base, head branch, head, merge commit, author and state; for an open one, also what the forge would merge now (merging). A pull request the forge does not hold answers an error naming it.",
"input": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"number": {
"type": "integer",
"description": "its number"
},
"merge-commit": {
"type": "string",
"description": "instead of the number: the merge commit it made"
}
},
"additionalProperties": false,
"required": [
"repository"
]
},
"answer": {
"type": "object",
"properties": {
"pull": {
"$ref": "#/defs/Pull"
},
"merging": {
"$ref": "#/defs/Merging"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what pull answers; error and error-kind alone when it fails"
},
"callers": [
"invokers"
],
"class": "read"
},
{
"name": "branch",
"description": "A branch's head, and whether a protection rule refuses a direct push and admits only merges (design 47 *The seat git*, *Watched branches and the catalog graph per branch*). A branch the forge does not hold answers the error kind not-found.",
"input": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"branch": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false,
"required": [
"repository",
"branch"
]
},
"answer": {
"type": "object",
"properties": {
"repository": {
"type": "string"
},
"branch": {
"type": "string"
},
"head": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"protected": {
"type": "boolean",
"description": "a protection rule refuses a direct push and admits only merges"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what branch answers; error and error-kind alone when it fails"
},
"callers": [
"invokers"
],
"class": "read"
},
{
"name": "open-pulls",
"description": "Every open pull request of every repository, its head and base, the statuses its base's protection requires and those its head has.",
"input": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"answer": {
"type": "object",
"properties": {
"pulls": {
"type": "array",
"items": {
"$ref": "#/defs/OpenPull"
},
"description": "every open pull request; said empty when none is open, so an answer that lacks it is never read as none"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what open-pulls answers; pulls always said, empty when none is open; error and error-kind beside an empty pulls when it fails",
"required": [
"pulls"
]
},
"callers": [
"invokers"
],
"class": "read"
},
{
"name": "tags",
"description": "A repository's tags, a page at a time, newest first; the page's bound is said, and more when another page exists.",
"input": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"prefix": {
"type": "string",
"description": "only tags starting with it"
},
"page": {
"type": "integer",
"description": "the page, from 1"
}
},
"additionalProperties": false,
"required": [
"repository"
]
},
"answer": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "the tags of this page"
},
"page": {
"type": "integer",
"description": "the page"
},
"bound": {
"type": "integer",
"description": "how many tags a page holds"
},
"more": {
"type": "boolean",
"description": "another page exists"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what tags answers; error and error-kind alone when it fails"
},
"callers": [
"invokers"
],
"class": "read"
},
{
"name": "trees",
"description": "The trees of one commit: the root tree and the tree of every directory that holds a module.json, by their git hashes; with files, every blob under each named directory; with paths, the object of each named path. A listing the forge cut is refused, never answered in part.",
"input": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"commit": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"paths": {
"type": "object",
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "{directory: [path relative to it]}; the root is the empty name"
},
"files": {
"type": "array",
"items": {
"type": "string"
},
"description": "directories whose every blob is answered; the root is the empty name"
}
},
"additionalProperties": false,
"required": [
"repository",
"commit"
]
},
"answer": {
"type": "object",
"properties": {
"commit": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"root": {
"type": "string",
"description": "the root tree's hash"
},
"trees": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "directory to its tree's hash, the root as the empty name"
},
"files": {
"type": "object",
"additionalProperties": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"description": "directory to {path: blob id}"
},
"paths": {
"type": "object",
"additionalProperties": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"description": "directory to {path: object id}"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what trees answers; error and error-kind alone when it fails"
},
"callers": [
"invokers"
],
"class": "read"
},
{
"name": "file",
"description": "One file at one commit, branch or tag, decoded; a file over 512 KiB is refused. An absent file is answered absent only when the forge said so.",
"input": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"path": {
"type": "string",
"description": "the file's path from the repository's root",
"minLength": 1
},
"ref": {
"type": "string",
"description": "a commit, branch or tag; the default branch when absent"
}
},
"additionalProperties": false,
"required": [
"repository",
"path"
]
},
"answer": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "the path"
},
"ref": {
"type": "string",
"description": "what was read"
},
"blob": {
"type": "string",
"description": "the file's git blob id"
},
"size": {
"type": "integer",
"description": "its size in bytes"
},
"content": {
"type": "string",
"description": "its content"
},
"absent": {
"type": "boolean",
"description": "the forge holds no such file there"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what file answers; error and error-kind alone when it fails"
},
"callers": [
"invokers"
],
"class": "read"
},
{
"name": "contains",
"description": "Whether one commit contains another: an ancestor of it, or the same.",
"input": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"commit": {
"type": "string",
"description": "the commit asked about",
"minLength": 1
},
"in": {
"type": "string",
"description": "the commit it may be contained in",
"minLength": 1
}
},
"additionalProperties": false,
"required": [
"repository",
"commit",
"in"
]
},
"answer": {
"type": "object",
"properties": {
"commit": {
"type": "string",
"description": "the commit"
},
"in": {
"type": "string",
"description": "the other"
},
"contains": {
"type": "boolean",
"description": "in contains commit"
},
"ahead": {
"type": "integer",
"description": "how many commits commit is ahead of in"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what contains answers; error and error-kind alone when it fails"
},
"callers": [
"invokers"
],
"class": "read"
},
{
"name": "statuses",
"description": "The statuses a commit carries, the newest of each context.",
"input": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"commit": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
}
},
"additionalProperties": false,
"required": [
"repository",
"commit"
]
},
"answer": {
"type": "object",
"properties": {
"commit": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"combined": {
"type": "string",
"description": "the forge's combined state"
},
"statuses": {
"type": "array",
"items": {
"$ref": "#/defs/Status"
},
"description": "the newest of each context"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what statuses answers; error and error-kind alone when it fails"
},
"callers": [
"invokers"
],
"class": "read"
},
{
"name": "status",
"description": "Set a commit status. An act: its id is the caller's, and the same id said again sets it again to the same.",
"input": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id",
"minLength": 1
},
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"commit": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"context": {
"type": "string",
"description": "the context, such as mesh/check",
"minLength": 1
},
"state": {
"type": "string",
"description": "the state",
"enum": [
"pending",
"success",
"failure",
"error",
"warning"
]
},
"description": {
"type": "string",
"description": "what it says"
},
"target": {
"type": "string",
"description": "the page it links to"
}
},
"additionalProperties": false,
"required": [
"id",
"repository",
"commit",
"context",
"state"
]
},
"answer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id, as the caller gave it"
},
"performed": {
"type": "boolean",
"description": "the forge holds the act now"
},
"held": {
"type": "boolean",
"description": "the id was already held on the pull request or the note, so nothing was done again"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what status answers; error and error-kind alone when it fails"
},
"callers": [
"module:mesh-delivery-forge-bridge"
],
"class": "act"
},
{
"name": "comment",
"description": "Add a comment to a pull request. The comment carries the act's id, and an id the pull request already holds is skipped (held).",
"input": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id",
"minLength": 1
},
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"number": {
"type": "integer",
"description": "the pull request's number"
},
"text": {
"type": "string",
"description": "the comment, markdown",
"minLength": 1
}
},
"additionalProperties": false,
"required": [
"id",
"repository",
"number",
"text"
]
},
"answer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id, as the caller gave it"
},
"performed": {
"type": "boolean",
"description": "the forge holds the act now"
},
"held": {
"type": "boolean",
"description": "the id was already held on the pull request or the note, so nothing was done again"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what comment answers; error and error-kind alone when it fails"
},
"callers": [
"module:mesh-delivery-forge-bridge"
],
"class": "act"
},
{
"name": "view",
"description": "Keep the delivery's one view comment on a pull request: made the first time, edited in place after; it carries the act's id, and an id already held is skipped (held).",
"input": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id",
"minLength": 1
},
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"number": {
"type": "integer",
"description": "the pull request's number"
},
"text": {
"type": "string",
"description": "the view, markdown",
"minLength": 1
}
},
"additionalProperties": false,
"required": [
"id",
"repository",
"number",
"text"
]
},
"answer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id, as the caller gave it"
},
"performed": {
"type": "boolean",
"description": "the forge holds the act now"
},
"held": {
"type": "boolean",
"description": "the id was already held on the pull request or the note, so nothing was done again"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what view answers; error and error-kind alone when it fails"
},
"callers": [
"module:mesh-delivery-forge-bridge"
],
"class": "act"
},
{
"name": "note",
"description": "Append one line to a commit's note under refs/notes/mesh-plan. The line carries the act's id, and an id the note already holds is skipped (held).",
"input": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id",
"minLength": 1
},
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"commit": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"line": {
"type": "string",
"description": "the line, one line",
"minLength": 1
}
},
"additionalProperties": false,
"required": [
"id",
"repository",
"commit",
"line"
]
},
"answer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id, as the caller gave it"
},
"performed": {
"type": "boolean",
"description": "the forge holds the act now"
},
"held": {
"type": "boolean",
"description": "the id was already held on the pull request or the note, so nothing was done again"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what note answers; error and error-kind alone when it fails"
},
"callers": [
"module:mesh-delivery-forge-bridge"
],
"class": "act"
},
{
"name": "merge-pull",
"description": "Merge a pull request with the forge tools' account at the head the caller names (design 47 *Approval is a step, and a session merges a pull request*). It judges that this is still the pull request's head and that the base branch's protection refuses a direct push, read again on every branch-moved, and refuses a head when any run at its build-input fingerprint failed a required step, judged from its own state failed-steps heard from the runner's step-ended, never by a call; a head with no run yet or a passed one merges, it never waits for a run and never asks an Approve (ADR 0666 section 11). Refused, naming why: a head that moved, a branch no protection guards, a failed required step (naming the run, the module and the step), no registrations yet (ADR 0667 section 10), a merge git refuses. A pull request already merged at that head is answered performed.",
"input": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id",
"minLength": 1
},
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"number": {
"type": "integer",
"description": "the pull request's number"
},
"head": {
"type": "string",
"description": "the head the caller names",
"pattern": "^[0-9a-f]{40}$"
}
},
"additionalProperties": false,
"required": [
"id",
"repository",
"number",
"head"
]
},
"answer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "the act's id, as the caller gave it"
},
"performed": {
"type": "boolean",
"description": "the forge holds the act now"
},
"held": {
"type": "boolean",
"description": "the id was already held on the pull request or the note, so nothing was done again"
},
"merge-commit": {
"type": "string",
"description": "the merge commit"
},
"refused": {
"type": "string",
"description": "why the forge or the holder refused the merge; the act is not performed"
},
"refused-kind": {
"type": "string",
"enum": [
"head-moved",
"unprotected",
"policy-failed",
"no-registrations",
"git-refused"
],
"description": "which refusal, set with refused: head-moved, the pull request's head is not the one named; unprotected, the base branch's protection does not refuse a direct push; policy-failed, a run at the head's fingerprint failed a required step (run, module and step name it); no-registrations, no registration-changed heard yet (ADR 0667 section 10); git-refused, git refused the merge"
},
"run": {
"type": "string",
"description": "for policy-failed, the run that failed the step: the runner's pipeline key"
},
"module": {
"type": "string",
"description": "for policy-failed, the module"
},
"step": {
"type": "string",
"description": "for policy-failed, the step"
},
"error": {
"type": "string",
"description": "why the forge could not answer, or refused: set alone with error-kind, and a caller reads it as a failure, never as none"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what merge-pull answers; error and error-kind alone when it fails"
},
"callers": [
"persons",
"sessions"
],
"class": "act"
},
{
"name": "tag",
"class": "act",
"callers": [
"seat:mesh-builds"
],
"description": "Write the git tag of a released version, go/vMAJOR.MINOR.PATCH, at the commit its build was made from; the builder writes it only on the catalog's version-released (design 47 G section 370). A tag already at that commit is answered performed. An error answer carries error and error-kind.",
"input": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>"
},
"tag": {
"type": "string",
"description": "the tag"
},
"commit": {
"type": "string",
"description": "the commit it is written at"
}
},
"additionalProperties": false,
"required": [
"repository",
"tag",
"commit"
]
},
"answer": {
"type": "object",
"properties": {
"tag": {
"type": "string",
"description": "the tag, as asked"
},
"performed": {
"type": "boolean",
"description": "the forge holds the tag at that commit now"
},
"error": {
"type": "string",
"description": "why the forge could not write it: set alone with error-kind"
},
"error-kind": {
"$ref": "#/defs/ErrorKind"
}
},
"description": "what tag answers; error and error-kind alone when it fails"
}
}
],
"events": [
{
"name": "pull-updated",
"body": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"number": {
"type": "integer",
"description": "the pull request's number"
},
"branch": {
"type": "string",
"description": "its head branch"
},
"head": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"base": {
"type": "string",
"description": "the branch it merges into"
},
"title": {
"type": "string",
"description": "its title"
},
"author": {
"type": "string",
"description": "who opened it"
},
"url": {
"type": "string",
"description": "its page"
},
"base-head": {
"type": "string",
"description": "the base branch's head as the head was announced; absent when it could not be read"
},
"change": {
"$ref": "#/defs/Change"
}
},
"description": "a pull request's new head, announced once per head and trunk commit",
"required": [
"repository",
"number",
"branch",
"head",
"base"
]
}
},
{
"name": "pull-merged",
"body": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"number": {
"type": "integer",
"description": "the pull request's number"
},
"branch": {
"type": "string",
"description": "its head branch"
},
"head": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"base": {
"type": "string",
"description": "the branch it merges into"
},
"title": {
"type": "string",
"description": "its title"
},
"author": {
"type": "string",
"description": "who opened it"
},
"url": {
"type": "string",
"description": "its page"
},
"merge-commit": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"merged-at": {
"type": "string",
"description": "when",
"format": "date-time"
},
"change": {
"$ref": "#/defs/Change"
},
"head-checks": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "the head's statuses by context, their states; absent when they could not be read"
}
},
"description": "a pull request merged, announced once by its merge commit",
"required": [
"repository",
"number",
"branch",
"head",
"base",
"merge-commit"
]
}
},
{
"name": "pull-closed",
"body": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"number": {
"type": "integer",
"description": "the pull request's number"
},
"branch": {
"type": "string",
"description": "its head branch"
},
"head": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"base": {
"type": "string",
"description": "the branch it merges into"
},
"title": {
"type": "string",
"description": "its title"
},
"author": {
"type": "string",
"description": "who opened it"
},
"url": {
"type": "string",
"description": "its page"
}
},
"description": "a pull request closed without a merge, announced once by its head",
"required": [
"repository",
"number",
"branch",
"head",
"base"
]
}
},
{
"name": "forge-pull",
"body": {
"type": "object",
"properties": {
"action": {
"type": "string",
"description": "what the forge said: opened, reopened, synchronized, edited, closed, merged"
},
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"number": {
"type": "integer",
"description": "its number"
},
"branch": {
"type": "string",
"description": "its head branch"
},
"head": {
"type": "string",
"description": "its head commit"
},
"base": {
"type": "string",
"description": "its base branch"
},
"author": {
"type": "string",
"description": "who opened it"
},
"merged": {
"type": "boolean",
"description": "merged"
},
"merge-commit": {
"type": "string",
"description": "the merge commit"
},
"sender": {
"type": "string",
"description": "who acted"
}
},
"description": "the forge's own webhook of a pull request, trimmed; never its description",
"required": [
"action",
"repository",
"number"
]
}
},
{
"name": "forge-status",
"body": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"commit": {
"type": "string",
"description": "the commit"
},
"context": {
"type": "string",
"description": "the context"
},
"state": {
"type": "string",
"description": "the state"
},
"description": {
"type": "string",
"description": "what it says"
},
"sender": {
"type": "string",
"description": "who set it"
}
},
"description": "the forge's own webhook of a commit status",
"required": [
"repository",
"commit",
"context",
"state"
]
}
},
{
"name": "forge-delete",
"body": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"ref": {
"type": "string",
"description": "the deleted branch or tag"
},
"ref-type": {
"type": "string",
"description": "branch or tag"
},
"sender": {
"type": "string",
"description": "who deleted it"
}
},
"description": "the forge's own webhook of a deleted branch or tag",
"required": [
"repository",
"ref"
]
}
},
{
"name": "repo-writable",
"body": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"account": {
"type": "string",
"description": "the account that writes it now"
}
},
"description": "a repository the forge's account can write again",
"required": [
"repository",
"account"
]
}
},
{
"name": "branch-moved",
"body": {
"type": "object",
"description": "a branch's new head, by a merge or an admitted push, from the forge's push webhook (design 47 lines 507-512): its hearer takes the head from the forge's own record by the verb branch, never from this body",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"branch": {
"type": "string",
"minLength": 1
},
"head": {
"type": "string",
"description": "the head the webhook said, a commit's full 40-hex sha; read again by branch",
"pattern": "^[0-9a-f]{40}$"
},
"at": {
"type": "string",
"format": "date-time"
}
},
"required": [
"repository",
"branch"
]
},
"keep": {
"max-age-days": 90,
"max-mib": 64
}
}
],
"family": {
"name": "git.events",
"max-age-days": 7
},
"states": [
{
"name": "failed-steps",
"template": "state",
"history": 1,
"description": "each failed required step by module and build-input fingerprint, heard from the runner's step-ended; an entry is deleted once none of its commits is a watched branch's head or the head an open pull request names (design 47 *The runner's kept data*)",
"key-forms": [
{
"key": "<module>.<fingerprint>.<step>",
"value": {
"$ref": "#/defs/FailedStep"
},
"description": "a failed required step"
}
]
}
],
"defs": {
"Pull": {
"type": "object",
"properties": {
"repository": {
"type": "string",
"description": "the repository, <owner>/<name>",
"minLength": 1
},
"number": {
"type": "integer",
"description": "the pull request's number"
},
"title": {
"type": "string",
"description": "its title"
},
"author": {
"type": "string",
"description": "who opened it, the forge's login"
},
"branch": {
"type": "string",
"description": "its head branch: what a delivery group is named by"
},
"head": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"base": {
"type": "string",
"description": "the branch it merges into"
},
"state": {
"type": "string",
"description": "open, merged or closed",
"enum": [
"open",
"merged",
"closed"
]
},
"merge-commit": {
"type": "string",
"description": "the merge commit, once merged"
},
"merged-at": {
"type": "string",
"description": "when it merged",
"format": "date-time"
},
"url": {
"type": "string",
"description": "its page on the forge"
}
},
"description": "one pull request as the forge holds it; never its description (ADR 0659 \u00a71)",
"required": [
"repository",
"number",
"branch",
"head",
"base",
"state"
]
},
"Merging": {
"type": "object",
"properties": {
"mergeable": {
"type": "boolean",
"description": "the forge's own word on whether it merges into its base now: false while it is in conflict with its base, or while the forge works that out after the base moved"
},
"protected": {
"type": "boolean",
"description": "whether a protection rule guards its base branch"
},
"required": {
"type": "array",
"items": {
"type": "string"
},
"description": "the status contexts the base branch's protection requires; none when it requires none"
},
"writes": {
"type": "boolean",
"description": "whether the forge's merging account may write the repository: false, its statuses and its merge are refused"
}
},
"description": "what the forge would merge now, for an open pull request (issues 1275, 1945; ADR 0441 \u00a71): answered whole or not at all, and a read the forge could not make answers the verb's error, never a guess; absent for a merged or closed one",
"required": [
"mergeable",
"protected",
"required",
"writes"
]
},
"Status": {
"type": "object",
"properties": {
"context": {
"type": "string",
"description": "the status's context, such as mesh/check"
},
"state": {
"type": "string",
"description": "pending, success, failure, error or warning"
},
"description": {
"type": "string",
"description": "what it says"
},
"target": {
"type": "string",
"description": "the page it links to"
},
"at": {
"type": "string",
"description": "when it was set",
"format": "date-time"
},
"by": {
"type": "string",
"description": "who set it"
}
},
"description": "the newest status of one context on a commit",
"required": [
"context",
"state"
]
},
"OpenPull": {
"type": "object",
"properties": {
"pull": {
"$ref": "#/defs/Pull"
},
"required": {
"type": "array",
"items": {
"type": "string"
},
"description": "the contexts the base branch's protection requires; none when it requires none"
},
"checks": {
"type": "object",
"additionalProperties": {
"$ref": "#/defs/Status"
},
"description": "the head's statuses by context, the newest of each"
}
},
"description": "an open pull request, with the statuses its base requires and those its head has",
"required": [
"pull",
"required",
"checks"
]
},
"Change": {
"type": "object",
"properties": {
"paths": {
"type": "array",
"items": {
"type": "string"
},
"description": "the paths it changed"
},
"paths-truncated": {
"type": "boolean",
"description": "the forge cut the list"
},
"removed": {
"type": "array",
"items": {
"type": "string"
},
"description": "which of them it deleted"
},
"module-dirs": {
"type": "array",
"items": {
"type": "string"
},
"description": "the changed directories that hold a module at its head; absent when they could not be read"
}
},
"description": "what a pull request changed",
"required": [
"paths"
]
},
"ErrorKind": {
"type": "string",
"enum": [
"refused",
"not-found",
"failed"
],
"description": "which kind of error, set with error alone: refused, the forge or the holder refused and error says why in the forge's own words; not-found, the forge said that what was asked about (a repository, a commit, a pull request, a branch or a tag) does not exist, so a caller never reads it out of error's words; failed, the forge failed or could not be reached, so the act or read could not be performed"
},
"FailedStep": {
"type": "object",
"description": "a failed required step at a build-input fingerprint, with the commits it was seen at and the run that failed it (design 47 *Judged from its own state, never by a call*); cleared by a later passing rerun of that step whose proved caller is the operator or a healer",
"properties": {
"v": {
"type": "integer",
"description": "the layout version"
},
"module": {
"type": "string"
},
"fingerprint": {
"type": "string",
"description": "the build-input fingerprint the step failed at"
},
"step": {
"type": "string"
},
"artifact": {
"type": "string",
"description": "the artifact reference, <module>:<artifact>"
},
"run": {
"type": "string",
"description": "the run that failed it: the runner's pipeline key"
},
"commits": {
"type": "array",
"items": {
"type": "string",
"description": "a commit, its full 40-hex sha",
"pattern": "^[0-9a-f]{40}$"
},
"description": "every commit it was seen at"
},
"said": {
"type": "string",
"description": "why it failed, as the runner's step-ended said"
},
"at": {
"type": "string",
"format": "date-time"
}
},
"required": [
"module",
"fingerprint",
"step",
"run",
"commits"
]
}
}
}