The operator, 2026-10-27 23:54: "if you don't want me to approve it, don't send the approval request". The gate asked the Approve the moment a pull request opened, before its check answered, and five changes were approved unchecked. Now the ask waits for the checker's verdict at the heads it covers (a group's verdict of all its heads together; a placement change's verdict ends only once its nodes answered, ADR 0559 §5). A pass or a failure is asked, the failure in its words, since check-gates-merge false lets the operator merge it anyway. A check with no verdict 60 minutes after the heads became ready is asked anyway, saying so, and asked again in new words when its verdict comes. Quick fix (only the ask's wording) against thorough (the one place that decides when to ask, ungatedWaits): thorough, which is one place here.
153 lines
4.4 KiB
JSON
153 lines
4.4 KiB
JSON
{
|
|
"module": "mesh-delivery-gate",
|
|
"version": "1",
|
|
"slug": "gate",
|
|
"claims": [
|
|
{
|
|
"name": "mesh-delivery",
|
|
"scope": "mesh",
|
|
"serves": [
|
|
"deliveries",
|
|
"show",
|
|
"groups",
|
|
"checks",
|
|
"table",
|
|
"stalled",
|
|
"recheck",
|
|
"close",
|
|
"settle"
|
|
]
|
|
}
|
|
],
|
|
"consumes": [
|
|
"gitea.pull.updated",
|
|
"gitea.pull.merged",
|
|
"gitea.pull.closed",
|
|
"gitea.forge.status",
|
|
"gitea.forge.pull-request.edited",
|
|
"gitea.forge.pull-request.closed",
|
|
"mesh-delivery-forge-bridge.forge.**",
|
|
"mesh-config.config-changed",
|
|
"gitea.repo.writable"
|
|
],
|
|
"emits": [
|
|
"transition",
|
|
"group",
|
|
"merged"
|
|
],
|
|
"uses": [
|
|
"operator-channel"
|
|
],
|
|
"invokes": [
|
|
"gitea.gitea_commit_statuses",
|
|
"gitea.gitea_contains",
|
|
"gitea.gitea_open_pulls"
|
|
],
|
|
"state": [
|
|
"deliveries",
|
|
"groups",
|
|
"pulls",
|
|
{
|
|
"name": "asks",
|
|
"history": 5
|
|
},
|
|
{
|
|
"name": "merges",
|
|
"history": 10
|
|
},
|
|
{
|
|
"name": "owed",
|
|
"history": 5
|
|
},
|
|
{
|
|
"name": "source",
|
|
"history": 64
|
|
},
|
|
"conditions",
|
|
{
|
|
"name": "turns",
|
|
"history": 5
|
|
}
|
|
],
|
|
"reads": [
|
|
"mesh-delivery-teller.answers",
|
|
"mesh-delivery-checker.verdicts",
|
|
"mesh-delivery-view.reach"
|
|
],
|
|
"tools": [
|
|
"delivery_hand_now",
|
|
"delivery_merge_again",
|
|
"delivery_status",
|
|
"delivery_turns"
|
|
],
|
|
"config": {
|
|
"refusal-stall-floor-minutes": {
|
|
"type": "number",
|
|
"description": "minutes, at least, before a merge refused because its trunk moved, whose check the gate asked again, is said as stalled; twice the repository's last check time when that is longer (ADR 0505 §4).",
|
|
"minimum": 1,
|
|
"maximum": 1440,
|
|
"trusted": false,
|
|
"default": 10
|
|
},
|
|
"author-new-head-minutes": {
|
|
"type": "number",
|
|
"description": "minutes a delivery that needs its author's new head (a conflict, a failed check, a rejected group) waits for one before the operator hears of it (ADR 0505 §5).",
|
|
"minimum": 1,
|
|
"maximum": 10080,
|
|
"trusted": false,
|
|
"default": 120
|
|
},
|
|
"check-gates-merge": {
|
|
"type": "boolean",
|
|
"description": "Whether mesh/check gates the merge. True (the default): the operator's Approve is asked, and a merge handed, only on a passing verdict judged against the trunk's head, and a trunk's move puts a verdict out of date (ADR 0447, ADR 0505 §4). False (the operator, 2026-10-25 22:56: \"run the check locally only, but not as a gate, it loses us too much time\"; developers run the unit and integration levels locally before a pull request): a pull request reviewed at its head is ready, and its Approve is asked once the check at its heads (a group: of all its heads together) has a verdict, a pass or a failure said in the ask, or after 60 minutes with none, said so (the operator, 2026-10-27 23:54: \"if you don't want me to approve it, don't send the approval request\"); an approved merge waits for no verdict; no merge is refused for a check judged on an older trunk; a later verdict is shown on the pull request and the delivery, and asks a pending Approve again in its words; a group still merges all its members in one pass. Set it false together with the gitea module's check-gates-merge, which lets its merge tool merge an approved head without a passing mesh/check.",
|
|
"trusted": false,
|
|
"default": true
|
|
}
|
|
},
|
|
"resources": [
|
|
{
|
|
"id": "state",
|
|
"type": "directory",
|
|
"mode": "0700",
|
|
"place": ".",
|
|
"unknown": "program"
|
|
},
|
|
{
|
|
"id": "settings",
|
|
"type": "file",
|
|
"path": "${dir:state}/settings.json",
|
|
"mode": "0600",
|
|
"takes-config": [
|
|
"refusal-stall-floor-minutes",
|
|
"author-new-head-minutes",
|
|
"check-gates-merge"
|
|
],
|
|
"merge": "json",
|
|
"template": "files/settings.json"
|
|
}
|
|
],
|
|
"build": {
|
|
"artifacts": [
|
|
{
|
|
"name": "tools",
|
|
"kind": "bundle",
|
|
"language": "go",
|
|
"system": "arch",
|
|
"from": "cmd/mesh-delivery-gate",
|
|
"binary": "mesh-delivery-gate",
|
|
"loads": [
|
|
"mesh-delivery-gate"
|
|
],
|
|
"env": {
|
|
"MESH_DELIVERY_GATE_SETTINGS": "${dir:state}/settings.json"
|
|
}
|
|
},
|
|
{
|
|
"name": "files",
|
|
"kind": "archive",
|
|
"from": "files"
|
|
}
|
|
]
|
|
}
|
|
}
|