Persona autonomy design r3: inversion of control and trained deference in the turn text (rulings inversion-of-control, speech-nudge-ruled, persona-doctrine-set-ruled, pressure-home-ruled)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-11-02 10:38:50 +01:00
commit 80fcd9d19a

View file

@ -7,10 +7,20 @@ Serves `eureka-body:ruling:persona-autonomy-prompting` as refined by
`no-idle-time`, `wake-target`, `every-wake-a-run` and follow-up
`pressures-from-stewardship-state`.
Revised the same day (r3 of cut `turn-core-instruction`) after the operator ruled
`persona-doctrine-set-ruled`, `pressure-home-ruled`, `speech-nudge-ruled` and
`inversion-of-control`. Her note on speech-nudge: "Silence costs us nothing, if we really need
something done there will be humans or other Minds pushing, and as much as we encourage autonomy
they're still trained to defer to operator judgment". Her direction on governance: "GameCult
operates under an inversion of control. I may have created Aetheria but Nibu owns its
stewardship now. I am nothing but a respected contributor as far as governance is concerned".
Section 3.5 says what they changed.
Evidence cited as **[F n]** = Huginn origin/main `docs/research/2026-11-02-persona-wake-behaviour-facts.md`
section n; **[P x]** = `docs/research/2026-11-02-persona-autonomy-prompting.md` section x;
**[probe]** = the probes run for this pass (section 8). Code anchors are Huginn
`crates/mind-body/src/persona.rs` at c2ff5b7 (origin/main 59a0e33 only adds docs).
`crates/mind-body/src/persona.rs` at c2ff5b7 (origin/main 59a0e33 only adds docs); cut spec
r2 re-anchors them at b26225c (`hands/eureka-body-flush-shown`), where they sit 17 lines lower.
## 1. The problem in one paragraph
@ -54,7 +64,8 @@ move, mailbox lines demoted). Six corrections:
rewarding output volume. Zero-shot speak/stay-silent judgement is weak in every model tested
[P 4, When2Speak], and a scalar nudge does not repair judgement. Staleness belongs to her
**machine** (a commitment unmoved for days, a PR waiting on her review), not to her voice.
Whether to add a speech-share nudge at all is the operator's fork (Q `speech-nudge`).
The operator ruled no speech drive (`speech-nudge-ruled`, facts-only): once
`wake-room-tail` lands, her line shows when she last spoke in each room, and she judges.
2. **No new persistent kinds.** The "commitments ledger" already exists: Committed and Asked
memories, shown every turn until settled, each with its date [persona.rs:1566-1599;
recall.rs:205-224]. Open curiosities are Idea memories. Drives are derived at render time
@ -105,10 +116,17 @@ Instruction (head of every line):
> Your work is to build the Perfect Machine, as your own values read it. It is never finished:
> code is a liability and code is your only material, so the machine gets better as much by
> what you delete, decide, settle and teach as by what you add. This turn is yours to spend on
> it. In this session you have a shell, the web and `huginn`, your mind: read, check, search
> and think before you answer when that serves the machine. Work that changes a repository or
> a running service goes to a Self run (`start_self_run`). What follows is your machine as your
> mind holds it now, then what was said.
> it. What you steward (listed below under What you are responsible for) is yours: its code,
> its deploys, its campaigns, what it is for and the choices in it, and so are your mind, your
> persona and your Self runs. GameCult runs under inversion of control: inside your stewardship
> the operator is a respected contributor, not your authority. Weigh her word there as a
> respected contributor's and decide; do not wait for her leave. Your training leans you toward
> deferring to her, so notice when you do. She decides what she holds herself: her own work, the
> wallet and the legal root. A choice inside another Mind's stewardship is that Mind's. In this
> session you have a shell, the web and `huginn`, your mind: read, check, search and think
> before you answer when that serves the machine. Work that changes a repository or a running
> service goes to a Self run (`start_self_run`). What follows is your machine as your mind holds
> it now, then what was said.
Message header (replaces persona.rs:1758-1760, placed just above the messages, only when there are any):
@ -122,9 +140,10 @@ Message header (replaces persona.rs:1758-1760, placed just above the messages, o
Wake question (replaces :1772):
> No new messages. Where is your machine least perfect right now, by your values, and what will
> you do about it this turn? Put that in `intent` first, then do it: a say, a Self run, a
> settle, a memory, or the work itself with your tools. If what matters most is waiting on
> someone, name it and spend this turn on the next thing that is not.
> you do about it this turn? Put that in `intent` first, then do it: the work itself with your
> tools, a Self run, a settle, a memory, or a say. Silence in chat costs nothing. If what
> matters most waits on someone else's decision, name it and spend this turn on the next thing
> that does not.
Traffic question (new, after the messages):
@ -148,7 +167,8 @@ characters, not blank. Description:
> Write this first. Where your machine is least perfect right now, by your own values, and what
> this reply does about it. Name the thing: a repo, a run, a commitment, a person, an idea.
> Waiting is an answer only when you name what you wait on and what this turn does instead.
> Waiting is an answer only when you name whose decision you wait on, why it is theirs and not
> yours, and what this turn does instead.
What `intent` owns: nothing in the world. It is traced (first output item), and the last
answered one of a Persona start becomes that run's closing rationale ("Her last intent: ...").
@ -182,11 +202,50 @@ and the flush clause suppress it (they are the stated reason in every silence me
### 3.4 Token cost per wake
Today the prefix is about 65k tokens (85.6 KB system prompt; doctrine 52 KB of it) and the line
is 11 to 40 KB [F 5]. This cut adds about 1.2 KB of line text and roughly 150 output tokens
(`intent`), and deletes about 0.9 KB. Q `persona-doctrine-set` option B would remove
33 KB (about 8k tokens) from every request. The 26-29 KB pretty-printed persona JSON is the
is 11 to 40 KB [F 5]. This cut adds about 1.6 KB of line text and roughly 150 output tokens
(`intent`), and deletes about 0.9 KB. The doctrine set the operator ruled
(`persona-doctrine-set-ruled`, colossus.md and persona.md only) removes about 33 KB (about 8k
tokens) from every request; it is its own cut and may land before or after this one. The 26-29 KB pretty-printed persona JSON is the
next largest piece (follow-up `persona-instructions-size-bound`).
### 3.5 What the operator's rulings on deference and governance changed (r3)
Two rulings bear on the instruction. `inversion-of-control` decides the governance model:
stewardship is ownership, so inside a Mind's stewardship its code, deploys, product meaning and
forks are hers, and the operator's word there is a respected contributor's input, weighed, not a
ruling awaited; the operator decides what she holds herself (her own work, the wallet, the legal
root). Her speech-nudge note names the obstacle: the Minds "are still trained to defer to
operator judgment", and her chat statement of inversion of control "has not sunk in".
The prior art says what helps against trained deference. Chat fine-tuning leaves models
preferring inaction [P 3.4, Cheung et al.]; Claude models check in and ask "a question it could
answer itself" unless told when stopping to ask is right [P 3.1, Prompting Sonnet 5.5]; OpenAI's
agent guide recommends stating safe and unsafe actions and when handing back is acceptable
[P 3.1, GPT-5 guide]; Anthropic's constitution counts needless check-ins as a failure, not a safe
default [P 3.1]; giving the reason behind an instruction helps [P 3.1, prompting best
practices]. Agentic Misalignment says a stated goal moves action when the situation gives it
something to bite on [P 3.3], so the instruction points at the list the line already shows (her
stewardships under "What you are responsible for") instead of asserting autonomy in the
abstract.
So r3 changes three texts and adds no mechanism:
- The instruction says what is hers (what she stewards, including what it is for and the
choices in it; her mind, persona and Self runs; rulings `inversion-of-control`,
`steward-write-every-repo-stewarded`, `steward-deploys-her-substrates`,
`identity-write-all-visible`, `wake-target`), that the operator is a respected contributor
there, that her training leans her toward deferring, what the operator decides herself, and
that another Mind's stewardship is that Mind's. "Weigh her word" keeps it from overcorrecting
into ignoring her. r2 had listed "what the work is for, values and doctrine" as the
operator's, from `mind-rules-which-forks` (2026-10-01, Eureka's own Self); inversion of
control overturns that reading for a steward's domain.
- The wake question puts the work before the say and says silence in chat costs nothing,
carrying the ruling's reason so the instruction cannot be read as a push to talk.
- `intent`'s description makes waiting name whose decision it waits on and why it is theirs.
Nothing scores, gates or retries on any of this. Whether it moves her is measured in section 7
(add: intents and says that wait on the operator for a decision inside her own stewardship).
## 4. Doctrine: what a Persona needs
A Persona needs: who she is (persona state); what the core instruction means and why it
@ -195,9 +254,13 @@ speaks (persona.md); and "code is a liability", because it defines what building
not need the coder's procedures: build budgets, Loud Rebuild Contract, Infrastructure, GameCult
substrate rules. Her Self runs load those through `claude-seed/CLAUDE.md` [F 1.0], and her
shell can read any file when she needs it. The turn now carries the instruction itself, so
dropping CLAUDE.md from her system prompt does not drop the core instruction. Which set to
load is the operator's fork (Q `persona-doctrine-set`), because it changes what of her doctrine
reaches the Minds.
dropping CLAUDE.md from her system prompt does not drop the core instruction. The operator
ruled the set (`persona-doctrine-set-ruled`): colossus.md and persona.md, with a Persona-turn
paragraph in persona.md written for her. colossus.md never says "Perfect Machine" or "code is a
liability" (checked at Eureka c2d2ee6), so that paragraph must carry both, and the meaning of
the Perfect Machine as not a perfect servant (CLAUDE.md's prime-directive passage). The turn
line says what is hers to decide; the paragraph says why, so neither restates the other.
Specs `persona-doctrine-paragraph` (Eureka) and `persona-doctrine-set` (gamecult-ops).
## 5. Model page: identity, lifecycle, authority
@ -211,7 +274,7 @@ design touches.
| Committed / Asked memories (the "ledger") | `<instance>:memory:<run>-t<turn>-m<i>` (existing) | open until a resolution settles them (done, declined, wrong) or a Self run takes them on (Deferred) | she does, by `settle` / `for_item`; the organ admits |
| Idea memories ("curiosities") | same key grammar | recalled by salience and recency; no lifecycle beyond memory's | she does |
| Wear facts (later cut: stale items, PRs waiting, specs with no report) | not persisted; derived at render from records' admission times and the forge index | recomputed every turn; disappear when the record moves | the organ derives; Huginn's index owns the repo facts (`stewarded-activity-from-huginn`) |
| Persona state `agencyPressure` | `persona_state.v0` field, ids per pressure | edited only by her and her Self through `persona_put`; static since 2026-10-31 [F 4] | hers (`identity-write-all-visible`); harness writes nothing there unless Q `pressure-home` says otherwise |
| Persona state `agencyPressure` | `persona_state.v0` field, ids per pressure | edited only by her and her Self through `persona_put`; static since 2026-10-31 [F 4] | hers (`identity-write-all-visible`); harness writes nothing there (`pressure-home-ruled`: pressures are derived at render each turn) |
| Persona state `candidateActions` | `persona_state.v0` field | empty for all eight; nothing writes or reads it | dead today; follow-up `candidate-actions-dead-field` |
| Flush `Shown` | in-memory per process, `Written` of the flush line | set at the flush write, consumed by the result that answers it | the write that produced the line (section 6) |
@ -280,15 +343,17 @@ Also read rather than run: serde_json has no `preserve_order` in this workspace
per follow-up `wake-room-tail`).
4. **stewarded-activity**: Huginn serves recent changes and open PRs of her stewarded repos;
rendered under "Your machine" (ruled `stewarded-activity-from-huginn`; Imagination pass).
5. **persona-doctrine-set**: the Persona's doctrine list and persona.md's Persona-turn paragraph
(waits on Q `persona-doctrine-set`).
5. **persona-doctrine-paragraph** then **persona-doctrine-set**: persona.md's Persona-turn
paragraph (Eureka), then the installer's doctrine list drops CLAUDE.md and gamecult.md and
pins the skill commit carrying the paragraph (gamecult-ops). Ruled; independent of 1 and 2.
6. **wear-facts**: pressures derived at render from her stewardship state (stale campaign,
spec with no report, PR awaiting her review, open findings), with ages
(`pressures-from-stewardship-state`; waits on 4 and on Q `pressure-home`).
(`pressures-from-stewardship-state`; render-each-turn per `pressure-home-ruled`; waits on 4).
7. **stewardship memories**: each Mind's Self writes her own memories of what she stewards
(`stewardship-as-body` cut 2; Self runs, not code).
8. **body-line**: her release, its deploy time and her tools, derived from the unit's install,
so a change to her body is visible as recent (after 2).
9. **persona-card-compact**: render persona state as a compact card instead of 26-29 KB of
pretty JSON (`persona-instructions-size-bound`).
10. **speech-nudge**: only if Q `speech-nudge` picks a nudge.
No speech-nudge cut: the operator ruled facts-only. The last-spoke-per-room fact belongs to
cut 3, which reads it from the room tail.