Merge branch 'feat/r4g-asks' into feat/r4g

This commit is contained in:
2026-10-23 16:20:28 +02:00
32 changed files with 1063 additions and 55 deletions
+3 -21
View File
@@ -20,8 +20,8 @@
// writes it (check.ts; ADR 0521, R4e finding R2-1). No tool writes mesh/check (finding K1), and no event: the watch hands
// over the latest value of every key whenever this module starts.
//
// Consumes node-build-agent.started — a build machine took an ask — and says, on the head a pending check is of,
// which machine builds it since when (novox/hq issue 446). This module is the one writer of mesh/merge-gate.
// This module is the one writer of mesh/merge-gate. It hears no build seat's event: since R4g a check's steps are asks
// on the build seats' streams, whose backlog the delivery view shows (novox/hq ADR 0525 §9; issue 1887).
//
// **A trunk's move puts every open verdict into it out of date** (novox/hq ADR 0323 §4, trunk.ts): each pass reads the
// head of every trunk an open pull request merges into, and when one moved, the merge check statuses of every open pull
@@ -53,7 +53,7 @@ import { mergeTool } from "./merge.js";
import { GiteaAdmin, GiteaClient, movedSince } from "./client.js";
import { CHECK_CONTEXT, CHECK_STATUS, REPO_CHECK_CONTEXT, commentFor, composedGate, groupGateStatus, headsToAnnounce, maintained,
requiredOf, statusesFor, writesGate, type Announced, type Checked, repoCheckFacts, reposToLook } from "./pulls.js";
import { GateWriter, clonedAs, type BuildStarted } from "./gate.js";
import { GateWriter } from "./gate.js";
import { HOOK_PATH, HOOK_PORT, Pace, claimHead, ensureSystemHook, eventsTool, keptSecret, receiver, type ForgeEvent } from "./webhook.js";
import { keepSiblings, noteComposed, noteVerdict, readSiblings, siblingsFile, siblingsOf, weighSiblings } from "./siblings.js";
import { bindInBackground } from "./bind.js";
@@ -504,23 +504,6 @@ registerModuleTools("gitea", () => [eventsTool(pace), ...(gitea ? [commitStatusT
gates,
}), mergeTool(gitea, { gates })] : [])]);
// **A build machine took an ask** (the build seat's `started`, novox/hq ADR 0157): said on the head it checks, when
// the head is an open pull request's this module announced. Any other build — a branch, a merge's — says nothing.
async function buildStarted(event: { body: unknown }): Promise<void> {
const b = (event.body ?? {}) as BuildStarted;
const ref = String(b.ref ?? "").toLowerCase();
if (!/^[0-9a-f]{40}$/.test(ref)) return;
for (const [key, sha] of Object.entries(heads)) {
if (sha.toLowerCase() !== ref) continue;
const [owner, rest] = key.split("/");
const repo = rest?.split("#")[0] ?? "";
if (owner && repo && clonedAs(b.repository, owner, repo)) {
await gates.started(owner, repo, sha, b);
return;
}
}
}
/** What the forge's event asks of the announcer at once (issue 729): a new head is announced, and a merge. */
async function actOn(client: GiteaClient, event: ForgeEvent): Promise<void> {
const b = event.body as { owner?: string; repo?: string; number?: number };
@@ -628,7 +611,6 @@ if (gitea) {
}
return setVerdict(client, event);
})],
["node-build-agent.started", () => on("node-build-agent.started", buildStarted)],
], () => console.log("[gitea] watching for new repositories and merged pull requests"));
// The checker's mesh/check, from its owed state (check.ts; ADR 0521): a read not granted yet is said once and asked again,
// apart from the binds above, so neither waits for the other.
+1 -2
View File
@@ -86,8 +86,7 @@
"forge.other"
],
"consumes": [
"mesh-controller.checked",
"node-build-agent.started"
"mesh-controller.checked"
],
"listens": [
{