From 18b160c44fe11056a741be93a86143ebba25b4ff Mon Sep 17 00:00:00 2001 From: Eureka Date: Thu, 8 Oct 2026 14:15:48 +0200 Subject: [PATCH] Briefs: wait through wait-on.sh, py -3, and the 2026-10-07 lessons Hands and Soul long jobs name tools/wait-on.sh for every non-Yggdrasil wait and forbid bare true/echo/sleep polling (974 idle calls, 324 sleeps). py -3 is the Python that works from Git Bash and PowerShell (65 Store-stub hits). Lessons: own scratchpad subdirectory, wait protocol pasted verbatim, Stryker character offsets from LF content, Aetheria DOCKER_ARGS mounts, rulings quote only the operator. Co-Authored-By: Claude Opus 5.5 --- references/briefs.md | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/references/briefs.md b/references/briefs.md index 3005a46..fc57a5f 100644 --- a/references/briefs.md +++ b/references/briefs.md @@ -77,7 +77,9 @@ which workarounds are in force. Rule: for each operator answer, a ruling (answers, choice, authority, and operator_quote when the words matter). A direction that answers no question is a ruling with no answers, authority Operator, and the words verbatim in -operator_quote. A changed ruling carries a resolution superseding the old one, +operator_quote. A ruling's operator_quote and text carry only what the operator +said; Self's reading goes in a question, or is clearly marked as Self's (three +supersedes on 2026-10-07 came from text she never said). A changed ruling carries a resolution superseding the old one, in the same batch. Triage each open finding: a Hands brief, then a Fixed resolution admitted by @@ -255,7 +257,7 @@ rule; a later write can hide the deleted one. When a claim is "behaviour unchanged", a value captured from the new code is not evidence. Pin it with a value computed at the base commit. Detached scripts: confirm the log starts within 60 s; a script that dies on a -parse error is silent otherwise. +parse error is silent otherwise. Wait on one with `tools/wait-on.sh`. Shared build caches: record a full path list before building, not only counts, and delete exactly the new paths afterwards. Counts cannot attribute hardlinked or rewritten outputs. @@ -321,6 +323,25 @@ launcher is gone with no verdict: rerun the job, do not guess its outcome. A cal longer than 5 minutes rewrites your whole context. Never run a second watcher on the same job, never use a timer shorter than 60 s in a loop of your own, and send no interim message. +Every other wait goes through `tools/wait-on.sh`, never a loop of your own: +`wait-on.sh pid []` for a detached process, `wait-on.sh log +` (with `WAIT_PID=` to notice a dead process) for a build, a +Unity batchmode run or a script that writes a done line, `wait-on.sh file +` for an output file. It has the same contract: pass a Bash tool +`timeout` of at least 280000 ms, it blocks at most 270 s, exit 0 is done with a +bounded log tail, `RUNNING s` (exit 99) means call it again, exit 98 means +the thing is gone with no completion evidence. Bare `true`, `echo waiting` and +`sleep` calls are forbidden as polling: on 2026-10-07 and before, Hands and +Soul runs made 974 idle `true`/`echo` calls and 324 `sleep` calls (49 refused +by the harness), each one a model turn that waited on nothing. +Write only under your own scratchpad subdirectory, `//`: +a shared `job.sh` or probe file gets overwritten (one Soul clobbered `job.sh` +and `SoulProbe.cs`, 2026-10-07). +Python: use `py -3`, which works from Git Bash and PowerShell alike. Bare +`python` hit the Windows Store stub in 65 calls (2026-10-07). +Self pastes this wait protocol into a brief verbatim, never as a shortened +"wait mode": abbreviated, agents ended their turns mid-job three times on +2026-10-07. Mutation tools run on schemata or copies and never edit the tree. A Soul probe that mutates by hand works on a scratch copy: the stopgap's container or a throwaway clone, never the working tree. @@ -350,6 +371,11 @@ Verification: . read the summary, and open the full log only at a named failing test, with `grep -n -A 40`. Hand mutants go in one list to `tools/mutation-table.sh`, one job for all of them. +- Stryker `--mutate` ranges are character offsets, not lines. Compute them from + the LF content (`git show :`), never from the CRLF Windows checkout. + A run whose ranges hit nothing tests nothing, and a green with zero mutants + tested is not evidence (line-scoped runs tested nothing, 2026-10-06). +- Aetheria verify jobs set `DOCKER_ARGS` to mount `/pins` and `/lfs-aetheria`. - Revert incidental asset churn. Budget: if the cut can't land coherently, stop at a pushed, building commit @@ -403,7 +429,14 @@ below. Admit one verdict and its findings, and nothing else. at most 270 s and prints the bounded summary when the job is done, or `RUNNING s` (exit 99) and you call it again. Exit 98 means no verdict: rerun, do not guess. No second watcher, no timer under 60 s in a loop of your own, and no - interim message: each turn end is a paid wake of Self. + interim message: each turn end is a paid wake of Self. Every wait that is not + a Yggdrasil job goes through `tools/wait-on.sh` (`pid []`, + `log `, `file `; same 280000 ms timeout rule, same + `RUNNING`/exit 99 and exit 98 contract); bare `true`, `echo` or `sleep` + polling is forbidden. Write only under `//`: a shared + `job.sh` or probe file gets overwritten (one Soul clobbered `job.sh` and + `SoulProbe.cs`, 2026-10-07). Python is `py -3` (works from Git Bash and + PowerShell; bare `python` hit the Windows Store stub in 65 calls, 2026-10-07). - Bound every observation: no command prints more than about 150 lines, logs go to files, and you read windows of them.