From 436abf39d55dcc7aa084d8187588a8a1680eed6a Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Sat, 8 Aug 2026 09:07:40 +0200 Subject: [PATCH] ci: give the wire-contract gate the sibling clone it needs (the hook and CI disagreed) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI went red on the two G-1 commits while the local pre-push hook was GREEN — which this workflow's own alarm mail says outranks whatever the push was for, because it is a finding about the gates themselves. It was. CAUSE, reproduced rather than guessed: scripts/wire_contract_gate.py compares what one component EMITS against what the other can RECEIVE, so it needs the SOURCE of the controller and the agent. The workflow already fetched the controller (for golden-currency) but not the agent, so the gate exited 2 INCONCLUSIVE. Reproduced locally by pointing the gate at a nonexistent agent path: same exit 2, same message. THE LESSON, and it is the reusable half: the pre-push hook runs on a workstation where every sibling is a real clone, so a gate that needs a sibling passes there and is inconclusive here. **The two automated homes are not interchangeable, and a NEW GATE MUST BE CHECKED IN BOTH.** Recorded in the step's own comment beside the fetch. Fixed by giving the gate what it needs. NOT by letting it skip when a sibling is absent — that is the fail-open shape, and it would leave the gate running in NEITHER home, which is the R-29 census failure this runner was built to end and which golden_currency_gate.py's docstring already warns about at length. --- .gitea/workflows/gates.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.gitea/workflows/gates.yml b/.gitea/workflows/gates.yml index 4ee8d7d..1e82093 100644 --- a/.gitea/workflows/gates.yml +++ b/.gitea/workflows/gates.yml @@ -32,6 +32,26 @@ jobs: git checkout -q FETCH_HEAD echo "checked out $(git rev-parse HEAD)" + - name: Fetch the agent (wire-contract gate needs BOTH sibling repos) + # G-1's gate (scripts/wire_contract_gate.py) compares what one component EMITS against what + # the other can RECEIVE, so it needs the source of the controller AND the agent, not just a + # CHANGELOG. Without this the gate exits 2 (INCONCLUSIVE) and CI is red for ever. + # + # ⚠ THIS STEP WAS MISSING FOR ONE COMMIT AND CI WENT RED, exactly as the alarm mail below + # predicts: "if the local pre-push hook was GREEN, then CI and the hook disagree — that is a + # finding about the gates themselves". It was. The pre-push hook runs on a workstation where + # every sibling is a real clone, so a gate needing a sibling passes locally and is + # INCONCLUSIVE here; the two homes are NOT interchangeable and a new gate must be checked in + # both. Fixed by giving the gate what it needs — never by letting it skip, which would be + # the fail-open shape and would leave it running in NEITHER home (R-29). + run: | + git init -q ../felhom-agent + cd ../felhom-agent + git remote add origin http://gitea.gitea-system.svc.cluster.local:3000/admin/felhom-agent.git + git fetch -q --depth 1 origin main + git checkout -q FETCH_HEAD + echo "agent at $(git rev-parse --short=12 HEAD)" + - name: Fetch the controller CHANGELOG (golden-currency gate needs the sibling repo) # R-242's gate compares the newest RELEASED controller against the newest golden baked here, # and it reads the released version from the sibling clone's CHANGELOG.md — the same sibling