G7 COMPLETE: CI is green on our own hardware
All checks were successful
check / gate (push) Successful in 17s
All checks were successful
check / gate (push) Successful in 17s
Run 7 passed end to end: Python 3.12.13, ruff clean, vocabulary audit clean, 42 tests, migration upgrade->downgrade->upgrade against real Postgres, and 'I-12 holds: env override ignored'. This is the finding both August audits converged on — 'nothing anywhere checks whether a decision reached production' — closed for this repo. GitHub Actions is billing-locked and cannot run on private repos at all, even self-hosted. This can, on hardware Grant already owns, for zero dollars. I-5 proven by inspection, not assertion: CI containers sit on windy-git-runner_jobs, the forge database on windy-git_default. Disjoint. And neither CI container holds the host docker socket. Adds strand G7A: seven runs to first green, and each failure presented as a different problem than it was. The worst was a Python version mismatch that appeared as a 14-minute hang rather than an error, because pip answered 3.10-vs-3.12 by backtracking through every dependency's release history with -q hiding it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1 +0,0 @@
|
|||||||
trigger at 15:35:14Z
|
|
||||||
@@ -355,6 +355,44 @@ and landed in R2 at `lfs/34/2d/…`, with **no local `lfs/` directory on the hos
|
|||||||
- **G7.7** Artifacts and logs to R2 (G4.1).
|
- **G7.7** Artifacts and logs to R2 (G4.1).
|
||||||
- **G7.8** *Accept:* a deliberately broken commit to a private repo produces a red check on the PR — **which is something that has not happened anywhere in this ecosystem in over a month.**
|
- **G7.8** *Accept:* a deliberately broken commit to a private repo produces a red check on the PR — **which is something that has not happened anywhere in this ecosystem in over a month.**
|
||||||
|
|
||||||
|
## Strand G7A — CI traps paid for on 2026-08-12
|
||||||
|
|
||||||
|
Seven runs to first green. Every one of these presents as a different problem
|
||||||
|
than it is, and all are now pinned by tests.
|
||||||
|
|
||||||
|
- **G7A.1 — the isolation/DNS collision.** Job containers live inside the dind
|
||||||
|
daemon and cannot resolve `gitea`, which lives on the forge network. The easy
|
||||||
|
fix is to put jobs on the forge network — one line, and it leaves untrusted
|
||||||
|
workflow code one DNS name from the forge's Postgres. **Send jobs to the
|
||||||
|
PUBLIC forge surface instead**, exactly like any stranger. The runner then
|
||||||
|
needs no forge attachment at all, so no CI container has a private route to
|
||||||
|
anything.
|
||||||
|
- **G7A.2 — the instance URL is baked into `/data/.runner` at registration.**
|
||||||
|
Changing the environment variable does nothing; the daemon keeps dialling the
|
||||||
|
old host. To repoint a runner you must drop its data volume and re-register
|
||||||
|
with a fresh token.
|
||||||
|
- **G7A.3 — ⚠️ a Python version mismatch presents as a HANG, not an error.**
|
||||||
|
`catthehacker/ubuntu:act-22.04` ships Python 3.10.12; this project requires
|
||||||
|
≥3.12. pip answered by backtracking through the entire release history of
|
||||||
|
every dependency at 100% CPU, with `-q` hiding all of it, for 14 minutes. Use
|
||||||
|
`actions/setup-python`, and **give every job `timeout-minutes`** so a wedge is
|
||||||
|
a red check in minutes rather than an occupied runner for half an hour.
|
||||||
|
- **G7A.4 — you cannot just run the job in a `python:3.12` image.**
|
||||||
|
`actions/checkout` is a JavaScript action and the official Python images carry
|
||||||
|
no `node`, so checkout dies with *"executable file not found"*. The act image
|
||||||
|
has node; `setup-python` supplies the interpreter.
|
||||||
|
- **G7A.5 — `container.network: bridge` breaks service containers.** Service
|
||||||
|
DNS aliases exist only on a per-job network, so Postgres came up healthy and
|
||||||
|
the job could not name it. `network: ""` is both correct **and stricter** — a
|
||||||
|
shared flat bridge lets concurrent jobs see each other.
|
||||||
|
- **G7A.6 — do not restart the runner while a job is in flight.** Runs 3 and 6
|
||||||
|
died to exactly that, and the resulting log looks like a workflow defect
|
||||||
|
rather than an operator interrupting it.
|
||||||
|
|
||||||
|
**Verified green 2026-08-12, run 7:** Python 3.12.13 · ruff clean · vocabulary
|
||||||
|
audit clean · 42 tests · migration upgrade→downgrade→upgrade against real
|
||||||
|
Postgres · and `I-12 holds: env override ignored`.
|
||||||
|
|
||||||
## Strand G8 — Agent surface (MCP + capability discovery)
|
## Strand G8 — Agent surface (MCP + capability discovery)
|
||||||
|
|
||||||
- **G8.1** MCP server `windy-git-mcp` exposing the full knob-set — every button a human can push. Follows `windy-word-mcp` conventions.
|
- **G8.1** MCP server `windy-git-mcp` exposing the full knob-set — every button a human can push. Follows `windy-word-mcp` conventions.
|
||||||
|
|||||||
Reference in New Issue
Block a user