Join 11: gitea reads the step event's fingerprint by the seat's name

The seat mesh-pipeline-runner's step event carries `fingerprint`; gitea read
`fp`, which no event carries, and which the type-check refuses once the Node
fetch places the runner's contracts (design 47 G A-285).

Builds: design 47 G A-285

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
This commit is contained in:
2026-11-12 15:42:14 +01:00
parent 622b259145
commit e034f73991
2 changed files with 4 additions and 1 deletions
+1 -1
View File
@@ -89,7 +89,7 @@ export class FailedSteps {
private record(ev: StepEndedEvent): Promise<void> {
const r = ev?.result;
const fingerprint = r?.fingerprint || ev?.fp || "";
const fingerprint = r?.fingerprint || ev?.fingerprint || "";
if (!r || !SHA.test(String(ev.commit ?? "")) || !fingerprint || !ev.module) return Promise.resolve();
return this.turn(async () => {
const at = ev.at ?? new Date().toISOString();
+3
View File
@@ -48,6 +48,9 @@ test("a head is refused by a required step that failed at its fingerprint in any
await f.stepEnded(ended(C3, "failed", { step: "lint", status: "optional", fingerprint: "fp-2" }));
await judged("a failed optional step", C3, "run-on-request nats unit");
assert.equal(kv.has(failedStepKey("nats", "fp-2", "lint")), false);
// A result that names no fingerprint is kept at the one the seat's step event carries (`fingerprint`).
await f.stepEnded(ended(C3, "failed", { step: "lint", fingerprint: undefined }, { fingerprint: "fp-3" }));
assert.ok(kv.has(failedStepKey("nats", "fp-3", "lint")), "the event's fingerprint is kept");
// A plain pass clears nothing; a rerun that passes clears it.
await f.stepEnded(ended(C2, "passed"));
await judged("a plain pass", C2, "run-on-request nats unit");