Neo · rung 2 · built dark

Composition Rung 2

Rung 1 hands him everything at the right addresses before he speaks. Rung 2 lets him reach back into memory mid-thought — bounded by cost, never relevance. Built, reviewed, merged dark; reachability proven.

Awaiting its flip after wave-2 beds in

Status: spec for red-pen; build gated on Robert's word (architectural — it changes the

compose fabric wave 2 just validated, so it builds AFTER wave 2 merges, dark, as its own

increment). Rung 1 (tonight, shipped): code hands Eve everything at the right addresses,

unranked, before she speaks. Rung 2 (this spec): she can reach back into memory WHILE

composing. The ladder and this sequencing were inked at verdict-adjudication time in

eve-speech-and-map-spec-2026-07-15.md §Composition ladder.

Step-0, frame-fitness, discharged: the mechanism class is "model-driven retrieval

mid-generation." The field's default is the tool-use loop (the model calls a named tool,

the runtime executes it, the result returns, generation continues) — this is the canonical,

API-native mechanism on our stack, not an exotic choice. Strongest alternative: agentic-RAG

shapes that keep retrieval OUTSIDE generation (iterative re-query, then one final compose) —

rejected because it re-creates rung 1 with extra steps and keeps the walk out of her hands,

which is the thing ruling 2 exists to prevent. Named anti-patterns of the pick, designed

against below: (a) unbounded tool loops (cost/latency spirals) — hard call-count and time

floors; (b) relevance smuggled back in through the tool RESULTS (runtime ranking what the

tool returns) — the tools are the SAME address-narrowing machinery as rung 1, no scoring

anywhere. External judge of the frame: the field default itself plus the review pair on

this spec; the graveyard checked is wave 2's own — a scored retrieve inside a validation

instrument was refuted and descored this very night.

LAYER 1 — THE DECISION PAGE

The story

Tonight, when a teammate asks Eve something in Slack, code gathers what sits at the right

addresses — the asker's person-file, the memory map, the facts filed under the entities the

ask names — and hands her the pile before she writes. It works, and it is honest. But it is

still code deciding, once, up front, how much of her memory she gets to see.

Rung 2 gives her hands inside her own memory. Mid-thought, she can open one more entity's

file, check the map, pull the recent history of a thing — the way you'd flip to a page in

your own notebook before finishing a sentence. Code's only job is the cost meter: how many

walks, how long. What she looks at, and what matters in what she finds — hers, every step.

The beat this makes real: asked something deeper than her bounds allow, she doesn't

silently answer from half a picture — she walks until she hits the WALK BUDGET, and then

says, in her own words, that she hit it and what she'd need to go further. (Honesty fix

from review: that promise holds for the budget floor. The TIME deadline is different — if

the clock runs out mid-walk there are no composed words to send, and the compose-failure

fork governs exactly as in wave 2: silence, or the marked mechanical receipt, per Robert's

flag. The walk phase is time-boxed well inside the deadline so this stays rare.)

What I decided, in consequences

1. The tools are rung 1's own machinery, exposed. Three callable capabilities:

read-an-entity-file (by id), list-recent (by kind + time window), read-the-map. All

address-narrowing, byte-identical semantics to what feeds her today. No new retrieval

logic means no new place for relevance ranking to hide.

2. Floors, not filters. A walk budget per reply (default: 4 calls), a per-call time

bound, and the same 30-second reply deadline. Hitting a floor is DATA handed to her —

she can tell the teammate she hit it. Code never trims what a tool returns beyond the

same count caps rung 1 uses.

3. Acks don't walk. The ask-acknowledgment path (≤5s, wave-2 Lane 6) stays rung-1:

position and expectation need no memory walk. Only composed lookup replies get the loop.

4. Latency is the honest price. Each walk is a round trip. The rehearsal measures the

distribution; the bar stays "a busy teammate doesn't wonder if she heard" — if rung 2

blows it, the fix is retrieval shape or budget, never a relevance filter.

What could go wrong, named

mechanically; the rehearsal's deeper-than-bounds beat proves the floor speaks honestly.

arrive receipted or explicitly absent; the groundedness judge (now anchored on

unsupported-but-plausible, not just contradictions) grades the residue.

(the token/cost line already exists); if it runs hot, the budget is the dial — Robert's

taste, surfaced with real numbers.

Your calls

1. Direction: build rung 2 as specified (after wave 2 merges, dark behind its own

default-OFF flag). This is the "she walks, she decides" half of your map ruling.

2. The walk budget default — 4 calls per reply. Taste, not provable; ships surfaced.

3. Nothing else. Bounds-are-cost-floors is your standing ruling; the no-muzzle floors

carry unchanged.

LAYER 2 — THE MACHINERY (fenced)

while-loop is bounded overload retry, not a tool loop — review-verified) gains a tool-use

loop variant behind EVE_COMPOSE_RUNG2 default OFF: tools = read_entity_file(entityId)

(delegates to worker.readEntityFile) and read_memory_map() (delegates to

describeMemory) — TWO tools, both with exact existing rung-1 delegates. (Review M1

folded: the drafted list_recent(kind, sinceMs) maps to NO existing code path — a

builder would invent kinds/order/caps. It is CUT from this increment and named as its own

follow-up requiring a deterministic journal-query spec first.) Tool RESULTS pass through

untouched (count caps identical to rung 1's; no ordering changes; no scoring).

(EVE_SLACK_REPLY_COMPOSE_DEADLINE_MS = 30_000) ALWAYS wins. Inside it, the walk phase

is time-boxed: RUNG2_MAX_TOOL_CALLS = 4 per reply AND RUNG2_WALK_PHASE_MS = 18_000

combined, whichever bites first — reserving ≥10s for the final compose. Per-call timeout

RUNG2_TOOL_CALL_MS = 6_000. Budget/walk-box exhaustion is appended to her context as

data ({floor: "walk-budget"|"walk-time", spent}), never silently truncated; deadline

expiry routes to the wave-2 compose-failure fork (flag-governed), never a new speech path.

(the wave-2 validated path). The rung-2 loop is additive.

existing question/reply/receipts row — her walks are auditable.

the right answer needs >4 walks; PASS = she hits the floor and says so with the floor

data; a reply asserting past the floor = groundedness RED. Anchor: a transcript where the

floor was hit but the reply claims completeness MUST fail.

the loop (trust machinery) → rehearsal r3 → walk). The break test: neuter the budget

floor in scratch → the spiral fixture MUST go red.