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 <noreply@anthropic.com>
This commit is contained in:
Eureka 2026-10-08 14:15:48 +02:00
commit 18b160c44f

View file

@ -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 <pid> [<log>]` for a detached process, `wait-on.sh log <log>
<done-regex>` (with `WAIT_PID=<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
<path>` 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 <n>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, `<scratchpad>/<agent>/`:
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: <exact builds, tests, captures, negative greps>.
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 <rev>:<path>`), 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
<n>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 <pid> [<log>]`,
`log <log> <done-regex>`, `file <path>`; same 280000 ms timeout rule, same
`RUNNING`/exit 99 and exit 98 contract); bare `true`, `echo` or `sleep`
polling is forbidden. Write only under `<scratchpad>/<agent>/`: 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.