Met again 2026-10-25: group fix/puller-wakes-on-capacity was merged half. Three causes in the gate: - The next member's turn compared the group's state with "delivering", a word GroupState no longer says since release 6 renamed it "merging" (ready.go groupTurnToMerge). Once the first member's merge was heard from the forge the group read merging, and the second member waited for ever. Group states are now named constants, the turn goes on in ready and merging (groupMayMerge), and a test holds every word to it. - Members merged in id order, so mesh-catalog went before the mesh-sdk commit it pins. membersOf now orders by mergeRank: mesh-sdk first, then members that change no go.mod or go.sum, then those that do. - No condition was raised: the controller's self-check that read `stalled` went with release 6 (mesh-controller dc456d56). The gate now says its stalled lines as conditions itself on the operator-channel seat (ADR 0437 §9) after every look, clears those listed no more, and keeps which it raised in its new bucket conditions. A held group's line says "half merged" when a member merged. A pass held for a required status no longer retries on a timer: the status turning success is the event that asks the merge again.
136 lines
2.9 KiB
JSON
136 lines
2.9 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"
|
|
]
|
|
}
|
|
],
|
|
"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"
|
|
],
|
|
"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"
|
|
],
|
|
"reads": [
|
|
"mesh-delivery-teller.answers",
|
|
"mesh-delivery-checker.verdicts"
|
|
],
|
|
"tools": [
|
|
"delivery_status"
|
|
],
|
|
"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
|
|
}
|
|
},
|
|
"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"
|
|
],
|
|
"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"
|
|
}
|
|
]
|
|
}
|
|
}
|