The by-path copy left LFS pointers in place and cost three failed runs in
each of two jobs on 2026-10-08.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With only the catalog copied, 204 tests failed on an LFS pointer during the
pirates-record merge (2026-10-08).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Anchors resolve through git diff hunks from the spec's base (working tree
included) into a status table plus bounded windows; --since re-prints only
edited windows. Spec by id through the eureka-state stdio binding, or a
saved view. Fixture section in test-tools.sh; INDEX row.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Body facts, model page and rationale for the context-pack cuts in
eureka-substrate. The cut specs are the typed record in the mind.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two parallel Imagination passes made two owners of one decision twice on
2026-10-08. NuGet restore fails under a read-only /pins mount.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Truncating writers (`>`, Unity -logFile) rewrite below any offset, so an offset
turned a stale success into a silent hang. The option, the scan branch, its docs
and its fixtures are gone; the header states the fresh-log-path rule.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
F1/F2: Hands block says prefer log+WAIT_PID, pid form means gone not succeeded,
fresh log per job or WAIT_FROM at launch. F3: exact Aetheria DOCKER_ARGS mounts.
F8: Soul points at the Hands block instead of rewording it; Imagination and
Eyes templates name wait-on.sh, <scratchpad>/<agent>/ and py -3; all examples
use <scratchpad>/<agent>/.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
F1: log form searches only bytes after WAIT_FROM, so a stale done line in a
reused log is ignored (also makes the per-check cost independent of log size).
F2: pid form prints GONE (no completion evidence). F4: invalid ERE is exit 3.
Mode 100755 recorded for wait-on.sh; other tools/ scripts are still 100644.
F5, F6, F7 recorded as known limitations in the header. Fixtures added.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
whoami, view and query; no admit. Follow-up eureka-substrate:follow_up:gap-life-has-no-mind-tools.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
Same contract as ygg-verify.sh wait (270 s cap, bounded tail, RUNNING exit 99,
exit 98 for a thing gone with no completion evidence). Windows PIDs are found
through tasklist, since kill -0 only knows Git Bash's own. Fixtures in
tools/test-tools.sh; INDEX row added.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Agent frontmatter: hands, eyes and life default to model: sonnet, so an
omitted model can no longer spend the root's strong model. Soul and
Imagination keep inherit (operator 2026-10-03: "Soul and Imagination get the
smarter model, not Hands").
- Self output style: invoke the Eureka skill at session start and after every
/clear. A skill loads only when invoked; a session that never loaded it
dispatched every Hands on Opus.
- Rotation: the handoff carries only what the mind does not hold, and Self
rehydrates from the mind before briefing. A handoff that restated campaign
status hid that scenarios Cuts 2-4 had not landed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On 2026-10-03 Self's briefs told Hands to admit Fixed resolutions, and the
template's admission line was silent, so nothing contradicted them. Verdict
variants:verdict:cut-c2a-declared-apply.s1 found one such closure only partly
fixed. The rule already stands in SKILL.md section 5 and campaign-state.md; this
puts it where briefs are written.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 2026-10-03 clear killed three agents that the handoff expected to survive:
commits survived on branches, two cut reports and a verdict were never admitted.
The same morning's catch-up gave the operator recommendations without options,
because it read the handoff instead of the question documents.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Optional companion to the CLAUDE.md sentence; holds the long form. No date and
no quotation, per the publish scrub.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Adds one sentence after "The Cult is a metaphorical discipline...": the framing
borrows a cult's vocabulary to do the opposite of what cults do. colossus.md is
not auto-loaded, so a fresh Self met the cult voice without the inversion.
Alone as a values statement the operator owns.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The dropped sentence is the third statement of the rule the failure warning
already makes. The verdict sentence stays. The Prayer's line on prompts
compensating for missing context stays. Alone as an editorial merge.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Per ruling doctrine-explains-not-shouts. "No dignity" is contempt aimed at the
agent; "no standing" is the doctrine's own phrase from the failure shapes list.
Alone because it is meaning-adjacent.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Per ruling doctrine-explains-not-shouts. Alone because the capitals in this
description may be what makes the harness dispatch Life unprompted; reject
this commit if Life dispatch rates fall.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Per ruling doctrine-explains-not-shouts. Capitals and "DO NOT" imperatives
become sentence case with the reason stated; every rule keeps its meaning.
STOP bullets gain a one-clause reason. Section labels move to title case.
The scrubbed text on main is the base.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Per ruling doctrine-publish-scrub. Drops the private Discord message id and
the dates attached to two operator quotes, and turns F:\Projects paths into
descriptive references. Private project names and ~/.claude paths stay.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Per ruling doctrine-home-eureka-repo. Copies of the global CLAUDE.md,
six faculty charters, the Self output style and three doctrine files,
byte-identical to their sources. Paths and wording are unedited.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Every brief now names subagent_type (a general-purpose dispatch loads no
charter). Cut the You-are lead-ins, the Soul identity sentence and its
no-edit/restore bullets, and Eyes' read-only line, all owned by
~/.claude/agents/*.md. SKILL.md's dead litany pointer now names soul.md and
imagination.md.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The --rm mutant container is gone by the time the trap runs, so
`docker rm -f $cur` never had a container to remove. The stopgap's watchdog
kills every job-labelled container before it signals the driver, so nothing
needs tracking here. Also restores a line continuation the control-run edit
had collapsed.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A RUN_ON_HOST job whose TIMEOUT fired still exited 0: kill_job only killed
labelled containers and the status came from the host command (Soul F2). The
host command now runs in its own process group (set -m), in the job's work
directory (it ran in the ssh home), with stdin from /dev/null. kill_job sends
the group TERM, then KILL 20 s later, and the verdict is forced to 124 when the
watchdog killed the job, whatever the command exited with. The TIMEOUT/IDLE
notice now prints before the kill so the 20 s grace cannot swallow it.
Proved on Yggdrasil with the sleep-past-TIMEOUT probe (exit 124, cwd = the work
dir, no sleep left) and with a command that traps TERM and exits 0 (still 124);
probes recorded in tools/fixtures/mutation-probe/README.txt, with the expected
rows for the fresh and jsr reproducers.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Jest without a TTY prints "FAIL jt/add.test.js" with one space; the parser
matched two, so a real jest load failure read ERROR, not UNVIABLE. The old
`^ +● ` denylist also named process.exit's "● process.exit called with "1""
as a killing test (CAUGHT). Names now need a FAIL file header above them; a
crash with no named failing test is ERROR. The "no test counts recognised"
line names jest. The synthetic jest logs and mock are replaced by real jest
29.7.0 output captured on Yggdrasil from tools/fixtures/mutation-probe/jsr
(green, wrong, load, exit runs in logs/jest-real.log).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A test that cannot run twice (create_dir("target/fresh-marker").unwrap())
passes the baseline and then fails in every mutant's container, so every
mutant read CAUGHT and the job exited GREEN (Soul F1). The baseline's test
loop is now one function, `unmutated`, run again from the committed snapshot
in a --control container before any mutant; red or empty there aborts with
SNAPSHOT RED, exit 2, no rows counted. Mock case E3 (oncetest.sh) fails if
the control is removed. Reproducer crate: tools/fixtures/mutation-probe/fresh.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Copied from the soul3 scratch repos so the kills that found F1, F3 and F4 are
committed evidence; no behavior change.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
mutation-table-nonce.log is now a real run of the snapshot runner (untested-equiv
SURVIVED, exit 1). The probe README names the soul2 case. ygg-verify.sh no longer says
a reused log path is guarded by a run id (fresh paths are the rule).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The git-status restore could not see ignored files, so a test keeping state under
target/ polluted the next mutant (an uncovered mutant read CAUGHT). The baselines now
run once in one container whose filesystem holds the revision; that container is
`docker commit`ted to a throwaway image and each mutant runs in a fresh --rm container
from it. restore(), dirtied() and tree_state() are deleted. ygg-verify.sh gains
RUN_ON_HOST=1 (the driver owns container topology; the watchdog kills by job label).
testparse.sh: LOADFAIL for file-level FAIL lines (no " > "), jest "●" names and jest
Tests: counts. Mock docker, jest and vitest-variant fixtures, soul2 reproducer.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The pollution note listed nothing when the workdir was below the repo root
(ls-files ran from the root); the mock now runs from a subdirectory so that
regresses visibly. Every brief/INDEX line showing ygg-verify wait now says to
pass a Bash timeout of at least 280000 ms.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A: BUILD runs on the unmutated tree; red or missing aborts as BASELINE RED.
B: outcome is its own field, tallied from fields; labels may contain pipes.
C: after each mutant the whole tree is reset and run-created untracked
entries removed; an unrestorable tree aborts; dirtying is noted in the row.
D: a vitest file-level FAIL with no test name is UNVIABLE, not CAUGHT.
E: one row per mutant as it finishes; whole-job TIMEOUT is explicit.
F: LF before-text matches CRLF files.
Rows carry the per-run YGG_NONCE tag. Local mock fixtures and test-tools
cases fail on each regression.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>