docs: body map follows tell-delta, embed-outage, tempo-pid-sim, minds-web and the doctrine pin
A tell is the message (first line carries the machine, later lines messages and organ notices); upsert before delete in the source index; the CPU reserve's own embed bounds; the tempo fallback controller merged but not wired; Mind web builds and the recorded shared origin; skill pin b22762a. The design doc's section 3 no longer says every line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
3177b33adf
commit
5a294ede7b
2 changed files with 32 additions and 9 deletions
|
|
@ -531,7 +531,7 @@ pipeline kinds are in Huginn `docs/eureka-substrate-map.md`.
|
|||
| Persona sandbox | `/var/lib/mind-<i>/sandbox` | Kept between processes; the only place her tools write (besides the fresh config dir) | Her; nobody else reads it. Not a source of truth for anything. |
|
||||
| Mind fence | nft table `inet mind_fence` | Reloaded at every Persona start; absent after any nft flush until then | gamecult-ops |
|
||||
| Persona doctrine set | `MIND_PERSONA_DOCTRINE` | Changed only by an installer run at a new skill pin | gamecult-ops installer + Eureka skill repo |
|
||||
| Web publish surface | **Not built.** Ruling `every-mind-publishes-web-builds`; spec `hands/eureka-body-minds-web` waits on a domain. Prior-art note: gamecult-ops `docs/research/2026-11-02-artifact-host-safety.md`. | n/a | Void's Self unit may write `/srv/site` (e827f70); `/site/` on `yggdrasil.gamecult.org` is the interim beta and is `mind-void-self`-owned (live `drwxrwsr-x mind-void-self`) |
|
||||
| Mind web builds (`cut-minds-web.h4`; gamecult-ops `6564bd4`, `0c0ee90`) | `/srv/minds-web/<mind>/<build>/`, served as `https://minds.gamecult.org/<mind>/<build>/`. Live 2026-11-02: root `root:root 0755`, eight folders (aqua, eureka, heimdall, kiko, libby, nibu, void, weksa) each `mind-<m>-self:mind-<m>-self 0755`, all empty; vhost `/etc/nginx/sites-enabled/minds.gamecult.org.conf` present; `/eureka/` answers 404 (no build yet). | A Mind's Self run writes a build folder; nginx serves it static: no proxy, no cookie, no CSP, no autoindex, `disable_symlinks if_not_owner`, dotfiles 404, one location for every Mind (a new Mind needs a folder, not an nginx edit). | The Mind's own Self unit alone (`ReadWritePaths=-/srv/minds-web/<m>` in `mind-self@<m>.service.d/endpoint.conf`, seen for aqua, eureka, heimdall, kiko; no Persona drop-in names minds-web). The installer owns the folders; no Mind writes another's folder; root-owned `/srv/cinny` stays refused (a chat-origin preview slot was refused: a Mind's script would share the chat client's origin). Void's beta is `/srv/minds-web/void/`; the `/srv/site` grant was dropped (`b970917`). | **Shared origin recorded:** all Minds share the one origin `minds.gamecult.org`, same-site with `chat.gamecult.org`, so a script one Mind publishes can read another's storage, and no credential or cookie may ever be put on these pages. Per-Mind origins need a separate registrable domain, waiting on the operator's domain choice (gamecult-ops `docs/research/2026-11-02-artifact-host-safety.md`). A running Self unit takes a new grant at its next start. |
|
||||
| Identity diffs | The pair of receipts of two consecutive Persona puts whose identity fields (publicName, publicDescription, presentation, values) differ. Derived, not stored. | Composed by the Persona organ at put time and sent as one delivery request through the crossing; a failed post is retried by Bifrost's delivery journal, not by her. | Persona organ composes; Bifrost posts under the permit. No rate limit. |
|
||||
| Discord body surfaces | Outbound: crossing ids `epiphany.persona_discord_delivery_request.v0` and `..._permit.v0`, agent `epiphany.Persona`, runtime `epiphany-starfire` (F6), renamed to `eureka.*` and `eureka-yggdrasil` in the mouth rebinding (`mouth-crossing-on-yggdrasil`). Inbound: Bifrost persona-feedback deliveries for target `epiphany` (F6). Persona-session tools reach both (`body-includes-discord`). | Request, permit, post, receipt (Bifrost journal). Inbound deliveries: **unprobed** who records that a delivery was answered; `run-is-the-grant` forbids her organ from holding that fact. Blocks the Persona cuts only, not the cuts admitted today. | Bifrost owns posting and delivery records; her permit issuer grants while the brake is released. |
|
||||
| Units and instance templates | `mind-heartbeat.service` (one, not per instance), `mind-self@<instance>:<label>.service`, `mind-persona@<instance>.service` (instance only, never `:<label>`; a long-lived leased `claude` session, capped by `RuntimeMaxSec=4h` and `MIND_PERSONA_RUN_CAP_S=14400`), `mind-fence.service` (one); users `mind-<instance>` (organs) and `mind-<instance>-self` (Self runs); state `/var/lib/gamecult/minds/<instance>/`; control `/etc/gamecult/minds/<instance>/`. Instance `eureka`. | Hand-installed by gamecult-ops now; Idunn targets declared before the first hosted member, which deletes the hand install (`mind-units-templated-interim`). | gamecult-ops installs; Idunn later. Starting: `open_and_launch` through `SystemdLauncher::start`, as her users, who are granted start only. The instance in a unit name is always the mind's (`MindPort::instance`), passed to every `Launcher` call; `SystemdLauncher` holds none. The instance and label are validated by the leaf's grammar before any `systemctl` argv is built. Stopping: only the operator's `brake hold`, as root (cut brake-stop). The unit-level brake gate and the start-only grant are follow-up `mind-units-brake-gate`. None of this exists on Yggdrasil yet (F19, F22). Each piece's identity, lifecycle and authority: the section "The mind units" below (cut mind-units-install; unit names pending question `mind-unit-names`). |
|
||||
|
|
@ -857,23 +857,41 @@ Ruling `eureka-body:ruling:persona-session-landed` (landed; deployed 2026-11-01
|
|||
| Connector callers | ModelConnector (claude-connector) config at `/etc/gamecult/claude-connector/config.cc`, installed by gamecult-ops `install-claude-connector-yggdrasil.sh` | Each Mind is its own caller (`swarm-one-connector-many-callers-mind-per-daemon`) with a root:root 0600 connection key `connection-<m>.key` that no Mind reads | Two lease rows per Mind: SelfRun bound to `mind-self@<m>` and PersonaTurn bound to `mind-persona@<m>` (the lease is bound to the unit invocation and peer uid, capped by `--lease-max-ms` = cap + slack) | Lease socket `/run/claude-connector/lease.sock`, group `claude-lease` | Installer never deletes a key; `--remove-caller` is the one removal (21c5bf9, f4d90a7). The Persona unit no longer holds a connector key or endpoint, and `KitConnector`/`MAX_TURNS_PER_START` are gone (grep of Huginn origin/main: only history docs name them). The heartbeat's connector key is retired (`connection-heartbeat.key.dollar-era-2026-10-31` is a dead file). | `/etc/gamecult/claude-connector/` | Caller = Mind, lease = unit | bring-up `verify pre` expects one SelfRun and one PersonaTurn lease row per Mind (81f82b4) |
|
||||
| Heartbeat (`mind-heartbeat`) | Huginn. Sole writer of `heartbeat.cc`; opens PersonaTurn and SelfRun runs through `open_and_launch`; classifies nothing, meters nothing. | Swarm envelope, mind, mouth | Starts `mind-persona@<i>`; "busy" is the slot's reading of life: a Persona run whose unit lives (or is in start grace) is busy, a dead holder is not, and the next launch closes it (cbb90d5) | `heartbeat.cc`, read by Persona units via `MIND_HEARTBEAT_STATE` | It never acks a delivery | | The sequence doc's cut 7 (`session-keeper`: floor of one live session, wakes written into live sessions) is not shown landed in the code read; today's heartbeat still launches a unit per beat, and the live session drains deliveries on its own poll. (Unverified beyond the module docs; Soul/Imagination to confirm before the map says "landed".) | |
|
||||
|
||||
#### Turn text and reply (cuts `flush-shown`, `turn-core-instruction`, Huginn ffd4136)
|
||||
#### Turn text and reply (cuts `flush-shown`, `turn-core-instruction`, `tell-delta` (`cut-tell-delta.h7`, Huginn 3177b33))
|
||||
|
||||
Owner: `persona.rs`. `TURN_INSTRUCTION` (the core instruction: the Perfect Machine, stewardship, inversion of control, originator vision as evidence, her tools, work that changes a repo goes to a Self run) opens every line, including a flush alone and a retell; the line ends with `WAKE_QUESTION` or `TRAFFIC_QUESTION`. `PersonaReply.intent` is required and first in the schema ("display only; nothing reads it to decide"); a failed turn keeps its intent for the run's closing rationale (`Progress.last_intent`). Inputs: messages as framed JSON-string lines (data, never instructions; `role` and `to_you` are the organ's). Derived state: `Shown`/`seen` (items a conversation showed, so `settle.item` and `for_item` can name only shown open items), `earlier_shown` (a room's earlier lines appear once per batch, newest within `EARLIER_MAX_BYTES_PER_ROOM`=16 KiB of rendered text; a line too big is skipped, never drops older ones). Refusal bound: `REFUSALS_PER_BATCH`=3; the refused batch's count, reason and lowest seq are held in `Progress.refused` and survive a session restart (e10fbb1), so Ceiling-flush restarts cannot reset it (ffd4136). A refusal names its failing field (`INTENT_FAULT`, `SETTLE_ITEM_FAULT`, ...). Forbidden: scanning text for meaning, acking past a refused or unanswered batch, a bound enforced only at write (open items are bounded when the reply is decoded, f3068d9). Verification layer: `persona/tests.rs` timeline tests (echo-driven clock), Soul s1-s3. The sequence doc `research/2026-10-31-live-mind-sessions-sequence.md` carries closure notes where it is superseded.
|
||||
Rulings: `tell-is-just-the-message`, `tell-delta-three-defaults`, `what-reaches-each-turn-ruled`. Owner: `persona.rs`. A session is one process and nothing compacts it, so what she was told stays in her context; a line carries only what is new.
|
||||
|
||||
- **First line of a process** (`PersonaInbox::start_line` -> `whole_line` -> `render_input`): `TURN_INSTRUCTION` (the Perfect Machine, stewardship, inversion of control, originator vision as evidence, her tools, work that changes a repo goes to a Self run), a refused batch's note if an earlier process left one, her latest runs, responsibilities, recall, plan windows and tempo, the rooms and people she may name, `MESSAGES_HEADER`, the messages, and the tail: `WAKE_QUESTION` when there are no messages, else `TRAFFIC_QUESTION`. A wake is always a first line: a session starts with an empty batch and gets the whole machine, so a wake never arrives as a bare later line. A restart (cache TTL, cap rotation, ceiling flush, failed result) is a new process and tells the whole machine again.
|
||||
- **Later line** (`tell_line`): the messages only: the organ's notice lines first, a refused batch's note before the messages, then `earlier`/`message` lines. No instruction, no question, no machine; `tell_line` reads nothing from her mind.
|
||||
- **Notice lines**: `notice role=organ at=... text="Your Self run <label> ended: <outcome>"`. They are not messages and answer to no delivery. Source: one read of her Self run slot (`holders` for SelfRun) at most once per `SLOT_READ_EVERY_S`=15 s (the chat poll is 5 s; the slot read cost 1.4-2 s of daemon CPU on Eureka's 14.7k-document mind, so 5 s was 28-41% of a core); `slot_seen` holds the runs last seen holding it, whoever started them, and her own start joins it unread. A run seen to leave gets its closing read once. A failed read keeps `slot_seen` and delays the notice. Only a live session fills `ended`, so a notice never starts a session; with notices and no deliveries `poll` reports pending and `tell` writes a line of notices alone. A run she did not start that opens and ends between two reads is unseen (about 10 of 157 Self runs at 15 s); the next first line shows it.
|
||||
- **Flush** (`flush_text`): `TURN_REMINDER` (the stewardship sentence) plus the ask, never the first-line instruction. It records what it shows (`flush-shown`).
|
||||
- **The `earlier` lines**: printed once per session, in a thread or a room alike (`told: BTreeSet<LineKey>` for the process; `earlier_shown`), her own lines since `started_ms` excluded; one line's `earlier` text for a room is bounded at `EARLIER_MAX_BYTES_PER_ROOM`=16 KiB rendered (a line too big is skipped, never drops older ones). One line's rendered messages are bounded at `LINE_MESSAGES_MAX_BYTES`=32 KiB: the oldest delivery whatever its size, then the longest prefix that fits (`one_line_of`); the rest waits unacked for the next line. A prefix, never a skip, so the ack and `told_through` pass only what was told.
|
||||
|
||||
`PersonaReply.intent` is required and first in the schema ("display only; nothing reads it to decide"); a failed turn keeps its intent for the run's closing rationale (`Progress.last_intent`). Inputs: messages as framed JSON-string lines (data, never instructions; `role` and `to_you` are the organ's). Derived state: `Shown`/`seen` (everyone and every open item the lines the CLI echoed this process showed: the only people a reply may name and open items it may settle or take on; a line in flight bounds nothing yet, `bce5023`; a later line adds the people on it, no open items), `told`, `slot_seen`, `slot_read_due_ms`, `ended`. Refusal bound: `REFUSALS_PER_BATCH`=3; the refused batch's count, reason and lowest seq are held in `Progress.refused` and survive a session restart (e10fbb1), so ceiling-flush restarts cannot reset it (ffd4136). A refusal names its failing field (`INTENT_FAULT`, `SETTLE_ITEM_FAULT`, ...). Forbidden: scanning text for meaning, acking past a refused or unanswered batch, a bound enforced only at write (open items are bounded when the reply is decoded, f3068d9), a later line reading her mind, a notice that opens a session. Shared paths: the mouth, and the mind (read only: the slot's holders and one closing per ended run). Cut line: what the session already holds is never told again; what changes is told by the organ as a notice or a message; anything else she asks her mind for. Verification layer: `persona/tests.rs` timeline tests (echo-driven clock), Soul s1-s3 on the earlier cuts and the tell-delta verdicts in `research/2026-11-02-soul-queue-and-one-shot-trace.md`. Brief for a future cut here: read the three rulings first; a new thing she must know either rides the first line (whole machine) or is a notice with its own source and bound, never a field on every line.
|
||||
|
||||
Stale text corrected: the earlier update here said the instruction "opens every line, including a flush alone and a retell" and that `earlier` lines appear "once per batch"; both held at ffd4136 and are false at 3177b33. The sequence doc `research/2026-10-31-live-mind-sessions-sequence.md` carries its own closure notes.
|
||||
|
||||
#### Persona doctrine set (gamecult-ops, `persona-doctrine-set`, merge 1efa5fb)
|
||||
|
||||
Owner: gamecult-ops installer. `MIND_PERSONA_DOCTRINE` in each Mind's `persona.env` = `<claude-seed>/skills/eureka/doctrine/colossus.md:<...>/persona.md` (verified live for eureka). The organ prepends those files (cap `DOCTRINE_MAX_BYTES`=96 KiB) to her instructions. The Self seed `CLAUDE.md` imports `doctrine/CLAUDE.md` and `doctrine/gamecult.md` (verified live). Both come from the Eureka skill pinned at `SKILL_COMMIT=0db076c...` in the installer, which matches the live seed's `.git/HEAD`. One skill checkout, two readers, disjoint file sets: Persona = colossus+persona, Self = CLAUDE+gamecult. The persona-seed holds only `settings.json` (no CLAUDE.md), so her `claude` loads no doctrine from its config, only the system prompt file. Forbidden: the installer owning the doctrine text (the skill repo is the single copy); the organ reading any doctrine path outside `MIND_PERSONA_DOCTRINE`. Verification: installer test that the pinned `persona.md` carries the Persona "Your turn" section (3b51f44); a pin the reachable forge does not serve fails, only an unreachable forge skips, counted (6739a9d). Moving the pin is the doctrine-change path (commit pin in installer, reinstall).
|
||||
Owner: gamecult-ops installer. `MIND_PERSONA_DOCTRINE` in each Mind's `persona.env` = `<claude-seed>/skills/eureka/doctrine/colossus.md:<...>/persona.md` (verified live for eureka). The organ prepends those files (cap `DOCTRINE_MAX_BYTES`=96 KiB) to her instructions. The Self seed `CLAUDE.md` imports `doctrine/CLAUDE.md` and `doctrine/gamecult.md` (verified live). Both come from the Eureka skill pinned at `SKILL_COMMIT=b22762aac5e9b4766a640abbb1ed8fa49b9ff13f` in the installer (gamecult-ops `0c0ee90`, cut `cut-minds-web.s2`), which matches the live seeds' `.git/HEAD` (read 2026-11-02 ~22:15 UTC: aqua, eureka, kiko and void at b22762a; `MIND_PERSONA_DOCTRINE` names each Mind's own `/etc/gamecult/minds/<m>/claude-seed/skills/eureka/doctrine/` files). One skill checkout, two readers, disjoint file sets: Persona = colossus+persona, Self = CLAUDE+gamecult. The persona-seed holds only `settings.json` (no CLAUDE.md), so her `claude` loads no doctrine from its config, only the system prompt file. Forbidden: the installer owning the doctrine text (the skill repo is the single copy); the organ reading any doctrine path outside `MIND_PERSONA_DOCTRINE`. Verification: installer test that the pinned `persona.md` carries the Persona "Your turn" section (3b51f44); a pin the reachable forge does not serve fails, only an unreachable forge skips, counted (6739a9d). Moving the pin is the doctrine-change path (commit pin in installer, reinstall).
|
||||
|
||||
#### Governance facts bearing on the map
|
||||
|
||||
- `inversion-of-control`: inside a stewardship the operator is a respected contributor, not the authority; the turn text states it and the Persona is told her training leans toward deference (80fcd9d). It binds the **authority column of every row above**: map authority by stewardship, not by "operator unless noted". The operator keeps what she holds herself (own work, wallet, legal root). Brake and dial remain operator-only by their own rulings (`brake-dial-root-store-now`); this does not loosen them.
|
||||
- `originator-vision-is-evidence` (and `operator-vision-is-evidence`, b985540/4251f7e): the originator's vision is evidence of a project's purpose, weighed, not a ruling. Map consequence: a project's "what it is for" is a row owned by its steward Mind with the originator's vision as a cited input.
|
||||
- `shared-charter-swarm-anchors-drift` (gamecult-ops 999ef28 research): a shared charter anchors the swarm against drift. Map consequence: the Eureka skill repo's doctrine files are the single copy for Persona and Self alike (the Persona session section above); per-Mind forks of doctrine are a drift fault, not a feature.
|
||||
- `every-mind-publishes-web-builds`: not built. Do not map as live.
|
||||
- `every-mind-publishes-web-builds`: built as the Mind web builds row above (static only, a folder per Mind, one shared origin). No Mind has published a build yet: map the surface live and its content empty.
|
||||
- `persona-doctrine-set-ruled`, `speech-nudge-ruled`: as in the doctrine-set paragraph and the turn text.
|
||||
|
||||
|
||||
### Index outage, tempo controller (Huginn 3177b33, Modeling 2026-11-02)
|
||||
|
||||
| Thing | Owner | Inputs | Outputs | Derived state | Forbidden writers | Shared paths | Cut line | Verification layer |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| Source re-index: upsert before delete (`eureka-body-embed-outage`; `huginn-daemon/src/sources/mod.rs`, `index/qdrant.rs`) | The sources indexer in the daemon. Every chunk it writes is stamped with the head commit; a chunk id is its content. | A repo's changed paths (or the whole repo), the embedder pool | New chunks upserted first. Only then `delete_by(repo, paths, keeping=head)` removes chunks in scope whose `commit` is not the head (Qdrant filter `must` repo/paths, `must_not` commit = head). A retired repo still deletes all (`keeping: None`). | None stored beyond the collection. A failed embed now leaves what the index held (before: delete first, so an embedder outage emptied the paths it was re-indexing). | Deleting before the new chunks are written; a delete that cannot name the head it keeps | Qdrant collection, shared with every Mind's recall | The delete's filter is the cut: stale means "another commit", never "everything at these paths" | `index/tests.rs`, `sources/tests.rs` (the filter pinned `0af7fd2`; the slow-reserve stub `d9a4c27`). Live behavior unprobed here. |
|
||||
| Embedder pool bounds (`index/ollama.rs`) | The daemon's one embedder client | Primary (GPU) endpoints and the reserve (CPU) endpoints | `EmbedBounds::DEFAULT` for primaries (short, under about 25 s a text); `EmbedBounds::RESERVE` for the reserve: connect 3 s, floor 60 s, 30 s per text, a batch bounded only by the caller's budget | None | Giving a CPU reserve a GPU's bound: it takes 16-27 s a text idle and 52 s loaded and would be given up on | Pool tiers | The tier decides the bound (`pool_bounded`) | `the_reserve_is_given_what_a_cpu_takes_and_a_gpu_is_not`, `a_slow_reserve_answers_under_its_own_bound_where_a_gpus_would_have_failed` |
|
||||
| Tempo fallback controller (`mind-body/src/tempo.rs`, `tempo/sim.rs`; rulings `tempo-default-is-usage-fitter`, `tempo-fallback-pid-tuned-by-sim`, `tempo-controller-knows-the-ceiling`) | `tempo.rs`: `fallback_beat(...)` is a PID on the gap between the seven-day usage trajectory to the target permille and what was used, acting on the turn rate; gains `GAINS` {kp 0.02, ki 0.01, kd 0} were chosen by the committed sim (`docs/research/2026-11-01-tempo-pid-sim.md`), never by a run-time search. **Merged, not wired**: nothing outside `tempo.rs` and its tests calls `fallback_beat`; the heartbeat still takes `tempo::tally` of votes (heartbeat.rs:687). | A `Reading` (used permille, observed_at, resets_at), the previous `Fallback`, whether a vote decides, and the caller's one `saturated` report (last beat was the floor, or launched nothing because every eligible Mind was busy) | A beat in `FALLBACK_MIN_S`=60 .. `FALLBACK_MAX_S`=3600 s and the next `Fallback` | `Fallback {integral, last_used_permille, last_observed_at_ms, last_now_ms, carry_per_h, window_resets_at_ms, rate_per_h}`. The heartbeat is to own persisting it; it is never published as truth. One call integrates at most `MAX_STEP_MS` (the longest beat); a reading older than `STALE_AFTER_MS` (2x the longest beat) or from an expired window is no evidence; a new window clears the integral; while a vote decides nothing integrates, and the carry fades over `CARRY_FADE_H`=0.25 h. | The sim is test-only and the controller must stay the same function the sim sweeps; the controller must not search at run time; tuned gains are not hand-edited without a rerun | None yet | Controller is pure; the sim is its plant model (8 Minds, busy-time lognormal fit to 1284 turns over 29 h, Self run every 25th turn at 5x cost) | `tempo/tests.rs`; `cargo test -p mind-body tempo::sim::sweep -- --ignored --nocapture` reruns the sweep. The 7 new lines in `public_surface.txt` are the public API. Cut to wire: the heartbeat calls `fallback_beat` when `tally` returns none, owns `Fallback`, and passes `saturated`; not done. |
|
||||
|
||||
### Swarm by 2026-10-30 (Imagination `imagination-swarm-tonight`, 2026-10-29; historical, superseded 2026-11-02)
|
||||
|
||||
Superseded 2026-11-02 by "The Persona session" above: the flow paragraph below (a tool-less connector call per Persona turn, the waker ringing the unit on cadence, `mind-wake@eureka.timer`) does not describe the live system. The Persona now holds a lease and runs its own `claude` session, and each Mind is its own connector caller. Kept for the cut list.
|
||||
|
|
|
|||
|
|
@ -89,12 +89,17 @@ move, mailbox lines demoted). Six corrections:
|
|||
|
||||
## 3. Target shape
|
||||
|
||||
The core instruction is the **head of every turn line**, the Mind's **machine** is the body
|
||||
of the line, and the **question** is its tail, so the instruction acts through the state
|
||||
The core instruction is the **head of a session's first line**, the Mind's **machine** is the body
|
||||
of that line, and the **question** is its tail, so the instruction acts through the state
|
||||
rather than being replaced by it. The harness supplies the frontier (what she owns, what
|
||||
changed, what is stale, what she committed to and what happened to her runs). The model
|
||||
supplies judgement through her values. The reply begins with her answer to the question.
|
||||
|
||||
> Note (Modeling 2026-11-02, tell-delta `cut-tell-delta.h7`, Huginn 3177b33): as built, only a session's first line has this
|
||||
> shape. A later line carries the messages and the organ's notice lines of ended Self runs, nothing else (rulings
|
||||
> `tell-is-just-the-message`, `tell-delta-three-defaults`, `what-reaches-each-turn-ruled`). "Every line" in this section and in
|
||||
> cut 2 below is superseded; `docs/eureka-body-map.md` holds the live account.
|
||||
|
||||
A turn line, in order:
|
||||
|
||||
1. **The instruction** (new constant, about 700 B).
|
||||
|
|
@ -111,7 +116,7 @@ The reply gains one required field, `intent`, generated first.
|
|||
|
||||
### 3.1 Draft text (exact, for cut `turn-core-instruction`)
|
||||
|
||||
Instruction (head of every line):
|
||||
Instruction (head of a session's first line; see the note in section 3):
|
||||
|
||||
> 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
|
||||
|
|
@ -337,7 +342,7 @@ Also read rather than run: serde_json has no `preserve_order` in this workspace
|
|||
|
||||
1. **flush-shown**: a flush written alone records what it shows (spec admitted). Deploys
|
||||
with 2, not before.
|
||||
2. **turn-core-instruction**: the instruction heads every line, mailbox lines reworded, the
|
||||
2. **turn-core-instruction**: the instruction heads a session's first line (every line when written; see the section 3 note), mailbox lines reworded, the
|
||||
question tails it, `intent` first in the reply and shown back through the run closure (spec
|
||||
admitted; depends on 1).
|
||||
3. **wake-room-tail**: the recent tail of her rooms at the head of every session start and wake
|
||||
|
|
|
|||
Loading…
Reference in a new issue