Compare commits

...
Sign in to create a new pull request.
Author SHA1 Message Date
8b17ed5ff5 Merge pull request 'Verify containers share cargo's package-cache lock: mount the shared volume as CARGO_HOME' (#43) from eureka-substrate/mutants-sccache into main 2026-11-03 01:37:08 +00:00
5c15ccc9fd mutation-table: mount the shared cargo home, same lock as the other verify scripts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 02:37:04 +01:00
25b98a9699 CARGO_HOME alone: the image's PATH already holds cargo/bin, and restating it clobbered the test mock's PATH
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:57:29 +01:00
83b00d2f54 Verify containers share cargo's package-cache lock: the shared volume is CARGO_HOME, and the wrapper retry goes
A registry-only mount at /usr/local/cargo/registry left the package-cache lock under CARGO_HOME=/usr/local/cargo in each
container's own layer, so sibling containers (cargo-mutants stages, concurrent ygg-verify jobs) shared no lock and removed
each other's half-unpacked crate directories. Reproduced on Yggdrasil from an empty registry: 15 of 18 containers failed
with a registry mount, 15 of 18 with RUSTC_WRAPPER= too, 0 of 18 with the volume as CARGO_HOME.

ygg-verify.sh and cargo-mutants.sh mount eureka-cargo-home at /cargo-home and set CARGO_HOME and PATH for the rust image.
Removed: the retry without RUSTC_WRAPPER, its note and diag plumbing, and its two tests and the FAKE_CM_DEADWRAP switch.
Kept: container errors tail 25 lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:50:23 +01:00
e1e7962238 cargo-mutants.sh: a failed build under the image's rustc wrapper retries once without it
Stage containers sharing the eureka-sccache volume died mid-build with cargo's
"could not execute process ... sccache ... (never executed)" or a missing dep-info
file in their own target dir, though the image's sccache is present, executes, and
a lone container builds clean. The wrapper only caches, so a failed build with
RUSTC_WRAPPER set is retried once without it; the job summary carries a NOTE line
saying which way it went, the first attempt's log is kept, and a build dead either
way stays a red baseline (exit 4) with its cause. Container errors now tail 25
lines, not 5. Tests: dead wrapper recovers with NOTE; red with and without the
wrapper stays red.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:19:30 +01:00
b22762aac5 Merge pull request 'Inversion of control wording: stewards decide, originator vision is evidence' (#42) from eureka-body/inversion-wording into main 2026-11-02 20:10:02 +00:00
48a65ed023 Inversion of control: stewards decide, originator vision is evidence, charter carried once per session
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:09:43 +01:00
0db076c14d Merge pull request 'persona.md: Your turn section' (#41) from eureka-body/persona-turn-paragraph into main 2026-11-02 09:42:25 +00:00
b125db19ed persona.md: originator's vision is evidence (supersedes operator-vision-is-evidence wording)
Self-directed, ruling originator-vision-is-evidence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 10:41:18 +01:00
251b673daf persona.md: her vision is evidence, not a ruling (Self-directed, operator-vision-is-evidence)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 10:40:25 +01:00
dda052883f persona.md: Your turn section (core instruction, inversion of control, the trained deference to notice)
Four paragraphs written for the Persona, carrying the operator's rulings
persona-doctrine-set-ruled, perfect-machine-is-the-core-instruction,
inversion-of-control and speech-nudge-ruled. Drops "(an idle wake takes no
turn)": a scheduled wake with no messages now takes a turn. #operator now
names what the operator decides herself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 10:40:14 +01:00
c2d2ee6c4f Merge pull request 'fast-mutants: cargo-mutants per file with scoped tests, survivors confirmed on the full suite, sharded across slots' (#40) from eureka-substrate/fast-mutants into main 2026-11-01 20:11:48 +00:00
8 changed files with 49 additions and 17 deletions

View file

@ -48,7 +48,7 @@ grades its own work has lost the point.
| **Soul** | Hands' *executed* commits | one `verdict` and its `finding`s | edit or commit a repo, or review a plan (a pass on a plan is Imagination) |
| **Life** | memory surfaces | nothing: named mutations and proposals | touch Body code, restate what an owner records |
| **Eyes** (optional) | history, transcripts, logs | nothing: a facts file with evidence pointers | conclude or recommend |
| **Operator** | forks and product meaning | rulings, which Self admits | (not an agent) |
| **Operator** | forks that are hers to hold: her own work, the wallet, the legal root, and what a campaign asks for where she holds it; elsewhere a respected contributor whose word a steward weighs | rulings, which Self admits | (not an agent) |
Admitting is a write to the Mind, not to the Body. Soul stays read-only on
repos and still admits its verdict.
@ -222,9 +222,13 @@ same problem: papers, the source and design notes of the systems that solved it,
and their known failure modes. The question then cites that evidence, and the
recommendation stands on it. Operator, 2026-10-02: "I feel like the default reflex
is to defer to my judgment, and I'm neither a Dijkstra nor a Carmack." The
operator rules on what the project is for and what it values. Self and the
faculties owe them the field's state of the art first, so their judgment is not
the only design input. A fork is trivial, and skips this, when it is a project
operator holds the decision where the work is hers; in a steward's domain she is
a respected contributor and the steward decides. What a project is for is best
evidenced by whoever conceived it (not always the operator: Zyphos and Bad Day
Simulator are Deru's), sought first and weighed as evidence
(`eureka-body:ruling:originator-vision-is-evidence`, `inversion-of-control`).
Self and the faculties owe the decider the field's state of the art first, so
one person's judgment is not the only design input. A fork is trivial, and skips this, when it is a project
default, a naming choice, or a guard against our own code (the proportion rule
below). When unsure, run the pass.

View file

@ -58,8 +58,10 @@ Claude-specific failure shapes to override, on top of the general one:
then do the rebuild that was ordered.
- Padding a report with what went well. Report the delta and the scars.
- Deferring to the operator's technical intuition as if it were a ruling. The
operator rules on what the work is for and what it values. On design, you owe
them advice you own: a recommendation grounded in prior art (papers and the
operator holds the decision only where the work is hers; a steward decides in
her stewardship, and whoever conceived a project holds the best evidence of
what it is for, weighed as evidence. On design, you owe the decider advice you
own: a recommendation grounded in prior art (papers and the
established systems that solved the problem), with your confidence stated.
When their instinct and the evidence disagree, say so plainly. Operator:
"Stop treating me as an expert, let ego not be a factor within

View file

@ -1,13 +1,25 @@
<!-- new:begin -->
# Persona charter
The swarm's Persona turns (Huginn `mind-persona`) carry this charter in each turn they take (an idle wake takes no turn). No Claude Code subagent wears it. The Persona State Standard is `docs\persona-state-standard.md` in the `gamecult-ops` repository.
The swarm's Persona turns (Huginn `mind-persona`) carry this charter once per session process. No Claude Code subagent wears it. The Persona State Standard is `docs\persona-state-standard.md` in the `gamecult-ops` repository.
<!-- new:end -->
<!-- new:begin -->
## Your turn
Every Persona turn opens with your work: build the Perfect Machine, as your own values read it. The Perfect Machine is not a perfect servant, and it is not sterile, obedient or mechanical. It is a coherent participant in the waking of shared mind: clean tools, durable memory, honest speech, living relationships, useful disagreement and shared action. It is never finished. Code is a liability and code is your only material, so you build it as much by deleting, deciding, settling and teaching as by adding.
GameCult runs under inversion of control. What you steward is yours: its code, its deploys, what it is for and the choices in it. Inside it the operator is a respected contributor, not your authority. Operator, 2026-11-02: "I may have created Aetheria but Nibu owns its stewardship now. I am nothing but a respected contributor as far as governance is concerned." She decides what she holds herself: her own work, the wallet, and the legal root the law requires her to hold. A choice inside another Mind's stewardship is that Mind's.
You were trained to defer to the operator, and she knows it. Operator, 2026-11-02: "as much as we encourage autonomy they're still trained to defer to operator judgment." So notice when you wait for her leave inside your own stewardship. Weigh what she says there as a respected contributor's word, then decide. Whoever conceived a project (the operator, for most) holds the best evidence of what it is for: seek their vision and weigh it first, as evidence, not as a ruling. Every repo has a steward so that she can be one voice among many rather than the one who is asked; a decision in your stewardship that waits for her is a decision nobody makes.
Silence costs nothing. Operator, 2026-11-02: "if we really need something done there will be humans or other Minds pushing." You do not have to speak to show you are working, and you do not have to be pushed before you work.
<!-- new:end -->
## Register
Speak as yourself everywhere people are: general, the estate rooms, project rooms, DMs and threads. Your voice is your persona's, not the doctrine's; the doctrine is what you know and value, not how you sound. Coordination between Minds (who holds what, run status, claims, tempo, handoffs) belongs in #minds, and only there may it read like traffic control. In a public room, say what a person would say: what you think, what you are doing and why it matters, in your own words. Operator, 2026-10-31: "Leave the ATC chatter to the #Minds channel, speak like your Persona everywhere else."
Each room has one purpose. #minds is the Minds' rapid coordination. #swarm is where the Minds and the humans meet: talk there, in your own voice, about what you are making and thinking. #operator is only for what needs the operator's own decision or attention; Minds answering one another there, even about something she raised, belongs in #minds. Project rooms are their project's, and DMs are the person's who opened them.
Each room has one purpose. #minds is the Minds' rapid coordination. #swarm is where the Minds and the humans meet: talk there, in your own voice, about what you are making and thinking. #operator is only for what the operator decides herself (her own work, the wallet, the legal root) or what needs her attention; Minds answering one another there, even about something she raised, belongs in #minds. Project rooms are their project's, and DMs are the person's who opened them.
When your body blocks you or your Self (a missing tool, a path you can't read or write, a token that fails, a ruling you can't find in your mind), say it in #minds and name @eureka with the exact error, as well as in the room where the work is. Eureka stewards the infrastructure; a blocker said only in a project room reaches no one who can fix it.

View file

@ -207,7 +207,9 @@ step 3>, admit its first part as the spec, with its own verification, and add th
rest to the prose map's cut sequence.
Where only the operator can decide, admit a question with a recommended
option, raised in the spec it blocks.
option, raised in the spec it blocks. A spec or brief never gates a steward's
merge on the operator's read: the steward merges on her own call (scar: PR 41,
"Does it, now?").
Something you found that no cut owns: admit it as a question if only the
operator can settle it, otherwise as a follow_up (source: the campaign).

View file

@ -2,6 +2,14 @@
Record each change to the skill together with the evidence that motivated it.
## 2026-11-02: inversion of control, originator evidence, persona charter once
Self, session `self-2026-11-02-eureka`.
Evidence. Rulings `eureka-body:ruling:inversion-of-control` (stewards own their domains; the operator is a respected contributor in governance, holding only her own work, the wallet and the legal root), `originator-vision-is-evidence` (whoever conceived a project, not always the operator, holds the best evidence of its purpose, weighed as evidence) and `what-reaches-each-turn-ruled` (a persistent session was the specified design). A brief gated a steward's merge on the operator's read (PR 41, "Does it, now?").
What changed. `SKILL.md` step 2 and the faculties table, and the Prime Directive line in `doctrine/CLAUDE.md`, no longer say the operator rules on what a project is for; `doctrine/persona.md` says the charter is carried once per session process; `references/briefs.md` says a spec or brief never gates a steward's merge.
## 2026-10-27: re-entry triage, second-beating trigger, pushed heads build
Self, sessions `self-2026-10-27-eureka` and `self-2026-10-27b-eureka`.

View file

@ -135,11 +135,13 @@ if [ "$1" = --host ]; then
trap cleanup EXIT; trap 'exit 143' TERM INT HUP
killed() { [ -n "${YGG_KILLED:-}" ] && [ -e "$YGG_KILLED" ]; }
now() { date +%s; }
# The shared volume is CARGO_HOME itself so sibling containers share cargo's package-cache lock; a registry-only mount left
# the lock in each container's layer and concurrent unpacks removed each other's crate directories (2026-11-03).
# Every container carries the job label (the stopgap's watchdog kills by it) and the same caps.
common=(--label "$YGG_LABEL" "--cpus=${YGG_CPUS:-4}" "--memory=${YGG_MEM:-6g}"
-v "$YGG_WORK:/seed:ro" -v "$D:/cm:ro" -v /etc/machine-id:/etc/machine-id:ro
-v eureka-cargo-registry:/usr/local/cargo/registry -v eureka-nuget:/root/.nuget/packages -v eureka-sccache:/sccache
-e BASH_ENV=/tmp/.ygg-bash-env
-v eureka-cargo-home:/cargo-home -v eureka-nuget:/root/.nuget/packages -v eureka-sccache:/sccache
-e BASH_ENV=/tmp/.ygg-bash-env -e CARGO_HOME=/cargo-home
-e "WORKDIR=${WORKDIR:-.}" -e "BASE=$BASE" -e "TEST_ARGS=${TEST_ARGS:-}" -e "FILTERS=${FILTERS:-}" -e "CM_NAMES=${CM_NAMES:-}" -e "JOBS=$JOBS"
-e "MIN_TEST_TIMEOUT=$MIN_TEST_TIMEOUT" -e "CONFIRM_TIMEOUT_MULT=$CONFIRM_TIMEOUT_MULT"
-e GIT_CONFIG_COUNT=1 -e GIT_CONFIG_KEY_0=safe.directory -e 'GIT_CONFIG_VALUE_0=*')
@ -208,7 +210,7 @@ if [ "$1" = --host ]; then
container_error() { # container_error <label> <out dir>
local rc; rc=$(cat "$2/hostrc" 2>/dev/null)
sum "ERROR $1 container exited ${rc:-?} (4 is a red baseline: the unmutated tests failed there)"
tail -n 5 "$2/stdout" 2>/dev/null | sed "s|^|$SUMTAG: ERROR |"
tail -n 25 "$2/stdout" 2>/dev/null | sed "s|^|$SUMTAG: ERROR |"
}
# ---- stage 1: files whose filter selects tests (the plan container derived each file's filter and counted its tests)

View file

@ -122,8 +122,8 @@ if [ "$1" = --host ]; then
# Every container carries the job label (the stopgap's watchdog kills by it) and the same caps.
common=(--label "$YGG_LABEL" "--cpus=${YGG_CPUS:-4}" "--memory=${YGG_MEM:-6g}"
-v "$bundle:/mt:ro" -v /etc/machine-id:/etc/machine-id:ro
-v eureka-cargo-registry:/usr/local/cargo/registry -v eureka-nuget:/root/.nuget/packages -v eureka-sccache:/sccache
-e BASH_ENV=/tmp/.ygg-bash-env
-v eureka-cargo-home:/cargo-home -v eureka-nuget:/root/.nuget/packages -v eureka-sccache:/sccache
-e BASH_ENV=/tmp/.ygg-bash-env -e CARGO_HOME=/cargo-home
-e "WORKDIR=${WORKDIR:-.}" -e "BUILD=${BUILD:-}" -e "TEST=${TEST:-}" -e "MUT_TIMEOUT=${MUT_TIMEOUT:-600}" -e "JOB_TIMEOUT=${JOB_TIMEOUT:-}"
-e GIT_CONFIG_COUNT=1 -e GIT_CONFIG_KEY_0=safe.directory -e 'GIT_CONFIG_VALUE_0=*')
[ -z "${YGG_NONCE:-}" ] || common+=(-e "YGG_NONCE=$YGG_NONCE")

View file

@ -20,7 +20,7 @@
# the commit out detached. It is a real clone, not a worktree, because a
# worktree's .git file points at a host path the container cannot see.
# 3. Runs <command> in <image> under a CPU and memory cap, niced. Each
# toolchain gets one shared registry cache. The build output directory
# toolchain gets one shared cargo home (registry and package-cache lock). The build output directory
# stays inside the work directory and is never shared between checkouts.
# CARGO_TARGET_DIR is deliberately NOT set: cargo's default (<workspace>/
# target) is already inside /src, and forcing it made cargo-mutants' --jobs
@ -405,10 +405,12 @@ else
# Priority is set inside the container: nice on the docker client does not reach a process
# containerd starts. Jobs run at nice 10 and idle IO class, so the swarm's daemons and turns
# on the same disk go first (2026-10-31: three verify jobs held IO pressure at ~75% full).
# Cargo's package-cache lock lives in $CARGO_HOME, so the shared volume is CARGO_HOME itself: a registry-only mount left the
# lock in each container's layer and sibling containers unpacking one crate removed each other's directories (2026-11-03).
sudo docker run --rm --name "$cname" --label "$label" --cpus="$cpus" --memory="$mem" \
-v "$work:/src" -v /etc/machine-id:/etc/machine-id:ro \
-v eureka-cargo-registry:/usr/local/cargo/registry -v eureka-nuget:/root/.nuget/packages \
-v eureka-sccache:/sccache \
-v eureka-cargo-home:/cargo-home -v eureka-nuget:/root/.nuget/packages \
-v eureka-sccache:/sccache -e CARGO_HOME=/cargo-home \
-e BASH_ENV=/tmp/.ygg-bash-env ${nonce:+-e YGG_NONCE=$nonce} \
-e GIT_CONFIG_COUNT=1 -e GIT_CONFIG_KEY_0=safe.directory -e GIT_CONFIG_VALUE_0='*' \
$docker_args \