From bc75f9ed4b082100835a60148cce1bdc89b256cf Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 10 Nov 2026 14:13:31 -0800 Subject: [PATCH 1/3] chore(quest): claim quest/m0/queue-watcher/fixer-broken-pipe.md Quest-Claim: 0e3ce550ca9cb49b From c9ef6c1753ccd1f887d4be64a50f012d6684d6e7 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 10 Nov 2026 14:19:18 -0800 Subject: [PATCH 2/3] quest: trace the fixer's broken pipe to the host launcher The [Errno 32] came from the host's fixer wrapper, whose launcher refused quest 0.2.0's @ state paths. Record the moq.pro drops and their real causes, and wait on the host switch that deploys the fix. Co-Authored-By: Claude Opus 5.5 --- quest/m0/queue-watcher/fixer-broken-pipe.md | 41 +++++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/quest/m0/queue-watcher/fixer-broken-pipe.md b/quest/m0/queue-watcher/fixer-broken-pipe.md index 9d53ee1e..488768b5 100644 --- a/quest/m0/queue-watcher/fixer-broken-pipe.md +++ b/quest/m0/queue-watcher/fixer-broken-pipe.md @@ -1,4 +1,4 @@ -# [S] The land fixer survives a closed pipe +# [XS] The land fixer survives a closed pipe ## Goal @@ -17,12 +17,37 @@ On moq-dev/moq the fixer handed back two ordinary drops with [moq-dev/moq#8406](https://github.com/moq-dev/moq/pull/8406) (a failed `merge_group` build, caused by a dead quest link) and [moq-dev/moq#8429](https://github.com/moq-dev/moq/pull/8429) (a merge -conflict). Each then needed a person. `[Errno 32]` is Python's wording, so -the crash may be in a script the fixer runs rather than in Quest's -TypeScript; find which process prints it from the host's fixer logs first. -If it is moq-dev/moq's own check script, fix it there instead (its -`sh/migrate.sh` had the same `grep -q` under `pipefail` bug, fixed in -[moq-dev/moq#8424](https://github.com/moq-dev/moq/pull/8424)) and delete -this quest. +conflict). Each then needed a person. On 2026-11-10 moq-dev/moq.pro's gate +handed back three more the same way, which hid each drop's real cause: + +- moq-dev/moq.pro#3816 (markdown only), handed back 20:18Z: its batch with + moq-dev/moq.pro#3818 failed `dev/check-instructions.sh`, as + `.claude/skills/quest-review/SKILL.md` is 287 bytes against a 280-byte + budget. It landed after a requeue. +- moq-dev/moq.pro#3822 (billing display) and moq-dev/moq.pro#3820 (fonts), + handed back 22:01Z: their batch failed `just api check` with two TS2362 + errors at `api/test/account-free-tier.test.ts:885-886`, a file + moq-dev/moq.pro#3822 changes. +- moq-dev/moq.pro#3820 again, 22:13Z: its batch with moq-dev/moq.pro#3687 + failed `dev/check-migrations.py`, which lists live deploy tags from + `origin`, a remote the gate's checkout lacks. + +Found 2026-11-10: Quest is not at fault. The `[Errno 32]` comes from the +host's fixer wrapper, `scripts/quest-land-check.py` in kixelated/nixos. Its +fixer launcher refused every request with `failure log must be a .log path +below the repository state directory`, because quest 0.2.0 keeps state in +`owner-repo@main` directories and the launcher's path pattern lacked `@`. The +wrapper, still uploading, then hit `EPIPE` and printed that instead of the +refusal. The host journal (`journalctl -u 'quest-land-fixer@*'`) shows all 53 +fixer runs from 00:33Z, a minute after a host switch, refused this way. kixelated/nixos#46 fixed both the pattern and the lost +refusal at 19:12Z, with a protocol test that closes the upload mid-stream, but +the host still runs its 01:33Z system. Public API: none. Wire: none. + +## Waiting + +- Maintainer: switch nixos to a system with kixelated/nixos#46, since an + agent may not switch the host; check that `journalctl -u + 'quest-land-fixer@*'` shows no `failure log must be` refusal after it and + the next parked PR gets a real verdict, then delete this quest. From 6b8b497708b6716c9cd9b50c0c2c329a22535a3d Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 10 Nov 2026 15:20:43 -0800 Subject: [PATCH 3/3] quest: delete the fixer broken pipe quest The maintainer's host now runs a system with the launcher fix: no fixer run since the switch was refused, and the next drop got a real verdict. The evidence moves to the PR body. Co-Authored-By: Claude Opus 5.5 --- quest/m0/queue-watcher/fixer-broken-pipe.md | 53 --------------------- quest/m0/test-cpu-timeout.md | 1 - 2 files changed, 54 deletions(-) delete mode 100644 quest/m0/queue-watcher/fixer-broken-pipe.md diff --git a/quest/m0/queue-watcher/fixer-broken-pipe.md b/quest/m0/queue-watcher/fixer-broken-pipe.md deleted file mode 100644 index 488768b5..00000000 --- a/quest/m0/queue-watcher/fixer-broken-pipe.md +++ /dev/null @@ -1,53 +0,0 @@ -# [XS] The land fixer survives a closed pipe - -## Goal - -A fixer run on a dropped PR finishes with a fix, a flaky verdict, or a -handback that names a decision, never a crash from a closed pipe. A test -closes the reader of the step that crashed and finds the run still reports. - -## Plan - -Planned 2026-11-10 (maintainer, /quest-complete in moq-dev/moq). Milestone: -✅ m0, in this epic (rejected: m0 standalone, m1). - -On moq-dev/moq the fixer handed back two ordinary drops with -`fixer crashed (exit 1); run /quest-iterate` and the output -`quest land check: [Errno 32] Broken pipe`: -[moq-dev/moq#8406](https://github.com/moq-dev/moq/pull/8406) (a failed -`merge_group` build, caused by a dead quest link) and -[moq-dev/moq#8429](https://github.com/moq-dev/moq/pull/8429) (a merge -conflict). Each then needed a person. On 2026-11-10 moq-dev/moq.pro's gate -handed back three more the same way, which hid each drop's real cause: - -- moq-dev/moq.pro#3816 (markdown only), handed back 20:18Z: its batch with - moq-dev/moq.pro#3818 failed `dev/check-instructions.sh`, as - `.claude/skills/quest-review/SKILL.md` is 287 bytes against a 280-byte - budget. It landed after a requeue. -- moq-dev/moq.pro#3822 (billing display) and moq-dev/moq.pro#3820 (fonts), - handed back 22:01Z: their batch failed `just api check` with two TS2362 - errors at `api/test/account-free-tier.test.ts:885-886`, a file - moq-dev/moq.pro#3822 changes. -- moq-dev/moq.pro#3820 again, 22:13Z: its batch with moq-dev/moq.pro#3687 - failed `dev/check-migrations.py`, which lists live deploy tags from - `origin`, a remote the gate's checkout lacks. - -Found 2026-11-10: Quest is not at fault. The `[Errno 32]` comes from the -host's fixer wrapper, `scripts/quest-land-check.py` in kixelated/nixos. Its -fixer launcher refused every request with `failure log must be a .log path -below the repository state directory`, because quest 0.2.0 keeps state in -`owner-repo@main` directories and the launcher's path pattern lacked `@`. The -wrapper, still uploading, then hit `EPIPE` and printed that instead of the -refusal. The host journal (`journalctl -u 'quest-land-fixer@*'`) shows all 53 -fixer runs from 00:33Z, a minute after a host switch, refused this way. kixelated/nixos#46 fixed both the pattern and the lost -refusal at 19:12Z, with a protocol test that closes the upload mid-stream, but -the host still runs its 01:33Z system. - -Public API: none. Wire: none. - -## Waiting - -- Maintainer: switch nixos to a system with kixelated/nixos#46, since an - agent may not switch the host; check that `journalctl -u - 'quest-land-fixer@*'` shows no `failure log must be` refusal after it and - the next parked PR gets a real verdict, then delete this quest. diff --git a/quest/m0/test-cpu-timeout.md b/quest/m0/test-cpu-timeout.md index 692387cf..0153f8da 100644 --- a/quest/m0/test-cpu-timeout.md +++ b/quest/m0/test-cpu-timeout.md @@ -56,4 +56,3 @@ Open for the implementer, with recommendations: ## Related - [Gate test races](/quest/m0/gate-test-races.md) - the other queue-build failures, which are assertion races, not timeouts -- [Fixer broken pipe](/quest/m0/queue-watcher/fixer-broken-pipe.md) - why each of these drops came back as a crashed fixer run